2005-03-17 Martin Baulig <martin@ximian.com>
[mono.git] / mcs / gmcs / ChangeLog
1 2005-03-17  Martin Baulig  <martin@ximian.com>
2
3         * anonymous.cs (AnonymousMethod.EmitMethod): Changed return type
4         to bool so we can return an error condition.
5         (AnonymousDelegate.Emit): Check whether AnonymousMethod.EmitMethod()
6         returned an error.
7
8 2005-03-17  Martin Baulig  <martin@ximian.com>
9
10         * generic.cs (TypeMananager.IsIEnumerable): New public method.
11
12         * convert.cs (Convert.ImplicitReferenceConversion(Exists)): Allow
13         converting from an array-type of T to `IEnumerable<T>'.
14
15 2005-03-16  Martin Baulig  <martin@ximian.com>
16
17         * generic.cs (Nullable.Unwrap): Implement IAssignMethod.
18         (Nullable.LiftedUnaryMutator): New public class.
19
20         * expression.cs (UnaryMutator.DoResolve): Added support for
21         Nullable Types.
22
23 2005-03-14  Martin Baulig  <martin@ximian.com>
24
25         * generic.cs (Nullable.NullCoalescingOperator): Implemented.
26
27 2005-03-14  Martin Baulig  <martin@ximian.com>
28
29         * generic.cs (Nullable.LiftedBinaryOperator): Added support for
30         the comparision operators `<', `>', `<=' and `>='.
31
32 2005-03-13  Martin Baulig  <martin@ximian.com>
33
34         * generic.cs
35         (Nullable.NullLiteral): Renamed to `Nullable.NullableLiteral' to
36         avoid confusion with the `NullLiteral'.
37         (Nullable.LiftedBinaryOperator): Correctly implement `==' and '!='.
38
39 2005-03-13  Martin Baulig  <martin@ximian.com>
40
41         * expression.cs (Binary.ResolveOperator): For `==' and `!=', allow
42         comparing arbitrary types with the null literal.
43
44 2005-03-13  Martin Baulig  <martin@ximian.com>
45
46         * generic.cs (Nullable.LiftedBinaryOperator): Add support for the
47         boolean operators '&&', '||', '&' and '|'.
48         (Nullable.OperatorTrueOrFalse): New public class.
49
50         * ecore.cs (Expression.GetOperatorTrue/False): Return an `Expression'
51         instead of a `StaticCallExpr'; added support for nullables.
52
53 2005-03-10  Martin Baulig  <martin@ximian.com>
54
55         * expression.cs
56         (ArrayAccess.EmitDynamicInitializers): Use `etype.IsValueType'
57         rather than `etype.IsSubclassOf (TypeManager.value_type)'.      
58
59 2005-03-07  Martin Baulig  <martin@ximian.com>
60
61         * generic.cs (Nullable.Unwrap): Implement IMemoryLocation and make
62         it work if `expr' is not an IMemoryLocation.
63         (Nullable.Lifted): Implement IMemoryLocation.
64         (Nullable.LiftedConversion.ResolveUnderlying): Use the correct
65         target type.
66
67 2005-03-05  Martin Baulig  <martin@ximian.com>
68
69         * generic.cs (Nullable.Unwrap, Wrap): New protected classes.
70         (Nullable.Lifted): New abstract class; rewrote the lifted conversions.
71         (Nullable): Added support for lifted unary and binary operators.
72
73         * expression.cs (Unary.DoResolve): Added support for nullable types.
74         (Binary.DoResolve): Likewise.
75         (Conditional.DoResolve): Likewise.
76
77 2005-03-02  Martin Baulig  <martin@ximian.com>
78
79         * decl.cs (DeclSpace.SetParameterInfo): Make this virtual.
80
81         * class.cs (ClassPart.SetParameterInfo): Override this.
82         (PartialContainer.SetParameterInfo): Override this.
83         (TypeContainer.CheckConstraints): New protected method.
84         (PartialContainer.CheckConstraints): Override this and check
85         whether the same contraints were specified in all parts of a
86         partial generic type definition.
87         (PartialContainer.UpdateConstraints): New public method.
88
89         * generic.cs (TypeParameter.UpdateConstraints): New public method.
90
91 2005-03-02  Martin Baulig  <martin@ximian.com>
92
93         Committing a patch from Carlos Alberto Cortez to fix #72887.
94
95         * convert.cs (Convert.ExplicitReferenceConversionExists): Allow
96         casts from `T []' to `int []'.
97
98 2005-03-02  Martin Baulig  <martin@ximian.com>
99
100         * generic.cs (TypeManager.IsEqual): Make this symmetric.
101
102         * expression.cs (Binary.ResolveOperator): When resolving a
103         BinaryDelegate, use `TypeManager.IsEqual (l, r)' rather than just
104         `=='.  Fixes #71866.  See gen-127.cs.
105
106 2005-03-02  Martin Baulig  <martin@ximian.com>
107
108         * class.cs (TypeContainer.DoDefineMembers): We also need a default
109         static constructor in static classes.
110
111 2005-03-02  Martin Baulig  <martin@ximian.com>
112
113         * generic.cs
114         (NullableType.Name, NullableType.FullName): Add a "?" to the name.
115         (Nullable.LiftedConversion): Added support for user-defined
116         conversions.
117
118         * cs-tokenizer.cs (Tokenizer.PutbackCloseParens): New public method.
119
120         * cs-parser.jay: Use ComposedCast everywhere instead of
121         NullableType, so we don't need to check for NullableType
122         everywhere.
123         (conditional_expression): Added `INTERR CLOSE_PARENS' rule for the
124         case where we'll be resolved into a `parenthesized_expression_0'
125         afterwards.
126
127         * convert.cs
128         (Convert.UserDefinedConversion): Added nullable conversions.
129
130 2005-02-28  Martin Baulig  <martin@ximian.com>
131
132         * generic.cs (TypeManager.IsNullableType): New static method.
133         (Nullable): New abstract class.
134         (Nullable.NullLiteral): New public class.
135         (Nullable.LiftedConversion): New public class.
136
137         * cs-parser.jay (non_expression_type): Changed `builtin_types' to
138         `builtin_types opt_nullable'.
139
140         * convert.cs
141         (Convert.ImplicitConversionStandard): Added nullable conversions.
142         (Convert.ExplicitConversionStandard): Likewise.
143         (Convert.ExplicitConversion): Likewise.
144
145 2005-02-26  Martin Baulig  <martin@ximian.com>
146
147         * expression.cs (ComposedCast.DoResolveAsTypeStep): Allow `dim' to
148         begin with a "?", for instance "?[]".  Don't do a type lookup if
149         `dim' is empty.
150
151 2005-02-25  Martin Baulig  <martin@ximian.com>
152
153         The first part of Nullable Types :-)
154
155         * generic.cs (NullableType): New public class.
156         (NullCoalescingOperator): New public class.
157         (TypeArguments.Resolve): Add a CS0306 check.
158
159         * cs-parser.jay (opt_error_modifier): Removed, this was unused.
160         (opt_nullable): New rule.
161         (type): Added `opt_nullable' to `namespace_or_type_name',
162         `builtin_types' and `pointer_type'.
163         (array_type): Added `opt_nullable'.
164         (opt_rank_specifier_or_nullable): New rule; this is the
165         combination of `opt_rank_specifier' and `opt_nullable'.
166         (opt_error): New rule; catch errors here.
167         (nullable_type_or_conditional): New rule; we use this to check for
168         nullable and still detect the conditional operator.
169         (local_variable_type): Use `opt_rank_specifier_or_nullable'
170         instead `opt_rank_specifier'.
171
172         * expression.cs (ComposedCast.DoResolveAsTypeStep): Added support
173         for nullables.
174
175 2005-02-24  Martin Baulig  <martin@ximian.com>
176
177         * README, README.Changes: Removed; they're old and obsolete.
178
179 2005-02-22  Martin Baulig  <martin@ximian.com>
180
181         * generic.cs (TypeParameter.Resolve): If resolving the constraints
182         returned an error, set `constraints' to null to avoid a crash
183         later on.
184         (TypeParameter.ResolveType): Likewise.
185
186 2005-02-22  Martin Baulig  <martin@ximian.com>
187
188         * generic.cs
189         (Constraints.ResolveTypes): Protect against being called twice.
190         (Constraints.CheckInterfaceMethod): Don't call ResolveTypes().
191         (TypeParameter.ResolveType): New public method; calls
192         constraints.ResolveTypes().
193         (TypeParameter.DefineType): Moved constraints.ResolveType() out
194         into the new ResolveType().
195         (GenericMethod.Define): Call ResolveType() on all our
196         TypeParameter's.        
197
198 2005-02-21  Martin Baulig  <martin@ximian.com>
199
200         * generic.cs
201         (TypeManager.generic_nullable_type): New static public field.
202         (TypeManager.InitGenericCoreType): Lookup "System.Nullable`1".
203
204         * rootcontext.cs
205         (RootContext.ResolveCore): Resolve "System.Nullable`1".
206
207 2005-02-15  Martin Baulig  <martin@ximian.com>
208
209         * generic.cs (ConstructedType.Constraints): Correctly check
210         constraints if the argument type is a type parameter; fixes
211         #72326. 
212
213 2005-02-02  Martin Baulig  <martin@ximian.com>
214
215         * delegate.cs (Delegate.DefineType): Report an internal error if
216         TypeManager.multicast_delegate_type is null.  See bug #72015 for
217         details.        
218
219 2005-01-29  Miguel de Icaza  <miguel@novell.com>
220
221         * pending.cs: Produce better code (no nops produced by using Ldarg
222         + value).
223         
224         * pending.cs (PendingImplementation.DefineProxy): It was not `arg
225         i - 1' it should be arg + 1.
226
227         Fixes bug #71819.
228         
229 2005-01-26  Martin Baulig  <martin@ximian.com>
230
231         * cs-parser.jay (indexer_declarator): Don't report an error if we
232         have type parameters since we can be an explicit interface
233         implementation; fixes #71449.
234
235 2005-01-26  Martin Baulig  <martin@ximian.com>
236
237         * class.cs (TypeContainer.AttributeTargets): Return the correct
238         AttributeTargets depending on our `Kind' instead of throwing an
239         exception; fixes #71632.
240
241 2005-01-26  Martin Baulig  <martin@ximian.com>
242
243         * delegate.cs (Delegate.DefineType): Correctly define our type
244         parameters.  Fixes #71483.
245
246 2005-01-25  Raja R Harinath  <rharinath@novell.com>
247
248         Fix #71602.
249         * expression.cs (MemberAccess.DoResolve): Don't complain with
250         cs0572 when the LHS of a member access has identical name and type
251         name.
252
253 2005-01-25  Marek Safar  <marek.safar@seznam.cz>
254
255         Fix #71651, #71675
256         * attribute.cs (ExtractSecurityPermissionSet): Catch exceptions from
257         CreatePermission.
258         Create custom PermissionSet only for PermissionSetAttribute.
259
260 2005-01-24  Marek Safar  <marek.safar@seznam.cz>
261
262         Fix #71649
263         * class.cs (StaticClass.DefineContainerMembers): Enable enums and
264         delegates in static class.
265
266 2005-01-24  Martin Baulig  <martin@ximian.com>
267
268         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
269         merging an implicit block, just use its reachability.
270
271         * statement.cs (Block.Resolve): Make the unreachable code check
272         work wrt. implicit blocks; see test-337 from #63842.
273
274 2005-01-21  Alp Toker  <alp@atoker.com>
275  
276         * cs-parser.jay: destructor_declaration's container is PartialContainer
277         not Class when partial types are used, so use Kind prop instead of
278         'is'.
279         
280 2005-01-22  Miguel de Icaza  <miguel@ximian.com>
281
282         * cs-parser.jay: Improve error reporting when an interface
283         declares new types.
284
285 2005-01-20  Dick Porter  <dick@ximian.com>
286
287         * support.cs: SeekableStreamReader fix from Sandor Dobos
288         (dobos_s@ibcnet.hu) to cope with Position setting when multibyte
289         chars are read.  Fixes bug 70369.
290
291 2005-01-20  Raja R Harinath  <rharinath@novell.com>
292
293         * cs-parser.jay (catch_clause): Simplify current_block handling
294         somewhat.
295
296 2005-01-17  Miguel de Icaza  <miguel@ximian.com>
297
298         * convert.cs (ImplicitStandardConversionExists): Synchronize the
299         code with ImplicitStandardConversion to handle the implicit
300         conversion of method groups into valid delegate invocations. 
301
302         The problem is that in parameter handling we were using this code
303         path.  Fixes bug #64698
304
305 2005-01-19  Raja R Harinath  <rharinath@novell.com>
306
307         * cs-parser.jay: Fix several infelicities.
308         - Avoid assigning to the parser value stack.  Code like 
309           '$3 = null' is unclean.  Synthesize a value for the code block
310           instead. 
311         - Avoid using oob_stack for storing location information.  Use ...
312         (_mark_): ... this.  New (empty) rule.  Saves the current location
313         in $$.
314         (foreach_statement): Avoid using oob_stack for current_block
315         handling.  Use technique used in for_statement and
316         using_statement.  Synthesize a value for the code block to store
317         additional intermediate information.
318
319 2005-01-13  Miguel de Icaza  <miguel@ximian.com>
320
321         * ecore.cs (IsAccessorAccessible): Accessibility to private fields
322         of a different type is only allowed to private fields of a
323         containing type, not on fields of a base class.
324
325         See test-174.cs and error cs0122-9.cs
326
327 2005-01-13  Raja R Harinath  <rharinath@novell.com>
328
329         Fix test-335.cs (bug #58126).
330         * cs-parser.jay (argument): Split out non-expression parts of the
331         rule into 'non_simple_argument'.
332         (invocation_expression): Support parenthesized invocations with
333         multiple arguments, and with single non-simple arguments.
334
335 2005-01-13  Raja R Harinath  <rharinath@novell.com>
336
337         * cs-tokenizer.cs (xtoken): Reset 'comments_seen' in a couple more
338         places.
339
340 2005-01-12  Raja R Harinath  <rharinath@novell.com>
341
342         Fix cs0038-1.cs, cs1640-6.cs.
343         * ecore.cs (Expression.Resolve): Remove special-case for
344         SimpleName in error-handling.
345         (Expression.almostMatchedMembers): Relax access permission to
346         protected.
347         (Expression.MemberLookupFailed): Handle duplicates in
348         almostMatchedMembers list.
349         (SimpleName.DoSimpleNameResolve): Catch CS0038 errors earlier.
350         * expression.cs (New.DoResolve): Report CS1540 for more cases.
351         * typemanager.cs (GetFullNameSignature): Use the MethodBase
352         overload if the passed in MemberInfo is a MethodBase.
353
354 2005-01-25  Martin Baulig  <martin@ximian.com>
355
356         * doc.cs
357         (DocUtil.emptyParamList): Removed; use `Type.EmptyTypes' instead.
358
359 2005-01-12  Marek Safar  <marek.safar@seznam.cz>
360
361         Fix #70749
362         * attribute.cs (ExtractSecurityPermissionSet): Don't report error
363         for non-CAS & merge permission sets properly.
364
365 2005-01-11  Raja R Harinath  <rharinath@novell.com>
366
367         Improve standard-compliance of simple name and member access 
368         resolution.  Fixes bugs #52697, #57200, #67520, #69519.
369         * ecore.cs (FullNamedExpression): New abstract base class 
370         for Namespaces and TypeExpressions.
371         (ResolveFlags.SimpleName): Remove.
372         (SimpleName): Remove support for dotted names.
373         (SimpleName.ResolveAsTypeStep): Simplify.  Now just a wrapper to 
374         DeclSpace.FindType and DeclSpace.LookupType.
375         (SimpleName.DoSimpleNameResolve): Remove support for dotted names.
376         (Expression.ExprClassName): Make member function.
377         * expression.cs (MemberAccess.ResolveAsTypeStep): Support LHS being
378         a namespace.  Remove creation of dotted "SimpleName"s.
379         (MemberAccess.DoResolve): Likewise.
380         * decl.cs (DeclSpace.Cache): Make private.
381         (DeclSpace.LookupInterfaceOrClass): Return a FullNamedExpression.
382         (DeclSpace.FindType): Update.
383         (DeclSpace.LookupType): Move here from RootContext.  Return a 
384         FullNamedExpression.
385         * namespace.cs (Namespace): Derive from FullNamedExpression
386         so that it can be part of expression resolution.
387         (Namespace.Lookup): Return an FullNamedExpression.
388         (NamespaceEntry.LookupAlias): Lookup aliases only in current
389         namespace.
390         * rootcontext.cs (NamespaceLookup): Remove.
391         (LookupType): Move to DeclSpace.
392         * attribute.cs (CheckAttributeType): Update.
393         * doc.cs (FindDocumentedType): Remove allowAlias argument.
394         (FindDocumentedTypeNonArray): Likewise.
395
396 2005-01-11  Raja R Harinath  <rharinath@novell.com>
397
398         Fix cs0509.cs, cs1632.cs.
399         * class.cs (TypeContainer.GetNormalBases): Don't assume !IsClass
400         is the same as IsInterface.
401         (TypeContainer.GetClassBases): Likewise.
402         * statement.cs (LabeledStatement.ig): New field.
403         (LabeledStatement.LabelTarget): Save ILGenerator which created the
404         label.
405         (LabeledStatement.DoEmit): Check that the label was created with
406         the same ILGenerator.
407
408 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
409
410         Fix #71058
411         * attribute.cs (GetMethodObsoleteAttribute): Need to transform
412         accessors to its properties.
413
414         * ecore.cs (PropertyExpr): Add AccessorTable to help track back
415         from accessors to property.
416         
417 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
418
419         Fix #70722
420         * class.cs (MethodCore.CheckBase): Test base method obsoleteness
421         only for overrides.
422         
423 2005-01-08  Miguel de Icaza  <miguel@ximian.com>
424
425         * attribute.cs: Check for null and empty strings.  
426
427         I have lost another battle to Paolo.
428
429 2005-01-07  Marek Safar  <marek.safar@seznam.cz>
430
431         Fix #70942
432         * class.cs (PropertyMethod): Set Parent field in ctors.
433         (SetMethod.InternalParameters): Add unsafe switch hack.
434         Override MarkForDuplicationCheck where it is appropriate.
435
436         * decl.cs (MemberCore.MarkForDuplicationCheck): New method.
437         It says whether container allows members with the same name.
438         Base default is no.
439         (DeclSpace.AddToContainer): Use MarkForDuplicationCheck.
440         Removed is_method parameter.
441
442 2005-01-06  Duncan Mak  <duncan@ximian.com>
443
444         * cs-tokenizer.cs (xtoken): Redo the work for signaling CS1040
445         because the previous change led to incorrect reporting of CS1032
446         ("Cannot define/undefine preprocessor symbols after first token in
447         file"). Instead of using `tokens_seen' as the only flag that
448         triggers CS1040, introduce `comments_seen'. This new flag is used
449         to signify having seen comments on the current line, so it is
450         unset after a newline.
451
452 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
453
454         * doc.cs : When searching for a type, find nested type too.
455           This fixes bug #71040.
456
457 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
458
459         * doc.cs :
460           - Warn missing member comment on those classes which also does not
461             have doc comments. Fixed bug #71041.
462           - Don't warn missing doc comment on default constructor.
463             Fixed bug #71042.
464
465 2005-01-06  Duncan Mak  <duncan@ximian.com>
466
467         * cs-tokenizer.cs (xtoken): After handling traditional C-style
468         comments, set `tokens_seen' to true. This allows us to detect
469         misplaced preprocessor directives (i.e. not at the beginning of
470         the a line, nor after whitespaces). In that case, report error
471         CS1040. This fixes bug #56460.
472
473         * cs-parser.jay (interface_member_declaration): Add checks for
474         IsExplicitImpl, and report CS0541 error if an interface member is
475         defined as an explicit interface declaration.
476
477 2005-01-06  Marek Safar  <marek.safar@seznam.cz>
478
479         Fix #70817
480         * class.cs (PropertyMethod): Set Parent field in ctors.
481         (SetMethod.InternalParameters): Add unsafe switch hack.
482         
483         * decl.cs (MemberCore.Parent): Cannot be readonly.
484
485 2005-01-06  Raja R Harinath  <rharinath@novell.com>
486
487         * decl.cs (DeclSpace.ResolveType): Remove.
488         (DeclSpace.ResolveBaseTypeExpr): Rename from ResolveTypeExpr.
489         Merge in code from ...
490         (DeclSpace.GetTypeResolvingEmitContext): ... here.  Remove.
491         * class.cs, enum.cs: Update to changes.
492
493 2005-01-06  Miguel de Icaza  <miguel@ximian.com>
494
495         * anonymous.cs: Ensure that we init the scope of our parent if it
496         has not been initialized yet.
497
498 2004-12-30  Duncan Mak  <duncan@ximian.com>
499
500         * typemanager.cs (TypeManager.CheckStructCycles): Don't crash here
501         if field.FieldBuilder is null. Fixes #70758.
502
503         * convert.cs: Fixed some typos and updated some of the comments.
504         (ImplicitStandardConversionExists):
505         (TryImplicitIntConversion): If `target_type' is an interface and
506         the type of `ic' implements this interface, return true or a new
507         BoxedCast instead of null. This fixes #70468.
508
509 2004-12-29  Duncan Mak  <duncan@ximian.com>
510
511         * expression.cs (Argument.Emit): Check that Expr is
512         IMemoryLocation before casting to it, and report CS1510 otherwise.
513
514         This fixes #70402.
515
516 2004-12-21  Ben Maurer  <bmaurer@ximian.com>
517
518         * statement.cs (Block.ThisVariable): remove the recursion here, to
519         make the --profile more sane.
520
521 2004-12-17  Carlos Cortez <calberto.cortez@gmail.com>
522
523         * driver.cs: Patch to handle a xsp bug that prevents to reference an .exe
524         assembly, by JB Evain.
525
526 2004-12-17  Raja R Harinath  <rharinath@novell.com>
527
528         * class.cs, decl.cs, ecore.cs, iterators.cs, pending.cs, 
529           rootcontext.cs, typemanager.cs: Make nomenclature consistent.
530         "parent" refers to enclosing type/class.  "base" refers to superclass.
531
532 2004-12-17  Raja R Harinath  <rharinath@novell.com>
533
534         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
535         Ensure that we only have GlobalAttributes.
536         * attribute.cs (Attribute.Emit): Make non-virtual.
537         (GlobalAttribute.Emit): Remove.
538         (Attribute.Resolve): Make virtual.
539         (GlobalAttribute.Resolve): New.  Set Rootcontext.Tree.Types.NamespaceEntry.
540         (Attribute.GetConditionalAttributeValue): Take an EmitContext as
541         the argument. Don't create one.
542         (Attribute.GetObsoleteAttribute): Likewise.
543         (Attribute.GetClsCompliantAttributeValue): Likewise.
544         * class.cs, decl.cs: Update to changes.
545
546 2004-12-17  Marek Safar  <marek.safar@seznam.cz>
547
548         * delegate.cs (NewDelegate.DoResolve): Add error 149 report.
549         
550         * ecore.cs (Expression.MemberLookupFailed): Fixed error 143.
551         
552         * statement.cs (Foreach.Resolve): Add error 186 report.
553
554 2004-12-16  Marek Safar  <marek.safar@seznam.cz>
555
556         * expression.cs (Conditional.DoResolve): Add warning 429.
557         
558         * statement.cs (If.Resolve): Add warning 665.
559
560 2004-12-16  Raja R Harinath  <rharinath@novell.com>
561
562         New invariant: RootContext.Tree.Types.NamespaceEntry == null
563         except when in the parser, and in GlobalAttribute.
564         * driver.cs (MainDriver): Reset RootContext.Tree.Types.NamespaceEntry.
565         * attribute.cs (GlobalAttribute.CheckAttributeType): Reset
566         RootContext.Tree.Types.NamespaceEntry once work is done.
567         (GlobalAttribute.Emit): New.  Wrapper for Attribute.Emit, but sets
568         and resets RootContext.Tree.Types.NamespaceEntry.
569
570 2004-12-15  Marek Safar  <marek.safar@seznam.cz>
571
572         * cs-parser.jay: Don't create a block for every variable.
573
574 2004-12-14  Miguel de Icaza  <miguel@ximian.com>
575
576         * location.cs: Provide extra information.
577
578         * statement.cs: The instance is not `ldarg_0.THIS' when accessing
579         variables from the captured environment, it is the ldarg_0.
580
581 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
582
583         * cs-parser.jay: Changed warning level for 642 to 4 until Miguel
584         find a conclusion.
585         
586         * class.cs: Changed warning level for 169 to avoid developer
587         displeasure from warning flooding. It will be changed back when they
588         fix most of current BCL warnings.
589         
590         * RootContext.cs: Pushed default WarningLevel to 3.
591         
592         * statement.cs: Removed unused variable.
593
594 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
595
596         * class.cs (TypeContainer.GetClassBases): Add error 1521 report.
597         (TypeContainer.MethodModifiersValid): Refactored to use MemberCore.
598         Add error 502 report.
599         (StaticClass.DefineType): Add error 441 report.
600         (Class.AllowedModifiersProp): New virtual property as temporary
601         extension to AllowedModifiers.
602         (Class.DefineType): Add error 418 report. Moved ModFlags check here
603         to share implementation with StaticClass and don't call virtual
604         methods from ctor.
605         
606         * driver.cs (MainDriver): Add error 1558 test.
607
608         * parameter.cs (Parameter.ApplyAttributeBuilder): Add error 662
609         report. Moved error 36 test here.
610
611         * statement.cs (Throw.Resolve): Add error 724 report.
612
613         * typemanager.cs: Add out_attribute_type core type.
614         
615 2004-12-13  Marek Safar  <marek.safar@seznam.cz>
616
617         * class.cs (TypeContainer.VerifyClsCompliance): Add error
618         3018 report.
619         (PropertyBase.VerifyClsCompliance): Add errror 3025 report.
620
621         * codegen.cs (ModuleClass.ApplyAttributeBuilder): Add error
622         3017 report.
623         
624         * decl.cs (MemberCore.VerifyClsCompliance): Add warning 3021.
625
626         * parameter.cs (ReturnParameter.ApplyAttributeBuilder): 
627         Add error 3023 report.
628         (Parameter.ApplyAttributeBuilder): Add error 3022 report.
629
630         * tree.cs (RootTypes.IsClsCompliaceRequired): Add fake
631         implementation.
632
633 2004-12-12  John Luke  <john.luke@gmail.com>
634
635         * driver.cs (AddArgs): take -- into account when
636         adding arguments, fixes bug 65710 
637
638 2004-12-12  Martin Baulig  <martin@ximian.com>
639
640         * expression.cs (Unary.TryReduceNegative): Added support for
641         SByteConstant and ByteConstant.
642         (Unary.Reduce): Check error values from TryReduceNegative().
643
644 2004-12-10  Marek Safar  <marek.safar@seznam.cz>
645
646         * attributes.cs (Attribute.Resolve): Avoid multiple error report
647         and report exception as error 182.
648
649 2004-12-10  Raja R Harinath  <rharinath@novell.com>
650
651         * driver.cs (Main): Fix message when there are warnings.
652
653 2004-12-09  Miguel de Icaza  <miguel@ximian.com>
654
655         * delegate.cs: Fixed my fix from yesterday, sorry about that.
656
657 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
658
659         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
660         Reduced number of warnings.
661         
662         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
663
664 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
665
666         * driver.cs: Removed message.
667
668         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
669
670 2004-12-08    <vargaz@freemail.hu>
671
672         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
673
674 2004-12-08  Martin Baulig  <martin@ximian.com>
675
676         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
677         instead of a CS3002 for properties and indexer.
678
679 2004-12-08  Martin Baulig  <martin@ximian.com>
680
681         * decl.cs (MemberName.ToString): Make this work again.
682
683 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
684
685         * attribute.cs (Resolve): Add error 591 detection.
686
687         * class.cs (FieldMember.Define): Add error 1547 detection.
688         (Indexer.Define): Add error 620 detection.
689         (Operator.Define): Add error 590 detection.
690
691         * ecore.cs: Missing argument for error 79.
692
693         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
694         detection.
695
696 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
697
698         Fix #70106
699         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
700         only.
701
702 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
703
704         * cs-parser.jay : handle doc comments on implicit/explicit operators.
705           Some operator comments were suppressed.
706         * doc.cs : Implicit/explicit operator name in doc comments are like
707           "op_Explicit(type)~returnType", so added suffix handling.
708
709 2005-01-21  Alp Toker  <alp@atoker.com>
710
711         * cs-parser.jay: destructor_declaration's container is PartialContainer
712         not Class when partial types are used, so use Kind prop instead of 'is'.
713
714 2004-12-12  Martin Baulig  <martin@ximian.com>
715
716         * expression.cs (Unary.TryReduceNegative): Added support for
717         SByteConstant and ByteConstant.
718         (Unary.Reduce): Check error values from TryReduceNegative().
719
720 2004-12-11  Martin Baulig  <martin@ximian.com>
721
722         * support.cs (ReflectionParameters.ParameterName): If we have a
723         `gpd', call `ParameterName' on it.
724
725         * parameter.cs (Parameter.GetParameterAttributes): New static method.
726
727         * pending.cs (PendingImplementation.DefineProxy): Call
728         DefineParameter() for all of the MethodBuilder's arguments.
729
730 2004-12-09  Martin Baulig  <martin@ximian.com>
731
732         * doc.cs (DocUtil): Make this a static class.
733
734 2004-12-09  Martin Baulig  <martin@ximian.com>
735
736         * expression.cs (Invocation.InferType): Moved the type inference
737         implementation into TypeManager.
738
739         * generics.cs (TypeManager): Moved the type inference
740         implementation here.
741
742 2004-12-09  Martin Baulig  <martin@ximian.com>
743
744         * typemanager.cs (TypeManager): Make this a partial class.
745
746         * generics.cs
747         (TypeManager): Move the generics part of `TypeManager' here.
748
749 2004-12-08  Martin Baulig  <martin@ximian.com>
750
751         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
752         instead of a CS3002 for properties and indexer.  Added CS3024
753         check for generic interfaces.
754
755         * attributes.cs (AttributeTester.AnalyzeTypeCompliance): Generic
756         instances are not CLS-compliant.
757
758 2004-12-08  Martin Baulig  <martin@ximian.com>
759
760         * cs-parser.jay
761         (void_pointer_expression): New rule for `void*', `void**' etc.
762         (typeof_expression): Add `void_pointer_expression'; fixes #66846.       
763
764 2004-12-08  Martin Baulig  <martin@ximian.com>
765
766         * expression.cs (Invocation.InferType): Removed the hack for
767         MethodCore.MayUnify().  
768
769         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Make
770         this actually work.
771
772         * class.cs (MethodCore.MayUnify): Use
773         TypeManager.MayBecomeEqualGenericTypes().       
774
775 2004-12-08  Martin Baulig  <martin@ximian.com>
776
777         * expression.cs (Is.DoResolve, As.DoResolve): If we're a type
778         parameter, box it.  Fixes #69233.
779
780 2004-12-08  Martin Baulig  <martin@ximian.com>
781
782         * generic.cs (ConstructedType.CheckConstraints): Valuetypes always
783         have the ctor constraint.  Fixes #68326.
784
785 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
786
787         * cs-parser.jay : interface comment was not consumed because of
788           extra opt_semicolon before doc handling.
789
790 2004-12-03  Raja R Harinath  <rharinath@novell.com>
791
792         Fix test-327.cs, test-328.cs, and put in early infrastructure
793         for eventually fixing #52697.
794         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
795         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
796         from other methods.
797         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
798         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
799         (VerifyUsing, error246): Update.
800         * rootcontext.cs (RootContext.NamespaceLookup): Just use
801         'NamespaceEntry.LookupNamespaceOrType'.
802
803 2004-12-07  Martin Baulig  <martin@ximian.com>
804
805         * driver.cs: Call it "BETA SOFTWARE" :-)
806
807 2004-12-06  Raja R Harinath  <rharinath@novell.com>
808
809         Fix crash on cs0657-17.cs.
810         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
811         Use RootContext.Tree.Types, not 'new RootTypes ()'.
812         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
813         the case where the NamespaceEntry gets overwritten.
814
815 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
816
817         Fixed #69195, #56821
818         * ecore.cs (ResolveBoolean): Tiny refactoring.
819
820         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
821         of right expression resolving when left is false constant and
822         operator is LogicalAnd OR true constant and operator is LogicalOr.
823
824         * statement.cs (ResolveUnreachable): Always reports warning.
825
826 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
827
828         * class.cs: Distinguish between 1721 and 1722 (just a little help
829         for the programmer).
830
831 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
832
833         * delegate.cs: Only allow this on new versions of the language. 
834
835 2004-12-02  Duncan Mak  <duncan@ximian.com>
836
837         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
838         Expression class.
839         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
840         here as a static method. Take an additional bool out parameter
841         `must_do_cs1540_check' for signaling to InstanceResolve.
842         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
843         member field from PropertyExpr class and made it an argument of
844         the method instead.
845         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
846         check for MarshalByRefObject, and report CS0122 instead of CS1540.
847         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
848         and `remove_accessor' as well as InstanceResolve: report CS0122
849         where applicable.
850
851         Fixes #70129.
852
853 2004-12-07  Martin Baulig  <martin@ximian.com>
854
855         * decl.cs (DeclSpace.AddToContainer): Report correct errors CS0694
856         and CS0692 where appropriate.
857
858 2004-12-06  Martin Baulig  <martin@ximian.com>
859
860         * class.cs (MethodCore.MayUnify): Moved the CS0408 check here from
861         IsDuplicateImplementation() and improved it.
862
863         * expression.cs (Invocation.InferTypeArguments): Added
864         `Type[] inferred_class_types' argument (for MethodCore.MayUnify)
865         and removed the "ref" modifier from `infered_types'.
866
867         * decl.cs (MemberName.ToString): Removed the exception.
868
869 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
870
871         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
872           comments are allowed.
873
874 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
875
876         * delegate.cs: Add checks for subtypes in paramaters and return values
877         in VerifyMethod () to add support for Covariance/Contravariance
878         in delegates.
879         
880 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
881
882         * report.cs: Remove extra closing parenthesis.
883
884         * convert.cs (Error_CannotImplicitConversion): If the name of the
885         types are the same, provide some extra information.
886
887 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
888
889         Fix bug #70102
890         * attribute.cs (Resolve): Improved implementation of params
891         attribute arguments.
892
893         * support.cs (ParameterData): Add HasParams to be faster.
894
895 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
896
897         all things are for /doc support:
898
899         * doc.cs: new file that supports XML documentation generation.
900         * mcs.exe.sources: added doc.cs.
901         * driver.cs:
902           Handle /doc command line option.
903           Report error 2006 instead of 5 for missing file name for /doc.
904           Generate XML documentation when required, after type resolution.
905         * cs-tokenizer.cs:
906           Added support for picking up documentation (/// and /** ... */),
907           including a new XmlCommentState enumeration.
908         * cs-parser.jay:
909           Added lines to fill Documentation element for field, constant,
910           property, indexer, method, constructor, destructor, operator, event
911           and class, struct, interface, delegate, enum.
912           Added lines to warn incorrect comment.
913         * rootcontext.cs :
914           Added Documentation field (passed only when /doc was specified).
915         * decl.cs:
916           Added DocComment, DocCommentHeader, GenerateDocComment() and
917           OnGenerateDocComment() and some supporting private members for
918           /doc feature to MemberCore.
919         * class.cs:
920           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
921         * delegate.cs:
922           Added overriden DocCommentHeader.
923         * enum.cs:
924           Added overriden DocCommentHeader and GenerateDocComment().
925
926 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
927
928         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
929         unwrapping the enumeration values, chain to
930         DoConstantNumericPromotions again, so we can promote things to the
931         fundamental types (takes care of enums that are bytes, sbytes).
932
933         Fixes bug #62054.
934
935 2004-12-01  Raja R Harinath  <rharinath@novell.com>
936
937         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
938         Fix long-standing bug in type-lookup.  Use FindType instead of
939         LookupType when ec.ResolvingTypeTree.
940         (Attribute.ResolveType, Attribute.Resolve)
941         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
942         Update to changes.
943         (Attributes.Search): Remove internal version.  Update.
944         (Attributes.SearchMulti): Update.
945         (Attributes.GetClsCompliantAttribute): Remove.
946         (Attributes.GetIndexerNameAttribute): Remove.
947         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
948         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
949         * class.cs (Indexer.Define): Likewise.
950
951 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
952
953         Fix bug #68790
954         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
955         MarshallByReference members access.
956
957         * expression.cs: Use CheckMarshallByRefAccess;
958         Better error CS0197 message.
959
960         * report.cs: Print whole related error message.
961
962 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
963
964         * class (GetClassBases): Better error 60 report.
965         (EventProperty): Disabled warning 67 detection.
966
967 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
968
969         Fix bug #60324
970         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
971
972         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
973         precise values.
974
975 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
976
977         Fix bug #49488
978         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
979
980         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
981
982 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
983
984         * attribute.cs (Attribute.Resolve): Refine error reporting and
985         report a cs0117 if the identifier does not exist, to distinguish
986         from 0617 which is a miss-use of the actual identifier.
987
988         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
989         between cs0070 and cs0079.
990
991         * class.cs (MemberBase.DoDefine): When reporting a wrong
992         accessibility level, we use MethodCore to compare instead of
993         Method (this was a regression in some refactoring effort).
994
995         So now we correctly report cs0056 again.
996
997         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
998         testing the target_type (which was known to be object_type) and
999         not the source type (which is anonymous_method).
1000
1001         Fixed reporting of error cs1660.
1002
1003         * expression.cs (UserCast.Source): Expose the underlying cast.
1004
1005         * statement.cs (Switch.SwitchGoverningType): Sort the list of
1006         allowed types to find a match to int32 first (most common).
1007
1008         In addition, it ignores any ImplicitUserConversions that did an
1009         internal implicit conversion (as the switch statement allows only
1010         one integral conversion to exist).
1011
1012         * class.cs (PartialContainer.Create): rename `name' to
1013         `member_name' for clarity.  Then replace the string calls with a
1014         call to MemberName.GetPartialName, as now using
1015         MemberName.ToString is an error (this is due to the side effects
1016         it had, that were fixed in the past).
1017
1018         This will restore the error reporting on a number of partial class
1019         errors that were missusing this (and getting an exception as a
1020         results, which is now just a plain textual warning, because
1021         yyparse debug output would crash otherwise).
1022
1023 2004-11-26  Raja R Harinath  <rharinath@novell.com>
1024
1025         * Makefile (PROGRAM_INSTALL_DIR): Remove.
1026
1027 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
1028
1029         * rootcontext.cs (LookupType): Make sure to cache lookups that
1030         don't give us a negative result. This saves about 5% of corlib
1031         compilation time.
1032
1033 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
1034
1035         * report.cs (AbstractMessage.Print): messages are sent to stderr
1036
1037         * class.cs (TypeContainer.GetClassBases): It is an error to have a
1038         non-interface in the list of interfaces (at this point, either
1039         parent was properly set, or a base class is being listed in the
1040         interfaces section).
1041
1042         This flags error 1722, and resolves the crash from bug 69259.
1043
1044 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
1045
1046         * statement.cs (Using.EmitExpressionFinally): make this work right
1047         for valuetypes. Fixes 69926.
1048
1049 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
1050
1051         * const.cs (Const.ChangeType): Cope with the "0 literal can be
1052         converted to an enum" here, before we try to change the underlying
1053         type.  This code exists, but it is a different code path than the
1054         one used while encoding constants.
1055
1056         (ImplicitReferenceConversionExists): In addition, resynchronized
1057         the code here, so it matches the same code in
1058         ImplicitReferenceConversionExists for the `from any class-type S
1059         to any interface-type T'.       
1060
1061 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
1062
1063         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
1064
1065 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
1066
1067         * cs-parser.jay: Use verbosity accordingly. 
1068
1069 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
1070
1071         * expression.cs (Unary.ResolveOperator): Do not report warning;
1072         AddressOf reads from variable.
1073         
1074         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
1075
1076 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
1077
1078         Fix bug #69462
1079
1080         * attribute.cs (Attributable): Removed CheckTargets.
1081         (Attributes.Emit): Explicit attribute targets are tested here.
1082
1083         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
1084         not enabled for interfaces.
1085
1086         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
1087         (GetAssemblyName): Ouch next bug there.
1088
1089 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
1090
1091         * expression.cs: Error 275 added.
1092         
1093 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
1094
1095         Fix bug #69177 (Implemented decimal constant support)
1096
1097         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
1098         (BinaryFold): Add DecimalConstant.
1099
1100         * const.cs (Define): Decimal constant 
1101         (is not constant.
1102         (ChangeType): Add decimal type handling.
1103         (LookupConstantValue): Don't set value for decimal type but
1104         emit DecimalConstantAttribute. Needed for constant optimization.
1105
1106         * constant.cs (ToDecimal): New method.
1107         (ConvertToDecimal): New method.
1108         (IntConstant): Implemented ConvertToDecimal.
1109         (DecimalConstant.Emit): Emit optimized version for decimals in
1110         int range.
1111
1112         * expression.cs (ResolveOperator): Changed order of constant
1113         reduction to work correctly with native types which have
1114         overloaded operators.
1115         (ResolveMemberAccess): Extract constant value from attribute
1116         for decimal type.
1117
1118         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
1119
1120         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
1121         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
1122         (ChangeType): Decimal is special.
1123         (TypeToCoreType): Add decimal type.
1124
1125 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
1126
1127         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
1128         decimal types.
1129
1130 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
1131
1132         * class.cs (EventField.ApplyAttributeBuilder): Fix error
1133         test cs1667-5.cs.
1134
1135 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
1136
1137         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
1138
1139         * pending.cs (PendingImplementation): Grab only interfaces.
1140
1141 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
1142
1143         * statement.cs (ForeachHelperMethods): Add location member and
1144         error 202 detection.
1145
1146 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
1147
1148         * expression.cs (DoResolveBase): Fixed wrong warning for out
1149         variables.
1150
1151 2004-12-04  Martin Baulig  <martin@ximian.com>
1152
1153         * convert.cs (Convert.TypeParameter_to_Null): Use the constraints
1154         to check whether the conversion is ok.
1155
1156         * typemanager.cs (TypeManager.GetTypeArguments): Just return
1157         `Type.EmptyTypes' if we're not a generic TypeContainer.
1158
1159 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
1160
1161         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
1162         old bug: when converting from the null literal to a pointer,
1163         return an EmptyCast, not the NullLiteral.
1164
1165         This fixes #69921, the recent null_type changes probably made this
1166         bug more prominent.
1167
1168 2004-12-03  Martin Baulig  <martin@ximian.com>
1169
1170         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
1171         method as our child, call AnonymousMethod.Compatible() on it.
1172
1173 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
1174
1175         * class.cs (FieldBase): Use an unused bit field from the field to
1176         encode the `has_offset' property from the FieldMember.  This saves
1177         a couple of Ks on bootstrap compilation.
1178
1179         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
1180         method as our child, return the AnonymousMethod resolved
1181         expression.
1182
1183         * expression.cs (New.DoResolve): Allow return values from
1184         NewDelegate to also include AnonymousMethods.
1185
1186         Fixes #70150.
1187
1188 2004-11-29  Raja R Harinath  <rharinath@novell.com>
1189
1190         * decl.cs (MemberCore.MemberName): Remove readonly to fix an error
1191         cs1648 report.
1192         * rootcontext.cs (ResolveCore::interfaces_first_stage): Add
1193         System.Runtime.InteropServices._Exception, since it's a base
1194         interface of the core type System.Exception in the net_2_0 profile.
1195
1196 2004-11-27  Martin Baulig  <martin@ximian.com>
1197
1198         * ecore.cs (Expression.StoreFromPtr): Use `stobj' for generic parameters.
1199
1200 2004-11-26  Raja R Harinath  <rharinath@novell.com>
1201
1202         * Makefile: Convert to use executable.make.
1203         * gmcs.exe.sources: New.
1204
1205 2004-11-25  Martin Baulig  <martin@ximian.com>
1206
1207         * expression.cs (Invocation.InferType): Added support for byref types.
1208
1209 2004-11-25  Martin Baulig  <martin@ximian.com>
1210
1211         * statement.cs (Foreach.FetchMethodMoveNext): Wrap `mi.ReturnType'
1212         in TypeManager.TypeToCoreType().
1213
1214 2004-11-25  Martin Baulig  <martin@ximian.com>
1215
1216         * iterators.cs (Iterator.DoDefineMembers): Override and lookup the
1217         "Dispose" method from the `current_type'.
1218         (Iterator.EmitMoveNext): Use the `dispose_method' we looked up in
1219         DoDefineMembers() instead of using the MethodBuilder; this is
1220         required for generic iterators.
1221
1222         * class.cs (TypeContainer.DoDefineMembers): Make this virtual.
1223
1224 2004-11-24  Martin Baulig  <martin@ximian.com>
1225
1226         * ecore.cs (Expression.LoadFromPtr): Use `ldobj' for generic parameters.
1227
1228 2004-11-20  Martin Baulig  <martin@ximian.com>
1229
1230         * expression.cs (Invocation.InferType): Correctly infer generic
1231         instances; see gen-103.cs.
1232         (Invocation.InferTypeArguments): If a generic method doesn't have
1233         any unbound type parameters, we don't need to infer anything.
1234
1235 2004-11-19  Raja R Harinath  <rharinath@novell.com>
1236
1237         * Makefile (gmcs.exe): Update to new location of bootstrap mcs.exe.
1238
1239 2004-11-17  Raja R Harinath  <rharinath@novell.com>
1240
1241         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
1242         (TypeHandle.GetMemberCache): New.
1243         (TypeHandle.TypeHandle): Update.
1244         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
1245         (TypeManager.LookupParentInterfacesCache):
1246         Rename from LookupInterfaceCache.  Optimize slightly.
1247         (TypeManager.MemberLookup_FindMembers): Update.
1248         * decl.cs (MemberCache.MemberCache): Set Container to null in the
1249         multi-type variant.
1250         (AddCacheContents): Rename from AddHashtable.
1251         * class.cs (TypeContainer.parent_container): Remove.
1252         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
1253         (TypeContainer.DoDefineMembers): Don't initialize it.
1254         Update to name changes.
1255         
1256 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
1257
1258         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
1259         that factors the code to check access modifiers on override.  
1260
1261         (PropertyBase): Use the code here.
1262
1263         Patch from Lluis S'anchez, fixes bug #69361.
1264
1265 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
1266
1267         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
1268         routine that is used to report the use of a captured variable
1269         whose address has been taken.
1270
1271         There are two checks: one when variables are being captured and
1272         the other check is when the address of a variable is taken. 
1273         
1274         (because an anonymous methods might be resolved before *or* after
1275         the address has been taken) and 
1276
1277         * expression.cs (Conditional.DoResolve): Remove the special
1278         casing that Martin added to trueExpr and falseExpr being both
1279         NullLiteral.  We get the right behavior now just by introducing
1280         the null_type into the compiler. 
1281
1282         * convert.cs (ExplicitConversion): Change the code to use
1283         null_type instead of testing `expr is NullLiteral'.
1284         (ImplicitConversionStandard): use null_type too.
1285         (ImplicitReferenceConversionExists): use null_type too.
1286         (ImplicitReferenceConversion): use null_type too.
1287
1288         * literal.cs: The type of `NullLiteral' is now null_type instead
1289         of object_type. 
1290         (Resolve): Set the type here.
1291
1292         * typemanager.cs: Introduce null_type.
1293
1294 2004-11-18  Martin Baulig  <martin@ximian.com>
1295
1296         * rootcontext.cs
1297         (RootContext.LookupType): Return a `Type', not a `TypeExpr'.
1298
1299 2004-11-18  Martin Baulig  <martin@ximian.com>
1300
1301         * ecore.cs (TypeExpr.DoResolveAsTypeStep): Make this protected.
1302
1303 2004-11-18  Martin Baulig  <martin@ximian.com>
1304
1305         * generic.cs (Constraints.Resolve): Take an `EmitContext' instead
1306         of a `DeclSpace'.  If one of our constraints is a `ConstructedType',
1307         call ResolveConstructedType() on it to resolve it without checking
1308         constraints.
1309         (Constraints.ResolveTypes): Check them here.
1310         (ConstructedType.DoResolveAsTypeStep): Fully resolve ourselves,
1311         but don't check constraints.
1312         (ConstructedType.ResolveAsTypeTerminal): Override this and also
1313         check constraints here.
1314         (ConstructedType.ResolveConstructedType): New public method.  This
1315         is called from DoResolveAsTypeStep() and Constraints.Resolve() to
1316         resolve ourselves without checking constraints.
1317
1318         * ecore.cs (Expression.ResolveAsTypeTerminal): Make this virtual.
1319
1320 2004-11-18  Martin Baulig  <martin@ximian.com>
1321
1322         * decl.cs
1323         (DeclSpace.CurrentType): Changed type from `TypeExpr' to `Type'.
1324
1325         * delegate.cs (Delegate.DefineType): Always create the EmitContext.
1326
1327 2004-11-18  Martin Baulig  <martin@ximian.com>
1328
1329         * ecore.cs (TypeExpr.ResolveType): Removed.
1330         (Expression.ResolveAsTypeTerminal): We always return a fully
1331         resolved `TypeExpr', so we can just access its `Type'.
1332
1333         * class.cs (TypeContainer.DefineType): Resolve `CurrentType' here.
1334
1335 2004-11-17  Martin Baulig  <martin@ximian.com>
1336
1337         * ecore.cs (IAlias.Type): Replaced with ResolveAsType() to make
1338         sure we don't return any unresolved TypeExpr's.
1339         (TypeAliasExpression): The .ctor now takes an `IAlias' instead of
1340         a `TypeExpr'.
1341         (Expression.ResolveAsTypeTerminal): Make sure `te.Type != null'.
1342
1343         * expression.cs (MemberAccess.ResolveAsTypeStep): Don't return any
1344         unresolved `ConstructedType's.
1345
1346 2004-11-17  Martin Baulig  <martin@ximian.com>
1347
1348         * ecore.cs (TypeExpr.ResolveType): Don't make this virtual.
1349
1350 2004-11-17  Martin Baulig  <martin@ximian.com>
1351
1352         * ecore.cs
1353         (Expression.ResolveAsTypeTerminal): Removed the `bool silent' argument.
1354
1355         * decl.cs (DeclSpace.ResolveType): Removed.
1356         (DeclSpace.ResolveTypeExpr): Removed the `bool silent' argument.
1357
1358 2004-11-17  Martin Baulig  <martin@ximian.com>
1359
1360         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
1361         direction, like FindMembers() does.  Fixes #69546, testcase is in
1362         test-315.cs.    
1363
1364 2004-11-16  Martin Baulig  <martin@ximian.com>
1365
1366         This is based on a patch from Marek Safar, see bug #69082.
1367         Fixes bugs #63705 and #67130.
1368
1369         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
1370         method; create a MemberCache for an interface type and cache the
1371         result.
1372
1373         * decl.cs (IMemberContainer.ParentContainer): Removed.
1374         (IMemberContainer.ParentCache): New property.
1375         (MemberCache.SetupCacheForInterface): Removed.
1376         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
1377         to create a cache for an interface's "parent".
1378
1379         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
1380         interfaces too.
1381
1382 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
1383
1384         * statement.cs: Avoid adding bools to a hashtable.
1385
1386 2004-11-15  Martin Baulig  <martin@ximian.com>
1387
1388         * decl.cs (MemberName.GetPartialName): Removed, use GetTypeName() instead.
1389
1390 2004-11-11  Martin Baulig  <martin@ximian.com>
1391
1392         * typemanager.cs (TypeManager.GetMethodName): New method.
1393
1394         * class.cs (MethodData.Define): Include the generic arity in the
1395         name of an explicit interface; also add it to the method name.
1396
1397         * pending.cs (PendingImplementation.InterfaceMethod): The method
1398         name now includes the generic arity.
1399
1400 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
1401
1402         * expression.cs (Invocation.OverloadResolve): Flag error if we are
1403         calling an unsafe method from a safe location.
1404
1405 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
1406
1407         Fix #69167
1408         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
1409
1410 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
1411
1412         * namespace.cs (VerifyUsing): use GetPartialName instead of
1413         ToString. 
1414
1415 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
1416
1417         * statement.cs (Return.Resolve): Fix regression in typo: if
1418         `in_exc', we have to request a NeedReturnLabel, this was a typo
1419         introduced in the anonymous method check-in.  Fixes #69131.
1420
1421         * Indexers were using the ShortName when defining themselves,
1422         causing a regression in the compiler bootstrap when applying the
1423         patch from 2004-11-02 (first part), now they use their full name
1424         and the bug is gone.
1425
1426 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
1427
1428         * driver.cs: Strip the path from the names of embedded resources. Fixes
1429         #68519.
1430
1431 2004-11-04  Raja R Harinath  <rharinath@novell.com>
1432
1433         Fix error message regression: cs0104-2.cs.
1434         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
1435         (AliasEntry.Resolve): Update.
1436         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
1437         'silent' flag.
1438         (RootContext.LookupType): Update.
1439
1440 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
1441
1442         * cs-parser.jay: Add support for handling accessor modifiers
1443         * class: Add support port accessor modifiers and error checking,
1444         define PropertyMethod.Define as virtual (not abstract anymore)
1445         * ecore.cs: Add checking for proeprties access with access modifiers
1446         * iterators.cs: Modify Accessor constructor call based in the modified
1447         constructor
1448 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
1449
1450         * expression.cs (StringConcat): Handle being called twice,
1451         as when we have a concat in a field init with more than two
1452         ctors in the class
1453
1454 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
1455
1456         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
1457         special case explicit implementations, we should always produce
1458         the .property or .event declaration.
1459         
1460         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
1461         since it will not return correct data if people use this
1462         unresolved in the presence of using statements (see test-313).
1463
1464         * class.cs (MethodData.Define): If we are an explicit interface
1465         implementation, set the method name to the full name of the
1466         interface plus the name of the method.  
1467
1468         Notice that using the method.MethodName.GetFullName() does not
1469         work, as it will only contain the name as declared on the source
1470         file (it can be a shorthand in the presence of using statements)
1471         and not the fully qualifed type name, for example:
1472
1473         using System;
1474
1475         class D : ICloneable {
1476                 object ICloneable.Clone ()  {
1477                 }
1478         }
1479
1480         Would produce a method called `ICloneable.Clone' instead of
1481         `System.ICloneable.Clone'.
1482
1483         * namespace.cs (Alias.Resolve): Use GetPartialName.
1484         
1485 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
1486
1487         * cs-parser.jay: Add error 1055 report.
1488
1489 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
1490
1491         * assign.cs (Assign.DoResolve): Only do the transform of
1492         assignment into a New if the types are compatible, if not, fall
1493         through and let the implicit code deal with the errors and with
1494         the necessary conversions. 
1495
1496 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
1497
1498         * cs-parser.jay: Add error 1031 report.
1499
1500         * cs-tokenizer.cs: Add location for error 1038.
1501
1502 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1503
1504         * cs-parser.jay: Add error 1016 report.
1505
1506 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1507
1508         * cs-parser.jay: Add errors 1575,1611 report.
1509
1510 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1511
1512         * cs-parser.jay: Add error 1001 report.
1513
1514 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1515
1516         Fix #68850
1517         * attribute.cs (GetMarshal): Add method argument for
1518         caller identification.
1519
1520         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
1521         agument for GetMarshal and RuntimeMissingSupport.
1522
1523 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1524
1525         * attribute.cs (ExtractSecurityPermissionSet): Removed
1526         TypeManager.code_access_permission_type.
1527
1528         * typemanager.cs: Removed TypeManager.code_access_permission_type.
1529
1530 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
1531
1532         * expression.cs (LocalVariableReference.DoResolveLValue): Check
1533         for obsolete use of a variable here.   Fixes regression on errors
1534         cs0619-25 and cs0619-26.
1535
1536 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
1537
1538         Fix #62358, implemented security attribute encoding.
1539
1540         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
1541         Tests permitted SecurityAction for assembly or other types.
1542         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
1543         data from SecurityPermissionAttribute to PermisionSet class.
1544
1545         * class.cs (ApplyAttributeBuilder): Added special handling
1546         for System.Security.Permissions.SecurityAttribute based types.
1547
1548         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
1549         special handling for System.Security.Permissions.SecurityAttribute
1550         based types.
1551
1552         * enum.cs (ApplyAttributeBuilder): Added special handling
1553         for System.Security.Permissions.SecurityAttribute based types.
1554
1555         * parameter.cs (ApplyAttributeBuilder): Added special handling
1556         for System.Security.Permissions.SecurityAttribute based types.
1557
1558         * rootcontext.cs: Next 2 core types.
1559
1560         * typemanager.cs (TypeManager.security_permission_attr_type):
1561         Built in type for the SecurityPermission Attribute.
1562         (code_access_permission_type): Build in type.
1563
1564 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
1565
1566         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
1567         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
1568         all of this information into
1569         EmitContext.EmitCapturedVariableInstance.
1570         
1571         * codegen.cs (EmitCapturedVariableInstance): move here the
1572         funcionality of emitting an ldarg.0 in the presence of a
1573         remapping.   This centralizes the instance emit code.
1574
1575         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
1576         then emit a load of this: it means that we have reached the
1577         topmost ScopeInfo: the one that contains the pointer to the
1578         instance of the class hosting the anonymous method.
1579
1580         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
1581         captures to the topmost CaptureContext.
1582
1583 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
1584
1585         * expression.cs (LocalVariableReference): Move the knowledge about
1586         the iterators into codegen's EmitCapturedVariableInstance.
1587
1588 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
1589
1590         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
1591         all code paths return a value from an anonymous method (it is the
1592         same as the 161 error, but for anonymous methods).
1593
1594 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
1595
1596         The introduction of anonymous methods in the compiler changed
1597         various ways of doing things in the compiler.  The most
1598         significant one is the hard split between the resolution phase
1599         and the emission phases of the compiler.
1600
1601         For instance, routines that referenced local variables no
1602         longer can safely create temporary variables during the
1603         resolution phase: they must do so from the emission phase,
1604         since the variable might have been "captured", hence access to
1605         it can not be done with the local-variable operations from the runtime.
1606         
1607         * statement.cs 
1608
1609         (Block.Flags): New flag `IsTopLevel' to indicate that this block
1610         is a toplevel block.
1611
1612         (ToplevelBlock): A new kind of Block, these are the blocks that
1613         are created by the parser for all toplevel method bodies.  These
1614         include methods, accessors and anonymous methods.
1615
1616         These contain some extra information not found in regular blocks:
1617         A pointer to an optional CaptureContext (for tracking captured
1618         local variables and parameters).  A pointer to the parent
1619         ToplevelBlock.
1620         
1621         (Return.Resolve): Catch missmatches when returning a value from an
1622         anonymous method (error 1662).
1623         Invoke NeedReturnLabel from the Resolve phase instead of the emit
1624         phase.
1625
1626         (Break.Resolve): ditto.
1627
1628         (SwitchLabel): instead of defining the labels during the
1629         resolution phase, we now turned the public ILLabel and ILLabelCode
1630         labels into methods called GetILLabelCode() and GetILLabel() that
1631         only define the label during the Emit phase.
1632
1633         (GotoCase): Track the SwitchLabel instead of the computed label
1634         (its contained therein).  Emit the code by using
1635         SwitchLabel.GetILLabelCode ().
1636
1637         (LocalInfo.Flags.Captured): A new flag has been introduce to track
1638         whether the Local has been captured or not.
1639
1640         (LocalInfo.IsCaptured): New property, used to tell whether the
1641         local has been captured.
1642         
1643         * anonymous.cs: Vastly updated to contain the anonymous method
1644         support.
1645
1646         The main classes here are: CaptureContext which tracks any
1647         captured information for a toplevel block and ScopeInfo used to
1648         track the activation frames for various local variables.   
1649
1650         Each toplevel block has an optional capture context associated
1651         with it.  When a method contains an anonymous method both the
1652         toplevel method and the anonymous method will create a capture
1653         context.   When variables or parameters are captured, they are
1654         recorded on the CaptureContext that owns them, for example:
1655
1656         void Demo () {
1657              int a;
1658              MyDelegate d = delegate {
1659                  a = 1;
1660              }
1661         }
1662
1663         Here `a' will be recorded as captured on the toplevel
1664         CapturedContext, the inner captured context will not have anything
1665         (it will only have data if local variables or parameters from it
1666         are captured in a nested anonymous method.
1667
1668         The ScopeInfo is used to track the activation frames for local
1669         variables, for example:
1670
1671         for (int i = 0; i < 10; i++)
1672                 for (int j = 0; j < 10; j++){
1673                    MyDelegate d = delegate {
1674                         call (i, j);
1675                    }
1676                 }
1677
1678         At runtime this captures a single captured variable `i', but it
1679         captures 10 different versions of the variable `j'.  The variable
1680         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
1681         recorded on a child.  
1682
1683         The toplevel ScopeInfo will also track information like the `this'
1684         pointer if instance variables were referenced (this is necessary
1685         as the anonymous method lives inside a nested class in the host
1686         type of the method). 
1687
1688         (AnonymousMethod): Expanded to track the Toplevel, implement
1689         `AnonymousMethod.Compatible' to tell whether an anonymous method
1690         can be converted to a target delegate type. 
1691
1692         The routine now also produces the anonymous method content
1693
1694         (AnonymousDelegate): A helper class that derives from
1695         DelegateCreation, this is used to generate the code necessary to
1696         produce the delegate for the anonymous method that was created. 
1697
1698         * assign.cs: API adjustments for new changes in
1699         Convert.ImplicitStandardConversionExists.
1700
1701         * class.cs: Adjustments to cope with the fact that now toplevel
1702         blocks are of type `ToplevelBlock'. 
1703
1704         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
1705         insteda of standard blocks.
1706
1707         Flag errors if params arguments are passed to anonymous methods.
1708
1709         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
1710         `CurrentAnonymousMethod' which points to the current Anonymous
1711         Method.  The variable points to the AnonymousMethod class that
1712         holds the code being compiled.  It is set in the new EmitContext
1713         created for the anonymous method.
1714
1715         (EmitContext.Phase): Introduce a variable and an enumeration to
1716         assist in enforcing some rules about when and where we are allowed
1717         to invoke certain methods (EmitContext.NeedsReturnLabel is the
1718         only one that enfonces this right now).
1719
1720         (EmitContext.HaveCaptureInfo): new helper method that returns
1721         whether we have a CapturedContext initialized.
1722
1723         (EmitContext.CaptureVariable): New method used to register that a
1724         LocalInfo must be flagged for capturing. 
1725
1726         (EmitContext.CapturedParameter): New method used to register that a
1727         parameters must be flagged for capturing. 
1728         
1729         (EmitContext.CapturedField): New method used to register that a
1730         field must be flagged for capturing. 
1731
1732         (EmitContext.HaveCapturedVariables,
1733         EmitContext.HaveCapturedFields): Return whether there are captured
1734         variables or fields. 
1735
1736         (EmitContext.EmitMethodHostInstance): This is used to emit the
1737         instance for the anonymous method.  The instance might be null
1738         (static methods), this (for anonymous methods that capture nothing
1739         and happen to live side-by-side with the current method body) or a
1740         more complicated expression if the method has a CaptureContext.
1741
1742         (EmitContext.EmitTopBlock): Routine that drives the emission of
1743         code: it will first resolve the top block, then emit any metadata
1744         and then emit the code.  The split is done so that we can extract
1745         any anonymous methods and flag any captured variables/parameters.
1746         
1747         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
1748         during this phase, the ILGenerator should not be used as labels
1749         and local variables declared here might not be accessible to any
1750         code that is part of an anonymous method.  
1751
1752         Exceptions to this include the temporary variables that are
1753         created by some statements internally for holding temporary
1754         variables. 
1755         
1756         (EmitContext.EmitMeta): New routine, in charge of emitting all the
1757         metadata for a cb
1758
1759         (EmitContext.TemporaryReturn): This method is typically called
1760         from the Emit phase, and its the only place where we allow the
1761         ReturnLabel to be defined other than the EmitMeta.  The reason is
1762         that otherwise we would have to duplicate a lot of logic in the
1763         Resolve phases of various methods that today is on the Emit
1764         phase. 
1765
1766         (EmitContext.NeedReturnLabel): This no longer creates the label,
1767         as the ILGenerator is not valid during the resolve phase.
1768
1769         (EmitContext.EmitThis): Extended the knowledge in this class to
1770         work in anonymous methods in addition to iterators. 
1771
1772         (EmitContext.EmitCapturedVariableInstance): This emits whatever
1773         code is necessary on the stack to access the instance to a local
1774         variable (the variable will be accessed as a field).
1775
1776         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
1777         EmitContext.EmitAddressOfParameter): Routines to support
1778         parameters (not completed at this point). 
1779         
1780         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
1781         will also remove the parameters.
1782
1783         * convert.cs (Convert): Define a `ConstantEC' which points to a
1784         null.  This is just to prefity some code that uses
1785         ImplicitStandardConversion code and do not have an EmitContext
1786         handy.
1787
1788         The idea is to flag explicitly that at that point in time, it is
1789         known that the conversion will not trigger the delegate checking
1790         code in implicit conversions (which requires a valid
1791         EmitContext). 
1792
1793         Everywhere: pass new EmitContext parameter since
1794         ImplicitStandardConversionExists now requires it to check for
1795         anonymous method conversions. 
1796
1797         (Convert.ImplicitStandardConversionExists): If the type of an
1798         expression is the anonymous_method_type, and the type is a
1799         delegate, we invoke the AnonymousMethod.Compatible method to check
1800         whether an implicit conversion is possible. 
1801
1802         (Convert.ImplicitConversionStandard): Only do implicit method
1803         group conversions if the language level is not ISO_1.
1804
1805         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
1806         MethodInfo for the Invoke method.  used by Delegate and
1807         AnonymousDelegate.
1808
1809         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
1810         method conversions if the target type is a delegate.
1811
1812         Removed extra debugging nops.
1813
1814         (LocalVariableReference): Turn the `local_info' into a public
1815         field. 
1816
1817         Add `prepared' field, the same hack used for FieldExprs to cope
1818         with composed assignments, as Local variables do not necessarily
1819         operate purely on the stack as they used to: they can be captured
1820         fields. 
1821
1822         Add `temp' for a temporary result, like fields.
1823
1824         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1825
1826         It now copes with Local variables that are captured and emits the
1827         proper instance variable to load it from a field in the captured
1828         case. 
1829
1830         (ParameterReference.DoResolveBase): During the resolve phase,
1831         capture parameters if we are in an anonymous method.
1832
1833         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1834         anonymous method, use the EmitContext helper routines to emit the
1835         parameter reference.
1836
1837         * iterators.cs: Set RemapToProxy to true/false during the
1838         EmitDispose class.
1839
1840         * parameters.cs (GetParameterByName): New helper method. 
1841
1842         * typemanager.cs (anonymous_method_type) a new type that
1843         represents an anonyous method.  This is always an internal type,
1844         used as a fencepost to test against the anonymous-methodness of an
1845         expression. 
1846         
1847 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
1848
1849         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
1850         561 report.
1851         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
1852
1853 2004-11-10  Martin Baulig  <martin@ximian.com>
1854
1855         * expression.cs (Invocation.BetterFunction): If two methods have
1856         equal parameter types, but only one of them is generic, the
1857         non-generic one wins.
1858         (New.DoResolve): Don't set `is_struct' to false if we're a generic
1859         instance; just use `Type.IsValueType' to determine whether
1860         something is a struct or not.
1861         (MemberAccess.DoResolveAsTypeStep): Don't modify the `args' field,
1862         so we can be called multiple times.
1863
1864 2004-11-10  Martin Baulig  <martin@ximian.com>
1865
1866         * generic.cs (TypeParameter.DefineConstraints): New public method.
1867         (TypeParameter.CheckAccessLevel): Override this and return true.
1868         (ConstructedType.ResolveType): Renamed to DoResolveType(), don't
1869         override ResolveType() anymore.
1870         (ConstructedType.DoResolveAsTypeStep): Call DoResolveType() here.
1871
1872 2004-11-10  Martin Baulig  <martin@ximian.com>
1873
1874         * rootcontext.cs (RootContext.LookupType): If we're a nested type,
1875         call DeclSpace.ResolveNestedType() on it.
1876
1877 2004-11-10  Martin Baulig  <martin@ximian.com>
1878
1879         * support.cs (ReflectionParameters.ParameterModifier): If `gpd' is
1880         non-null, call ParameterModifier() on it.
1881
1882 2004-11-10  Martin Baulig  <martin@ximian.com>
1883
1884         * iterators.cs
1885         (Iterators): Added `current_type' and `this_type' fields.
1886         (Iterators.DefineIterator): Create a new EmitContext and store it
1887         in `ec'; compute `this_type'.
1888
1889 2004-11-10  Martin Baulig  <martin@ximian.com>
1890
1891         * typemanager.cs
1892         (TypeManager.IsPrivateAccessible): New public method.
1893         (Closure.Filter): Use IsPrivateAccessible() instead of IsEqual().
1894
1895 2004-11-10  Martin Baulig  <martin@ximian.com>
1896
1897         * class.cs (TypeContainer.DefineType): Call
1898         TypeBuilder.DefineGenericParameters() before resolving the type
1899         parameters.
1900         (MethodData.parent_method): New protected field.
1901         (MethodData..ctor): Added `MethodInfo parent_method' argument.
1902         (MethodData.Define): Compute `parent_method'.
1903
1904         * decl.cs
1905         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
1906         (MemberCore.GetClsCompliantAttributeValue): Likewise.
1907         (DeclSpace.ec): New protected field; store the EmitContext here.
1908         (DeclSpace.EmitContext): New public property.
1909         (DeclSpace.ResolveType): Un-comment from the [Obsolte] attribute.
1910         (DeclSpace.ResolveNestedType): New public method.
1911         (DeclSpace.ResolveTypeExpr): Just call ResolveAsTypeTerminal() here.
1912         (DeclSpace.NestedAccessible): Added `Type tb' argument.
1913         (DeclSpace.FamilyAccessible): Likewise.
1914         (DeclSpace.FindType): Call ResolveNestedType() for nested types.
1915         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
1916         EmitContext.
1917
1918         * delegate.cs (Delegate.Define): Store the EmitContext in the `ec'
1919         field.
1920
1921         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
1922         (Enum.Emit): Don't create a new EmitContext.
1923
1924 2004-10-18  Martin Baulig  <martin@ximian.com>
1925
1926         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
1927         `Type' directly, but call ResolveType() on it.
1928         (Catch.Resolve): Likewise.
1929         (Foreach.Resolve): Likewise.
1930
1931 2004-10-18  Martin Baulig  <martin@ximian.com>
1932
1933         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
1934         `Type' directly, but call ResolveType() on it.
1935         (Probe.DoResolve): Likewise.
1936         (ArrayCreation.LookupType): Likewise.
1937         (TypeOf.DoResolve): Likewise.
1938         (SizeOf.DoResolve): Likewise.
1939
1940 2004-10-18  Raja R Harinath  <rharinath@novell.com>
1941
1942         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
1943         the ResolveType.
1944
1945 2004-10-17  John Luke  <john.luke@gmail.com>
1946
1947         * class.cs (Operator.GetSignatureForError): use CSharpName
1948
1949         * parameter.cs (Parameter.GetSignatureForError): Returns
1950         correct name even if was not defined.
1951
1952 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1953
1954         Fix #65816.
1955         * class.cs (TypeContainer.EmitContext): New property.
1956         (DefineNestedTypes): Create an emitcontext for each part.
1957         (MethodCore.DoDefineParameters): Use container's emitcontext.
1958         Pass type array to InternalParameters.
1959         (MemberBase.DoDefine): Use container's emitcontext.
1960         (FieldMember.Define): Likewise.
1961         (Event.Define): Likewise.
1962         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1963         Pass type array to InternalParameters.
1964         (SetIndexerMethod.GetParameterInfo): Likewise.
1965         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1966         * delegate.cs (Define): Pass emitcontext to
1967         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1968         array to InternalParameters.
1969         * expression.cs (ParameterReference.DoResolveBase): Pass
1970         emitcontext to GetParameterInfo.
1971         (ComposedCast.DoResolveAsTypeStep): Remove check on
1972         ec.ResolvingTypeTree.
1973         * parameter.cs (Parameter.Resolve): Change argument to
1974         EmitContext.  Use ResolveAsTypeTerminal.
1975         (Parameter.GetSignature): Change argument to EmitContext.
1976         (Parameters.ComputeSignature): Likewise.
1977         (Parameters.ComputeParameterTypes): Likewise.
1978         (Parameters.GetParameterInfo): Likewise.
1979         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1980         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1981         * support.cs (InternalParameters..ctor): Remove variant that takes
1982         a DeclSpace.
1983         * typemanager.cs (system_intptr_expr): New.
1984         (InitExpressionTypes): Initialize it.
1985
1986 2004-10-12  Chris Toshok  <toshok@ximian.com>
1987
1988         * cs-parser.jay: fix location for try_statement and catch_clause.
1989
1990 2004-10-18  Martin Baulig  <martin@ximian.com>
1991
1992         * class.cs (FieldMember.Define): Don't access the TypeExpr's
1993         `Type' directly, but call ResolveType() on it.
1994         (MemberBase.DoDefine): Likewise.
1995
1996         * expression.cs (New.DoResolve): Don't access the TypeExpr's
1997         `Type' directly, but call ResolveType() on it.
1998         (ComposedCast.DoResolveAsTypeStep): Likewise.
1999
2000         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
2001         `Type' directly, but call ResolveType() on it.
2002
2003 2004-10-17  John Luke  <john.luke@gmail.com>
2004
2005         * class.cs (Operator.GetSignatureForError): use CSharpName
2006
2007         * parameter.cs (Parameter.GetSignatureForError): Returns
2008         correct name even if was not defined.
2009
2010 2004-10-13  Raja R Harinath  <rharinath@novell.com>
2011
2012         Fix #65816.
2013         * class.cs (TypeContainer.EmitContext): New property.
2014         (DefineNestedTypes): Create an emitcontext for each part.
2015         (MethodCore.DoDefineParameters): Use container's emitcontext.
2016         Pass type array to InternalParameters.
2017         (MemberBase.DoDefine): Use container's emitcontext.
2018         (FieldMember.Define): Likewise.
2019         (Event.Define): Likewise.
2020         (SetMethod.GetParameterInfo): Change argument to EmitContext.
2021         Pass type array to InternalParameters.
2022         (SetIndexerMethod.GetParameterInfo): Likewise.
2023         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
2024         * delegate.cs (Define): Pass emitcontext to
2025         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
2026         array to InternalParameters.
2027         * expression.cs (ParameterReference.DoResolveBase): Pass
2028         emitcontext to GetParameterInfo.
2029         (ComposedCast.DoResolveAsTypeStep): Remove check on
2030         ec.ResolvingTypeTree.
2031         * parameter.cs (Parameter.Resolve): Change argument to
2032         EmitContext.  Use ResolveAsTypeTerminal.
2033         (Parameter.GetSignature): Change argument to EmitContext.
2034         (Parameters.ComputeSignature): Likewise.
2035         (Parameters.ComputeParameterTypes): Likewise.
2036         (Parameters.GetParameterInfo): Likewise.
2037         (Parameters.ComputeAndDefineParameterTypes): Likewise.
2038         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
2039         * support.cs (InternalParameters..ctor): Remove variant that takes
2040         a DeclSpace.
2041         * typemanager.cs (system_intptr_expr): New.
2042         (InitExpressionTypes): Initialize it.
2043
2044 2004-10-12  Chris Toshok  <toshok@ximian.com>
2045
2046         * cs-parser.jay: fix location for try_statement and catch_clause.
2047
2048 2004-10-07  Raja R Harinath  <rharinath@novell.com>
2049
2050         More DeclSpace.ResolveType avoidance.
2051         * decl.cs (MemberCore.InUnsafe): New property.
2052         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
2053         with newly created EmitContext.
2054         (FieldMember.Define): Likewise.
2055         * delegate.cs (Delegate.Define): Likewise.
2056         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
2057         only if normal name-lookup fails.
2058         (TypeExpr.DoResolve): Enable error-checking.
2059         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
2060         (SizeOf.DoResolve): Likewise.
2061         (ComposedCast.DoResolveAsTypeStep): Likewise.
2062         (StackAlloc.DoResolve): Likewise.
2063         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
2064         (Block.Unsafe): New property.
2065         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
2066         (Unsafe): Set 'unsafe' flag of contained block.
2067         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
2068         (Fixed.Resolve): Likewise.
2069         (Catch.Resolve): Likewise.
2070         (Using.ResolveLocalVariableDecls): Likewise.
2071         (Foreach.Resolve): Likewise.
2072
2073 2004-10-05  John Luke <john.luke@gmail.com>
2074
2075         * cs-parser.jay: add location to error CS0175
2076
2077 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
2078
2079         * ecore.cs (Expression.Constantity): Add support for turning null
2080         into a constant.
2081
2082         * const.cs (Const.Define): Allow constants to be reference types
2083         as long as the value is Null.
2084
2085 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
2086
2087         * namespace.cs (NamespaceEntry.Using): No matter which warning
2088         level is set, check if this namespace name has already been added.
2089
2090 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
2091
2092         * expression.cs: reftype [!=]= null should always use br[true,false].
2093         # 67410
2094
2095 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
2096
2097         Fix #67108
2098         * attribute.cs: Enum conversion moved to 
2099         GetAttributeArgumentExpression to be applied to the all
2100         expressions.
2101
2102 2004-10-01  Raja R Harinath  <rharinath@novell.com>
2103
2104         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
2105         * class.c (TypeContainer.DefineType): Flag error if
2106         base types aren't accessible due to access permissions.
2107         * decl.cs (DeclSpace.ResolveType): Move logic to
2108         Expression.ResolveAsTypeTerminal.
2109         (DeclSpace.ResolveTypeExpr): Thin layer over
2110         Expression.ResolveAsTypeTerminal.
2111         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
2112         Refactor code into NestedAccess.  Use it.
2113         (DeclSpace.NestedAccess): New.
2114         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
2115         argument to silence errors.  Check access permissions.
2116         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
2117         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
2118         (Cast.DoResolve): Likewise.
2119         (New.DoResolve): Likewise.
2120         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
2121         (TypeOf.DoResolve): Likewise.
2122
2123         * expression.cs (Invocation.BetterConversion): Return the Type of
2124         the better conversion.  Implement section 14.4.2.3 more faithfully.
2125         (Invocation.BetterFunction): Make boolean.  Make correspondence to
2126         section 14.4.2.2 explicit.
2127         (Invocation.OverloadResolve): Update.
2128         (Invocation): Remove is_base field.
2129         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
2130         (Invocation.Emit): Likewise.
2131
2132 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
2133
2134         * cs-parser.jay: Reverted 642 warning fix.
2135
2136 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
2137
2138         Fix bug #66615
2139         * decl.cs (FindMemberWithSameName): Indexer can have more than
2140         1 argument.
2141
2142 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
2143
2144         * expression.cs (LocalVariableReference.DoResolveLValue):
2145         Do not report warning 219 for out values.
2146         (EmptyExpression.Null): New member to avoid extra allocations.
2147
2148 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
2149
2150         * cs-parser.jay: Fix wrong warning 642 report.
2151
2152         * cs-tokenizer.cs (CheckNextToken): New helper;
2153         Inspect next character if is same as expected.
2154
2155 2004-09-23  Martin Baulig  <martin@ximian.com>
2156
2157         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
2158         (Convert.ImplicitReferenceConversionExists): Likewise.
2159
2160 2004-11-09  Raja R Harinath  <rharinath@novell.com>
2161
2162         * Makefile (DISTFILES): Comment out a few missing files.
2163
2164 2004-10-29  Raja R Harinath  <rharinath@novell.com>
2165
2166         * Makefile (bootstrap_libs,bootstrap_libfiles): New.
2167         (bootstrap-libs): New target.  Invokes the net_2_0_bootstrap profile.
2168         (gmcs.exe): Invoke bootstrap-libs.
2169         (clean-local): Clean the net_2_0_bootstrap profile too.
2170         (PROGRAM_INSTALL_DIR): New.
2171         (install-local): Use it.
2172
2173 2004-10-13  Martin Baulig  <martin@ximian.com>
2174
2175         * generic.cs (TypeManager.InflatedConstraints): New nested class.
2176         (TypeParameter.DefineType): If we're a method type parameter and
2177         that method is overriding something, "inflate" its constraints.
2178
2179 2004-10-12  Martin Baulig  <martin@ximian.com>
2180
2181         * expression.cs (MemberAccess.DoResolve): If we're a SimpleName
2182         and have type arguments, create and resolve a ConstructedType.
2183
2184 2004-10-12  Martin Baulig  <martin@ximian.com>
2185
2186         * decl.cs (MemberCache.FindMemberToOverride): Use
2187         TypeManager.IsEqual() to compare the parameters and Type.Equals()
2188         to compare the invocationType.
2189
2190         * typemanager.cs (TypeManager.IsEqual): Added support for arrays.
2191         When comparing two type parameters, only do the signature-only
2192         comparision for method type parameters.
2193
2194 2004-10-11  Martin Baulig  <martin@ximian.com>
2195
2196         * report.cs: Don't make --fatal abort on warnings, we have
2197         -warnaserror for that.
2198
2199 2004-10-11  Martin Baulig  <martin@ximian.com>
2200
2201         * typemanager.cs
2202         (TypeManager.IsEqualGenericType): Removed, use IsEqual() instead.
2203         (TypeManager.IsEqual): Call ourself recursively instead of using
2204         Type.IsEqual(). 
2205
2206 2004-10-11  Martin Baulig  <martin@ximian.com>
2207
2208         * class.cs (TypeContainer.DefineType): Only call TypeParameter.Define()
2209         on our own type parameters, not on the ones we inherit from a containing
2210         class.
2211
2212         * expression.cs (Invocation.InferType): Use `==', not `Equals()' for
2213         the comparision.
2214
2215         * generic.cs (TypeParameter.Define): We may only be called once.
2216
2217         * pending.cs (Pending.InterfaceMethod): Call TypeManager.Real_IsEqual()
2218         instead of TypeManager.IsEqual().
2219
2220 2004-09-28  Martin Baulig  <martin@ximian.com>
2221
2222         * generic.cs
2223         (GenericConstraints.EffectiveBaseClass): New public property.
2224         (TypeParameter.GenericConstraints): New public property.
2225         (ConstructedType.CheckConstraints): Improved.
2226
2227         * convert.cs (Convert.TypeParam_EffectiveBaseType): New private method.
2228         (Convert.TypeParameterConversion): New private method; use this in
2229         ImplicitReferenceConversion() and ImplicitReferenceConversionExists()
2230         for all conversions related to type parameters.
2231
2232 2004-09-24  Martin Baulig  <martin@ximian.com>
2233
2234         * convert.cs (Convert.ImplicitReferenceConversion): Added implicit
2235         type parameter conversions for type parameters which are known to
2236         be reference types.
2237
2238 2004-09-24  Martin Baulig  <martin@ximian.com>
2239
2240         * generic.cs (GenericConstraints): Added `IsReferenceType' and
2241         `IsValueType' properties.
2242
2243         * support.cs (ReflectionConstraints): Use
2244         Type.GetGenericParameterConstraints() instead of the old hack.
2245
2246 2004-09-24  Martin Baulig  <martin@ximian.com>
2247
2248         * generic.cs (GenericConstraints): Moved here and made it an
2249         abstract class.
2250
2251         * support.cs (GenericConstraints): Moved to generic.cs.
2252
2253 2004-09-24  Martin Baulig  <martin@ximian.com>
2254
2255         * support.cs
2256         (ReflectionConstraints): Un-nested this class and made it public.
2257
2258         * typemanager.cs
2259         (TypeManager.GetTypeParameterConstraints): New public method.
2260         (TypeManager.HasConstructorConstraint): Use the attributes.
2261
2262 2004-09-24  Martin Baulig  <martin@ximian.com>
2263
2264         * support.cs (GenericConstraints): Replaced `HasConstructor',
2265         `IsReferenceType' and `IsValueType' with `Attributes'.
2266         (ReflectionParameters.ReflectionConstraints): Removed the Create()
2267         method and made the .ctor public.
2268
2269         * generic.cs (Constraints.Attributes): New public property.
2270         (Constraints): Renamed `HasConstructor' -> `HasConstructorConstraint',
2271         `IsReferenceType' -> `HasReferenceTypeConstraint' and
2272         `IsValueType' -> `HasValueTypeConstraint'.
2273
2274 2004-09-23  Martin Baulig  <martin@ximian.com>
2275
2276         * generic.cs (Constraints): Reflect latest runtime changes.
2277
2278 2004-09-23  Martin Baulig  <martin@ximian.com>
2279
2280         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
2281         (Convert.ImplicitReferenceConversionExists): Likewise.
2282
2283 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
2284
2285         * class.cs (Operator.Define): Add error 448 and 559 report.
2286         
2287 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
2288
2289         * class.cs (MemberBase.IsTypePermitted): New protected
2290         method for checking error CS0610.
2291
2292 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
2293
2294         * class.cs (TypeContainer.HasExplicitLayout): New property
2295         Returns whether container has StructLayout attribute set Explicit.
2296         (FieldMember): New abstract class for consts and fields.
2297         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
2298         (Field): Reuse FieldMember.
2299
2300         * const.cs (Const): Reuse FieldMember.
2301
2302         * rootcontext.cs: EmitConstants call moved to class.
2303
2304 2004-09-22  Martin Baulig  <martin@ximian.com>
2305
2306         Marek and me just fixed one of our oldest bugs: #28562 :-)
2307
2308         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
2309
2310         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
2311         we're an EnumConstant, just return that.
2312         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
2313         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
2314         to get the value which'll actually be written into the attribute.
2315         However, we have to use GetValue() to access the attribute's value
2316         in the compiler.        
2317
2318 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
2319
2320         * constant.cs (Constant.IsNegative): New abstract property
2321         IsNegative.
2322
2323         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
2324         (StackAlloc.DoResolve): Reused IsNegative.
2325
2326 2004-09-22  Martin Baulig  <martin@ximian.com>
2327
2328         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
2329         public method; like LookupTypeContainer, but also works for
2330         generic instances.
2331
2332         * report.cs (Report.SymbolRelatedToPreviousError): Use
2333         TypeManager.LookupGenericTypeContainer().       
2334
2335 2004-09-22  Martin Baulig  <martin@ximian.com>
2336
2337         Thanks to Peter Sestoft for this bug report.
2338
2339         * expression.cs (Conditional): If both the `trueExpr' and the
2340         `falseExpr' is a NullLiteral, return a NullLiteral.
2341
2342 2004-09-22  Martin Baulig  <martin@ximian.com>
2343
2344         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
2345         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
2346         for the "get_Current" call.
2347
2348 2004-09-21  Martin Baulig  <martin@ximian.com>
2349
2350         * convert.cs (Convert.ImplicitReferenceConversion): When
2351         converting to an interface type, first check whether we're
2352         converting from a reference type.
2353
2354 2004-09-14  Martin Baulig  <martin@ximian.com>
2355
2356         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
2357
2358 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
2359
2360         Fixed bug #61902
2361         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
2362         called and is obsolete then this member suppress message
2363         when call is inside next [Obsolete] method or type.
2364
2365         * expression.cs: Use TestObsoleteMethodUsage member.
2366
2367 2004-09-14  Martin Baulig  <martin@ximian.com>
2368
2369         * genericparser.cs: Removed.
2370
2371 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
2372
2373         * class.cs (MethodCore.CheckBase): Fix bug #65757.
2374
2375 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
2376
2377         * attribute.cs (Attribute.Resolve): Add error 653 report.
2378
2379         * class.cs (Class.ApplyAttributeBuilder): Add error 641
2380         report.
2381         (Method.ApplyAttributeBuilder): Add error 685 report.
2382         (Operator.Define): Add error 564 report.
2383
2384         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
2385
2386         * expression.cs (Invocation.DoResolve): Add error
2387         245 and 250 report.
2388
2389         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
2390         error 674 report.
2391
2392 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2393
2394         * class.cs (ConstructorInitializer.Resolve):
2395         Wrong error number (515->516).
2396
2397 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2398
2399         * class.cs (Indexer.Define): Add error 631 report.
2400
2401 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2402
2403         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
2404
2405 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2406
2407         * expression.cs (Probe.DoResolve): Add error CS0241 report.
2408
2409 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
2410
2411         * cs-parser.jay: Added error CS0241 report.
2412
2413 2004-09-10  Raja R Harinath  <rharinath@novell.com>
2414
2415         * cs-parser.jay (fixed_statement): Introduce a scope for the
2416         declaration in the 'fixed' statement.
2417
2418 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2419
2420         * cs-parser.jay: Added CS0230 error report.
2421
2422 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2423
2424         * cs-parser.jay: Added errors CS0231 and CS0257 report.
2425
2426 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2427
2428         * expression.cs (Argument.Resolve): Added error CS0192 and
2429         CS0199 report.
2430
2431 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2432
2433         C# 2.0 #pragma warning feature
2434
2435         * cs-tokenizer.cs (PreProcessPragma): New method; 
2436         Handles #pragma directive.
2437
2438         * report.cs (WarningRegions): New class; Support
2439         class for #pragma warning directive. It tests whether
2440         warning is enabled for a given line.
2441
2442 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
2443
2444         * const.cs: Add more descriptive error report, tahnks to
2445         Sebastien. 
2446
2447 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
2448
2449         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
2450
2451 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
2452
2453         * expression.cs: Apply patch from Ben: Remove dead code from
2454         ArrayCreation, and remove the TurnintoConstant call in const.cs,
2455         as that code just threw an exception anwyays.
2456
2457         * const.cs: Remove the call to the turnintoconstant, for details
2458         see bug: #63144
2459         
2460         * literal.cs: The type of the null-literal is the null type;  So
2461         we use a placeholder type (literal.cs:System.Null, defined here)
2462         for it.
2463
2464         * expression.cs (Conditional.DoResolve): Remove some old code that
2465         is no longer needed, conversions have been fixed.
2466
2467         (ArrayCreationExpression.DoResolve): Return false if we fail to
2468         resolve the inner expression.
2469
2470 2004-09-07  Raja R Harinath  <rharinath@novell.com>
2471
2472         Fix test-290.cs.
2473         * cs-parser.jay (delegate_declaration): Record a delegate
2474         declaration as a type declaration.
2475         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
2476
2477 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
2478
2479         * parameter.cs: Do not crash if the type can not be resolved. 
2480
2481         * expression.cs: Report errors with unsafe pointers, fixes #64896
2482
2483 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2484
2485         * expression.cs: Pointer arith always needs to do a conv.i
2486         if the operand is a long. fix 65320
2487
2488 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
2489
2490         Fixed cs0619-37.cs, cs0619-38.cs
2491
2492         * enum.cs (GetObsoleteAttribute): Removed.
2493
2494         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
2495         on Enum member is double staged. The first is tested member
2496         and then enum.
2497
2498 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
2499
2500         Fixed #56986, #63631, #65231
2501
2502         * class.cs: (TypeContainer.AddToMemberContainer): New method,
2503         adds member to name container.
2504         (TypeContainer.AddToTypeContainer): New method, adds type to
2505         name container.
2506         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
2507         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
2508         AddOperator): Simplified by reusing AddToMemberContainer.
2509         (TypeContainer.UserDefinedStaticConstructor): Changed to property
2510         instead of field.
2511         (Method.CheckForDuplications): Fixed implementation to test all
2512         possibilities.
2513         (MemberBase): Detection whether member is explicit interface
2514         implementation is now in constructor.
2515         (MemberBase.UpdateMemberName): Handles IndexerName.
2516         (Accessor): Changed to keep also location information.
2517         (AbstractPropertyEventMethod): Is derived from MemberCore.
2518         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
2519         will be emited or not.
2520         (PropertyBase.AreAccessorsDuplicateImplementation):
2521         Tests whether accessors are not in collision with some method.
2522         (Operator): Is derived from MethodCore to simplify common
2523         operations.
2524
2525         * decl.cs (Flags.TestMethodDuplication): Test for duplication
2526         must be performed.
2527         (DeclSpace.AddToContainer): Adds the member to defined_names
2528         table. It tests for duplications and enclosing name conflicts.
2529
2530         * enum.cs (EnumMember): Clean up to reuse the base structures
2531
2532 2004-09-03  Martin Baulig  <martin@ximian.com>
2533
2534         Merged latest changes into gmcs.  Please keep this comment in
2535         here, it makes it easier for me to see what changed in MCS since
2536         the last time I merged.
2537
2538 2004-09-03  Martin Baulig  <martin@ximian.com>
2539
2540         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
2541         into TypeContainer, to make partial classes work again.
2542
2543 2004-09-03  Martin Baulig  <martin@ximian.com>
2544
2545         * rootcontext.cs (RootContext.V2): Removed.
2546
2547 2004-03-23  Martin Baulig  <martin@ximian.com>
2548
2549         * expression.cs (Invocation.OverloadResolve): Added `bool
2550         may_fail' argument and use it instead of the Location.IsNull() hack.
2551
2552 2004-09-09  Martin Baulig  <martin@ximian.com>
2553
2554         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
2555
2556 2004-09-09  Martin Baulig  <martin@ximian.com>
2557
2558         * generic.cs (TypeParameter.DefineType): Added support for
2559         explicit interface methods.
2560
2561 2004-09-09  Martin Baulig  <martin@ximian.com>
2562
2563         * README.Changes: New document.  Started to list important changes
2564         between MCS and GMCS here.
2565
2566 2004-09-08  Martin Baulig  <martin@ximian.com>
2567
2568         * class.cs
2569         (TypeContainer.CheckRecursiveDefinition): New protected method.
2570         (TypeContainer.DefineType): Move the CS0146 check into
2571         CheckRecursiveDefinition().     
2572
2573 2004-09-06  Martin Baulig  <martin@ximian.com>
2574
2575         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
2576         types for the constructor constraint.
2577
2578 2004-09-03  Martin Baulig  <martin@ximian.com>
2579
2580         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
2581         into TypeContainer, to make partial classes work again.
2582
2583 2004-09-03  Martin Baulig  <martin@ximian.com>
2584
2585         * rootcontext.cs (RootContext.V2): Removed.
2586
2587 2004-03-23  Martin Baulig  <martin@ximian.com>
2588
2589         * expression.cs (Invocation.OverloadResolve): Added `bool
2590         may_fail' argument and use it instead of the Location.IsNull() hack.
2591
2592 2004-09-03  Martin Baulig  <martin@ximian.com>
2593
2594         Merged latest changes into gmcs.  Please keep this comment in
2595         here, it makes it easier for me to see what changed in MCS since
2596         the last time I merged.
2597
2598 2004-09-03  Raja R Harinath  <rharinath@novell.com>
2599
2600         Fix #61128.
2601         * expression.cs (BetterConversion): Don't allow either conversion 
2602         to be null.  Remove redundant implicit conversion test when 'q ==
2603         null' -- when this function is invoked, we already know that the
2604         implicit conversion exists.
2605         (BetterFunction): Assume that 'best' is non-null.  Remove
2606         redundant reimplementation of IsApplicable when 'best' is null.
2607         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
2608         number of arguments.
2609         (IsAncestralType): Extract from OverloadResolve.
2610         (OverloadResolve): Make robust to the MethodGroupExpr being
2611         unsorted.  Implement all the logic of Section 14.5.5.1, and
2612         support overloading of methods from multiple applicable types.
2613         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
2614
2615         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
2616         (RealError, Warning): Append type of report to related symbol.
2617
2618 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
2619
2620         * enum.cs: Fixed CLS-Compliance checks for enum members.
2621         Error tests cs3008-8.cs, cs3014-8.cs
2622
2623 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
2624
2625         Fixed bug #62342, #63102
2626         * class.cs: ImplementIndexer uses member.IsExplicitImpl
2627         like ImplementMethod.
2628
2629 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
2630
2631         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2632         Fixed bug #65170.
2633
2634 2004-09-02  Martin Baulig  <martin@ximian.com>
2635
2636         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
2637         TypeManager.GetArgumentTypes() rather than calling GetParameters()
2638         on the MethodBase.
2639
2640 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
2641
2642         C# 2.0 Static classes implemented
2643
2644         * class.cs (TypeContainer): instance_constructors,
2645         initialized_fields, initialized_static_fields,
2646         default_constructor, base_inteface_types are protected to be
2647         accessible from StaticClass.
2648         (TypeContainer.DefineDefaultConstructor): New virtual method
2649         for custom default constructor generating
2650         (StaticClass): New class to handle "Static classes" feature.
2651
2652         * cs-parser.jay: Handle static keyword on class like instance
2653         of StaticClass.
2654
2655         * driver.cs: Added "/langversion" command line switch with two
2656         options (iso-1, default).
2657
2658 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
2659
2660         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
2661
2662 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
2663
2664         * delegate.cs: Style.
2665
2666 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2667
2668         * delegate.cs: Add seperate instance expr field for miguel.
2669
2670 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2671
2672         * PointerArithmetic (Resolve): make sure we are not doing
2673         pointer arith on void*. Also, make sure we are resolved
2674         by not setting eclass until resolve.
2675
2676         All callers: Make sure that PointerArithmetic gets resolved.
2677
2678 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2679
2680         * ArrayCreation (LookupType): If the type does not resolve 
2681         to an array, give an error.
2682
2683 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
2684
2685         * statement.cs (Try.Resolve): Fixed bug #64222
2686
2687 2004-08-27  Martin Baulig  <martin@ximian.com>
2688
2689         * class.cs
2690         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
2691         crash here.     
2692
2693 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2694
2695         * ecore.cs (Constantify): Get underlying type via
2696         System.Enum.GetUnderlyingType to avoid StackOverflow on the
2697         Windows in special cases.
2698
2699 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2700
2701         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
2702         for obtaining also private methods.
2703         (GetRemoveMethod): Used GetRemoveMethod (true)
2704         for obtaining also private methods.
2705
2706 2004-09-02  Martin Baulig  <martin@ximian.com>
2707
2708         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
2709         TypeManager.GetArgumentTypes() rather than calling GetParameters()
2710         on the MethodBase.
2711
2712 2004-08-27  Martin Baulig  <martin@ximian.com>
2713
2714         * class.cs
2715         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
2716         crash here.     
2717
2718 2004-08-25  Martin Baulig  <martin@ximian.com>
2719
2720         * support.cs (ReflectionParameters..ctor): If this is a generic
2721         method, retrieve and store its type parameters.
2722         (InternalParameters..ctor): Added `TypeParameter[]' argument.
2723         (ReflectionParameters.GenericConstraints): The argument specifies
2724         the type parameter, not the method parameter.
2725         (InternalParameters.GenericConstraints): Likewise.
2726
2727         * generic.cs (TypeParameter.DefineType): Correctly handle
2728         constraints wrt. generic methods in interfaces and their
2729         implementations.        
2730
2731 2004-08-24  Martin Baulig  <martin@ximian.com>
2732
2733         * generic.cs (TypeParameter.IsSubclassOf): New public method.
2734         (Constraints.IsSubclassOf): New internal method.
2735
2736         * typemanager.cs (TypeManager.FindMembers): Added special support
2737         for GenericTypeParameterBuilder's.      
2738         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
2739         type parameters.
2740
2741 2004-08-24  Martin Baulig  <martin@ximian.com>
2742
2743         * typemanager.cs
2744         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
2745         this for accessibility checks.
2746         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
2747         IsNestedFamilyAccessible.
2748         (TypeManager.IsSubclassOf): New method, do what the name actually
2749         says.   
2750
2751 2004-08-24  Martin Baulig  <martin@ximian.com>
2752
2753         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
2754         as a SimpleName, include the generic arity.
2755
2756 2004-08-24  Martin Baulig  <martin@ximian.com>
2757
2758         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
2759         MethodAttributes.HideBySig for operators.
2760
2761 2004-08-23  Martin Baulig  <martin@ximian.com>
2762
2763         Back to the old error reporting system :-)
2764
2765         * report.cs (Message): Removed.
2766         (Report.MessageData, ErrorData, WarningData): Removed.
2767         (Report.Error, Warning): Back to the old system.
2768
2769 2004-08-23  Martin Baulig  <martin@ximian.com>
2770
2771         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
2772
2773         * class.cs (TypeContainer.ParentContainer): New public virtual
2774         method; replaces the explicit interface implementation.
2775         (ClassPart.ParentContainer): Override.
2776
2777 2004-08-23  Martin Baulig  <martin@ximian.com>
2778
2779         * statement.cs (Switch): Added support for constant switches; see
2780         #59428 or test-285.cs.
2781
2782 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2783
2784         Fixed bug #62740.
2785         * statement.cs (GetEnumeratorFilter): Removed useless
2786         logic because C# specs is strict. GetEnumerator must be
2787         public.
2788
2789 2004-08-22  Martin Baulig  <martin@ximian.com>
2790
2791         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2792         a switch and may break, reset the barrier.  Fixes #59867.
2793
2794 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2795
2796         CLS-Compliance speed up (~5% for corlib)
2797
2798         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
2799         New method. Tests container for CLS-Compliant names
2800
2801         * class.cs (TypeContainer.VerifyClsName): New method.
2802         Checks whether container name is CLS Compliant.
2803         (Constructor): Implements IMethodData.
2804
2805         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
2806         low-case table for CLS Compliance test.
2807         (MemberCache.VerifyClsParameterConflict): New method.
2808         Checks method parameters for CS3006 error.
2809
2810         * enum.cs (EnumMember): Is derived from MemberCore.
2811         (Enum.VerifyClsName): Optimized for better performance.
2812
2813 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2814
2815         * report.cs: Renamed Error_T to Error and changed all
2816         references.
2817
2818 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2819
2820         * class.cs (TypeContainer.IndexerArrayList): New inner class
2821         container for indexers.
2822         (TypeContainer.DefaultIndexerName): New constant for default
2823         indexer name. Replaced all "Item" with this constant.
2824         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
2825
2826         * typemanager.cs (TypeManager.default_member_ctor): Cache here
2827         DefaultMemberAttribute constructor.
2828
2829 2004-08-05  Martin Baulig  <martin@ximian.com>
2830
2831         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
2832         Fix bug #59429.
2833
2834 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
2835
2836         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
2837         multi platforms problem.
2838
2839         * compiler.csproj: Included shared files.
2840
2841 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2842
2843         Fix bug 60333, 55971 in the more general way
2844         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2845         Added arg_type argument for constant conversion.
2846         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
2847
2848 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2849
2850         Fix bug #59760
2851         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
2852         OperatorArrayList, MethodCoreArrayList for typecontainer
2853         containers. Changed class member types to these new types.
2854         (MethodArrayList.DefineMembers): Added test for CS0659.
2855
2856 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
2857
2858         * cfold.cs: Synchronize the folding with the code in expression.cs
2859         Binary.DoNumericPromotions for uint operands.
2860
2861         * attribute.cs: Revert patch from Raja, it introduced a regression
2862         while building Blam-1.2.1 (hard to isolate a test case).
2863
2864 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2865
2866         Fix for #55382
2867         * class.cs:
2868         (TypeContainer.Define): Renamed to DefineContainerMembers because of
2869         name collision.
2870         (MethodCore.parent_method): New member. The method we're overriding
2871         if this is an override method.
2872         (MethodCore.CheckBase): Moved from Method class and made common.
2873         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
2874         private.
2875         (MethodCore.CheckForDuplications): New abstract method. For custom
2876         member duplication search in a container
2877         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
2878         method and its return type.
2879         (Event.conflict_symbol): New member. Symbol with same name in the
2880         parent class.
2881
2882         * decl.cs:
2883         (MemberCache.FindMemberWithSameName): New method. The method
2884         is looking for conflict with inherited symbols.
2885
2886 2004-08-04  Martin Baulig  <martin@ximian.com>
2887
2888         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
2889
2890         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
2891
2892 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2893
2894         * report.cs (Message): New enum for better error, warning reference in
2895         the code.
2896         (MessageData): New inner abstract class. It generally handles printing of
2897         error and warning messages.
2898         Removed unused Error, Warning, Message methods.
2899
2900 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2901
2902         Fix for cs0592-8.cs test
2903         * attribute.cs
2904         (Attributable.ValidAttributeTargets): Made public.
2905         (Attribute.ExplicitTarget): New member for explicit target value.
2906         (Attribute.CheckTargets): Now we translate explicit attribute
2907         target to Target here.
2908
2909 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
2910
2911         * ecore.cs (MethodGroupExpr): new IsBase property.
2912
2913         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
2914
2915         * delegate.cs (DelegateCreation): store a MethodGroupExpr
2916         rather than an instance expr.
2917
2918         (DelegateCreation.Emit): Use the method group rather than
2919         the instance expression. Also, if you have base.Foo as the
2920         method for a delegate, make sure to emit ldftn, not ldftnvirt.
2921
2922         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
2923
2924         (NewDelegate.DoResolve): Only check for the existance of Invoke
2925         if the method is going to be needed. Use MethodGroupExpr.
2926
2927         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
2928
2929         * expression.cs: For pointer arith., make sure to use
2930         the size of the type, not the size of the pointer to
2931         the type.
2932
2933 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2934
2935         Fix for #60722
2936         * class.cs (Class): Added error CS0502 test.
2937
2938 2004-08-03  John Luke  <jluke@cfl.rr.com>
2939             Raja R Harinath  <rharinath@novell.com>
2940
2941         Fix for #60997.
2942         * attribute.cs (Attribute.complained_before): New flag.
2943         (Attribute.ResolveType, Attribute.Resolve),
2944         (Attribute.DefinePInvokeMethod): Set it.
2945         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
2946         
2947 2004-08-03  Martin Baulig  <martin@ximian.com>
2948
2949         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
2950         use a user-defined operator; we still need to do numeric
2951         promotions in case one argument is a builtin type and the other
2952         one has an implicit conversion to that type.  Fixes #62322.
2953
2954 2004-08-18  Martin Baulig  <martin@ximian.com>
2955
2956         * class.cs (Method.Define): Use the correct method name when
2957         creating the MethodBuilder for a generic method.
2958
2959 2004-08-17  Martin Baulig  <martin@ximian.com>
2960
2961         * generic.cs (Constraints): Support type parameter constraints.
2962
2963 2004-08-16  Martin Baulig  <martin@ximian.com>
2964
2965         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
2966         (Token.GENERIC_DIMENSION): New token; this is returned if we
2967         encounter an unbound generic type in a typeof() expression.
2968
2969         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
2970         this token is only generated while parsing a typeof() expression.
2971         (typeof_expression): Removed the old unbound_type hack.
2972
2973         * generic.cs (TypeArguments.IsUnbound): New public property.
2974
2975         * decl.cs (MemberName): Added support for unbound types.
2976
2977 2004-08-14  Martin Baulig  <martin@ximian.com>
2978
2979         * typemanager.cs
2980         (TypeManager.IsEqualGenericInstance): New static method.
2981         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
2982         just used to check accessibility, so follow the rules of 26.1.6.        
2983
2984         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
2985         ConstructedType instead of a TypeExpression if we have type arguments.
2986
2987         * cs-parser.jay (typeof_expression): Support unbound generic types.
2988
2989         * ecore.cs (UnboundTypeExpression): New public class.
2990
2991 2004-08-12  Martin Baulig  <martin@ximian.com>
2992
2993         * typemanager.cs (TypeManager.IsNestedChildOf): Use
2994         TypeManager.IsEqual() rather than `=='.
2995
2996         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
2997         generic instances as well.
2998
2999 2004-08-12  Martin Baulig  <martin@ximian.com>
3000
3001         * expression.cs (Invocation.InferType): We can only infer method
3002         type parameters.  Fixes #62647.
3003
3004 2004-08-11  Martin Baulig  <martin@ximian.com>
3005
3006         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
3007         before resolving the base classes.
3008
3009 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
3010
3011         * Makefile: install .mdb file too.
3012
3013 2004-08-05  Martin Baulig  <martin@ximian.com>
3014
3015         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
3016         initializer, the current type is just the TypeBuilder, not the
3017         instantiated generic type.
3018         (FieldExpr.IsFieldInitializer): New public property.
3019
3020 2004-08-04  Martin Baulig  <martin@ximian.com>
3021
3022         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
3023
3024         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
3025
3026 2004-08-03  Martin Baulig  <martin@ximian.com>
3027
3028         * class.cs (MethodData.Define): If we're an explicit
3029         implementation, remove the generic arity from the type name.
3030
3031 2004-08-03  Martin Baulig  <martin@ximian.com>
3032
3033         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
3034         use a user-defined operator; we still need to do numeric
3035         promotions in case one argument is a builtin type and the other
3036         one has an implicit conversion to that type.  Fixes #62322.
3037
3038 2004-08-02  Martin Baulig  <martin@ximian.com>
3039
3040         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
3041         `TypeExpr[]' array.
3042         (TypeContainer.GetClassBases): Return the unexpanded list of
3043         interfaces; we expand them later.
3044         (TypeContainer.DefineType): After creating the TypeBuilder, call
3045         TypeManager.ExpandInterfaces() to get an expanded and resolved
3046         list of interfaces.
3047
3048         * ecore.cs (TypeExpr.GetInterfaces): Removed
3049
3050         * generics.cs (Constraints.InterfaceConstraints): Remove.
3051         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
3052         register the interface constraints.
3053
3054         * typemanager.cs
3055         (TypeManager.AddUserType): Removed the `ifaces' argument.
3056         (TypeManager.AddTypeParameter): Likewise.
3057         (TypeManager.AddUserInterface): Removed, was unused.
3058         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
3059         `TypeExpr[]' array for the interfaces.
3060         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
3061         has been defined, returns a list of the resolved interfaces types.
3062         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
3063         (TypeManager.GetExplicitInterfaces): Likewise.  
3064
3065 2004-08-02  Martin Baulig  <martin@ximian.com>
3066
3067         * expression.cs (Invocation.EmitCall): If we're invoking a method
3068         on a type parameter, use the new `Constrained' prefix opcode.
3069
3070 2004-08-02  Martin Baulig  <martin@ximian.com>
3071
3072         * statement.cs (LocalInfo.Flags): Added `IsThis'.
3073         (LocalInfo.IsThis): New public property.
3074         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
3075
3076 2004-08-01  Martin Baulig  <martin@ximian.com>
3077
3078         * class.cs (TypeContainer.GetClassBases): Don't set the default
3079         here since we may get called from GetPartialBases().
3080         (TypeContainer.DefineType): If GetClassBases() didn't return a
3081         parent, use the default one.
3082
3083 2004-07-30  Martin Baulig  <martin@ximian.com>
3084
3085         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
3086
3087         * class.cs (SourceMethod): New public class, derive from the
3088         symbol writer's ISourceMethod.
3089         (Method): Use the new symbol writer API.
3090
3091         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
3092         as argument and use the new symbol writer.
3093
3094         * location.cs
3095         (SourceFile): Implement the symbol writer's ISourceFile.
3096         (Location.SymbolDocument): Removed.
3097         (Location.SourceFile): New public property.
3098
3099         * symbolwriter.cs: Use the new symbol writer API.
3100
3101 2004-07-30  Raja R Harinath  <rharinath@novell.com>
3102
3103         * Makefile (install-local): Remove.  Functionality moved to
3104         executable.make.
3105
3106 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
3107
3108         * Makefile: Install mcs.exe.config file together with mcs.exe.
3109         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
3110         correct runtime version.
3111         
3112 2004-07-25  Martin Baulig  <martin@ximian.com>
3113
3114         * class.cs
3115         (TypeContainer.RegisterOrder): Removed, this was unused.
3116         (TypeContainer, interface_order): Removed.
3117         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
3118         TypeContainer as argument since we can also be called with a
3119         `PartialContainer' for a partial class/struct/interface.
3120         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
3121         of checking whether we're an `Interface' - we could be a
3122         `PartialContainer'.
3123         (PartialContainer.Register): Override; call
3124         AddClass()/AddStruct()/AddInterface() on our parent.
3125
3126         * cs-parser.jay (interface_member_declaration): Add things to the
3127         `current_container', not the `current_class'.
3128
3129         * rootcontext.cs (RegisterOrder): The overloaded version which
3130         takes an `Interface' was unused, removed.
3131
3132         * typemanager.cs (TypeManager.LookupInterface): Return a
3133         `TypeContainer', not an `Interface'.
3134         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
3135         contain a `PartialContainer' for an interface, so check it's
3136         `Kind' to figure out what it is.
3137
3138 2004-07-25  Martin Baulig  <martin@ximian.com>
3139
3140         * class.cs (Class.DefaultTypeAttributes): New public constant.
3141         (Struct.DefaultTypeAttributes): Likewise.
3142         (Interface.DefaultTypeAttributes): Likewise.
3143         (PartialContainer.TypeAttr): Override this and add the
3144         DefaultTypeAttributes.
3145
3146 2004-07-25  Martin Baulig  <martin@ximian.com>
3147
3148         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
3149         we can just use the `Parent' field instead.
3150
3151 2004-07-25  Martin Baulig  <martin@ximian.com>
3152
3153         * class.cs (TypeContainer.Emit): Renamed to EmitType().
3154
3155 2004-07-25  Martin Baulig  <martin@ximian.com>
3156
3157         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
3158         our parts before defining any methods.
3159         (TypeContainer.VerifyImplements): Make this virtual.
3160         (ClassPart.VerifyImplements): Override and call VerifyImplements()
3161         on our PartialContainer.
3162
3163 2004-07-25  Martin Baulig  <martin@ximian.com>
3164
3165         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
3166
3167         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
3168         argument, we can just use the `Parent' field instead.
3169
3170         * class.cs
3171         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
3172         (MemberBase.DoDefine): Likewise.
3173
3174 2004-07-24  Martin Baulig  <martin@ximian.com>
3175
3176         * decl.cs (MemberCore.Parent): New public field.
3177         (DeclSpace.Parent): Moved to MemberCore.
3178
3179         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
3180         (MemberBase.ctor): Added TypeContainer argument, pass it to our
3181         parent's .ctor.
3182         (FieldBase, Field, Operator): Likewise.
3183         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
3184         (EventField, Event): Likewise.
3185
3186 2004-07-23  Martin Baulig  <martin@ximian.com>
3187
3188         * class.cs (PartialContainer): New public class.
3189         (ClassPart): New public class.
3190         (TypeContainer): Added support for partial classes.
3191         (TypeContainer.GetClassBases): Splitted some of the functionality
3192         out into GetNormalBases() and GetPartialBases().
3193
3194         * cs-tokenizer.cs (Token.PARTIAL): New token.
3195         (Tokenizer.consume_identifier): Added some hacks to recognize
3196         `partial', but only if it's immediately followed by `class',
3197         `struct' or `interface'.
3198
3199         * cs-parser.jay: Added support for partial clases.
3200
3201 2004-07-23  Martin Baulig  <martin@ximian.com>
3202
3203         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
3204         a `DeclSpace' and also made it readonly.
3205         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
3206         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
3207         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
3208
3209         * cs-parser.jay: Pass the `current_class', not the
3210         `current_container' (at the moment, this is still the same thing)
3211         to a new Method, Property, Event, Indexer or Constructor.
3212
3213 2004-07-23  Martin Baulig  <martin@ximian.com>
3214
3215         * cs-parser.jay (CSharpParser): Added a new `current_class' field
3216         and removed the `current_interface' one.
3217         (struct_declaration, class_declaration, interface_declaration):
3218         Set `current_class' to the newly created class/struct/interface;
3219         set their `Bases' and call Register() before parsing their body.
3220
3221 2004-07-23  Martin Baulig  <martin@ximian.com>
3222
3223         * class.cs (Kind): New public enum.
3224         (TypeContainer): Made this class abstract.
3225         (TypeContainer.Kind): New public readonly field.
3226         (TypeContainer.CheckDef): New public method; moved here from
3227         cs-parser.jay.
3228         (TypeContainer.Register): New public abstract method.
3229         (TypeContainer.GetPendingImplementations): New public abstract
3230         method.
3231         (TypeContainer.GetClassBases): Removed the `is_class' and
3232         `is_iface' parameters.
3233         (TypeContainer.DefineNestedTypes): Formerly known as
3234         DoDefineType().
3235         (ClassOrStruct): Made this class abstract.
3236
3237         * tree.cs (RootTypes): New public type. 
3238
3239 2004-07-20  Martin Baulig  <martin@ximian.com>
3240
3241         * tree.cs (Tree.RecordNamespace): Removed.
3242         (Tree.Namespaces): Removed.
3243
3244         * rootcontext.cs (RootContext.IsNamespace): Removed.
3245
3246         * cs-parser.jay (namespace_declaration): Just create a new
3247         NamespaceEntry here.
3248
3249 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
3250
3251         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
3252         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
3253         entry to make sure it runs in the correct runtime version.
3254         
3255 2004-07-18  Martin Baulig  <martin@ximian.com>
3256
3257         * generic.cs (ConstructedType.CheckConstraints): Improved
3258         constraints checking.
3259
3260 2004-07-18  Martin Baulig  <martin@ximian.com>
3261
3262         * expression.cs (Invocation.BetterMethod): Call
3263         TypeManager.TypeToCoreType() on all types and removed my previous
3264         hack; we're already doig the right thing here.
3265
3266 2004-07-17  Martin Baulig  <martin@ximian.com>
3267
3268         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
3269
3270 2004-07-16  Martin Baulig  <martin@ximian.com>
3271
3272         * iterators.cs: Added generics support.
3273
3274 2004-07-16  Martin Baulig  <martin@ximian.com>
3275
3276         * iterators.cs: Rewrote this.  We're now using one single Proxy
3277         class for both the IEnumerable and the IEnumerator interface and
3278         `Iterator' derives from Class so we can use the high-level API.
3279
3280         * class.cs (TypeContainer.AddIterator): New method.
3281         (TypeContainer.DoDefineType): New protected virtual method, which
3282         is called from DefineType().
3283         (TypeContainer.DoDefineMembers): Call DefineType() and
3284         DefineMembers() on all our iterators.
3285         (TypeContainer.Emit): Call Emit() on all our iterators.
3286         (TypeContainer.CloseType): Call CloseType() on all our iterators.
3287
3288         * codegen.cs (EmitContext.CurrentIterator): New public field.
3289
3290 2004-07-15  Martin Baulig  <martin@ximian.com>
3291
3292         * typemanager.cs
3293         (TypeManager.not_supported_exception_type): New type.   
3294
3295 2004-07-14  Martin Baulig  <martin@ximian.com>
3296
3297         * typemanager.cs
3298         (TypeManager.generic_ienumerable_type): New type.
3299         (TypeManager.generic_ienumerator_type): New type.
3300
3301         * rootcontext.cs
3302         (RootContext.interfaces_first_stage): Added
3303         "System.Collections.Generic.IEnumerator`1" and
3304         "System.Collections.Generic.IEnumerable`1".     
3305
3306 2004-07-14  Martin Baulig  <martin@ximian.com>
3307
3308         * iterators.cs: Use real error numbers.
3309
3310 2004-07-14  Martin Baulig  <martin@ximian.com>
3311
3312         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
3313         requires this to be a System.Collection.IEnumerable and not a
3314         class implementing that interface.
3315         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
3316
3317 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
3318
3319         * class.cs: Fixed previous fix, it broke some error tests.
3320
3321 2004-07-12  Martin Baulig  <martin@ximian.com>
3322
3323         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
3324         Fixes #61293.
3325
3326 2004-07-14  Martin Baulig  <martin@ximian.com>
3327
3328         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
3329         an exclamation mark (!) for the generic arity to reflect the
3330         latest spec changes; ie. use "System.Collections.Generic.IList`1".
3331
3332 2004-07-13  Martin Baulig  <martin@ximian.com>
3333
3334         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
3335         specifiers being part of a type argument.
3336
3337 2004-07-13  Martin Baulig  <martin@ximian.com>
3338
3339         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
3340         name for generic types.
3341
3342 2004-07-13  Martin Baulig  <martin@ximian.com>
3343
3344         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
3345         bit to fix #60119.
3346
3347 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
3348
3349         * assign.cs (LocalTemporary): Add new argument: is_address,If
3350         `is_address' is true, then the value that we store is the address
3351         to the real value, and not the value itself.
3352         
3353         * ecore.cs (PropertyExpr): use the new local temporary
3354         stuff to allow us to handle X.Y += z (where X is a struct)
3355
3356 2004-07-08  Martin Baulig  <martin@ximian.com>
3357
3358         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
3359         not always return, just like we're doing in Using.Resolve().
3360
3361 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
3362
3363         * cs-parser.jay (fixed_statement): flag this as Pinned.
3364
3365 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
3366
3367         * typemanager.cs (TypeManager): Removed MakePinned method, this
3368         mechanism is replaced with the .NET 2.x compatible mechanism of
3369         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
3370
3371         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
3372         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
3373         `IsFixed' property which has a different meaning.
3374
3375 2004-07-02  Raja R Harinath  <rharinath@novell.com>
3376
3377         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
3378         visible from inside a nested class, not just the names of the
3379         immediately enclosing class.
3380         Fix for bug #60730.
3381
3382 2004-06-24  Raja R Harinath  <rharinath@novell.com>
3383
3384         * expression.cs (BetterConversion): Remove buggy special-case
3385         handling of "implicit constant expression conversions".  At this
3386         point, we already know that the conversion is possible -- we're
3387         only checking to see which is better.
3388
3389 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3390
3391         * cs-parser.jay: Added error CS0210 test.
3392
3393 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3394
3395         * cs-parser.jay: Added error CS0134 test.
3396
3397 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3398
3399         Fix bug #52507
3400         * cs-parser.jay: Added error CS0145 test.
3401
3402 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3403
3404         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
3405
3406 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
3407         
3408         * expression.cs (StackAlloc.Resolve): The argument may not
3409         be a constant; deal with this case.
3410         
3411 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
3412
3413         * attribute.cs (IndexerName_GetIndexerName): Renamed to
3414         GetIndexerAttributeValue.
3415         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
3416
3417         * class.cs (Indexer.Define): Added error tests for CS0415,
3418         CS0609.
3419
3420 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
3421
3422         * attribute.cs (Attribute.Resolve): Keep field code in sync with
3423         property code.
3424
3425 2004-06-23  Martin Baulig  <martin@ximian.com>
3426
3427         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
3428         neither return nor throw, reset the barrier as well.  Fixes #60457.
3429
3430 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
3431
3432         * class.cs : EventAttributes is now set to None by default.
3433           This fixes bug #60459.
3434
3435 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
3436
3437         Fix bug #60219
3438         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
3439         Don't throw exception but return null (it's sufficient now).
3440
3441 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
3442
3443         * typemanager.cs (GetArgumentTypes): Faster implementation.
3444
3445 2004-06-18  Martin Baulig  <martin@ximian.com>
3446
3447         * attribute.cs (Attribute.Resolve): Check whether we're an
3448         EmptyCast which a Constant child.  Fixes #60333.
3449
3450 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
3451
3452         * statement.cs (EmitCollectionForeach): Account for the fact that
3453         not all valuetypes are in areas which we can take the address of.
3454         For these variables, we store to a temporary variable. Also, make
3455         sure that we dont emit a `callvirt' on a valuetype method.
3456
3457 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3458
3459         * expression.cs (StackAlloc.DoReSolve): Added test for
3460         negative parameter (CS0247).
3461
3462 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3463
3464         Fix bug #59792
3465         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
3466
3467 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3468
3469         Fix bug #59781
3470         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
3471         ulong.
3472
3473 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
3474
3475         Fix bug #58254 & cs1555.cs, cs1556.cs
3476         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
3477
3478 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
3479
3480         * cs-parser.jay: Added error CS1669 test for indexers.
3481
3482 2004-06-18  Martin Baulig  <martin@ximian.com>
3483
3484         * generics.cs (GenericMethod.ctor): Don't take an Attributes
3485         argument.  Fixes #60441.
3486
3487 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
3488         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
3489         The name needs to have the actual name of the method in order
3490         for other tests (such as the one in OverloadResolve for Invoke
3491         on a delegate) to work. As well, it does not really help
3492         error reporting because the method group had multiple methods.
3493         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
3494         Make profiling work.
3495         
3496 2004-06-13  Martin Baulig  <martin@ximian.com>
3497
3498         * cs-parser.jay: Don't allow generic attributes.
3499
3500 2004-06-13  Martin Baulig  <martin@ximian.com>
3501
3502         * class.cs (MemberBase.DoDefineBase): New protected method.
3503         (MemberBase.DoDefine): Compute the `flags' in the new
3504         DoDefineBase() which must be called first.
3505         (Method.Define): Call DoDefineBase() first so we have the flags
3506         when defining the generic method.
3507
3508         * cs-parser.jay (interface_method_declaration): Support generic methods.
3509
3510 2004-06-13  Martin Baulig  <martin@ximian.com>
3511
3512         * decl.cs (TypeName): Removed.
3513         (MemberName): Removed TypeName and MemberNow; now we just have
3514         MemberName.
3515
3516         * cs-parser.jay: Don't distinguish between type arguments and type
3517         parameters in the grammar and simplified the rules a bit.  The
3518         reduce/reduce conflicts are now gone (except the one we inherited
3519         from mcs).
3520
3521 2004-06-11  Martin Baulig  <martin@ximian.com>
3522
3523         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
3524         call this twice: for params and varargs methods.
3525
3526 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
3527
3528         * class.cs:
3529         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
3530
3531 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
3532
3533         * attribute.cs (Attribute.GetValidTargets): Made public.
3534
3535         * class.cs: 
3536         (AbstractPropertyEventMethod): New class for better code sharing.
3537         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
3538         CS1667 report.
3539         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
3540
3541 2004-06-09  Martin Baulig  <martin@ximian.com>
3542
3543         * cs-parser.jay: Removed a reduce/reduce conflict.
3544
3545 2004-06-03  Martin Baulig  <martin@ximian.com>
3546
3547         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
3548         GetSimpleName() and return a SimpleName.
3549
3550         * ecore.cs (SimpleName.Arguments): New public field.
3551         (SimpleName): Added overloaded ctor which takes an additional
3552         TypeArguments argument.
3553         (SimpleName.SimpleNameResolve): Added support for generic methods.
3554         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
3555         formerly in MemberAccess.DoResolve(), but we also need it in
3556         SimpleNameResolve().
3557
3558         * expression.cs (MemberAccess.DoResolve): Use the new
3559         MethodGroupExpr.ResolveGeneric().       
3560
3561 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3562
3563         * decl.cs: If possible, use lookuptypedirect here. We can only do
3564         this if there is no `.' after the namespace. Avoids using
3565         LookupType, which does lots of slow processing.
3566         (FindNestedType) New method, does what it says :-).
3567         * namespace.cs: use LookupTypeDirect.
3568         * rootcontext.cs: use membercache, if possible.
3569         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
3570
3571 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3572
3573         * expression.cs:
3574         According to the spec, 
3575
3576         In a member access of the form E.I, if E is a single identifier,
3577         and if the meaning of E as a simple-name (§7.5.2) is a constant,
3578         field, property, localvariable, or parameter with the same type as
3579         the meaning of E as a type-name (§3.8), then both possible
3580         meanings of E are permitted.
3581
3582         We did not check that E as a simple-name had the same type as E as
3583         a type name.
3584
3585         This trivial check gives us 5-7% on bootstrap time.
3586
3587 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3588
3589         * expression.cs (Invocation.OverloadResolve): Avoid the
3590         use of hashtables and boxing here by allocating on demand.
3591
3592 2004-05-30  Martin Baulig  <martin@ximian.com>
3593
3594         * rootcontext.cs (RootContext.LookupType): Don't cache things if
3595         we're doing a silent lookup.  Don't try to lookup nested types in
3596         TypeManager.object_type (thanks to Ben Maurer).
3597
3598 2004-05-30  Martin Baulig  <martin@ximian.com>
3599
3600         Committing a patch from Ben Maurer.
3601
3602         * rootcontext.cs (RootContext.LookupType): Cache negative results.
3603
3604 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3605
3606         * convert.cs: add a trivial cache for overload operator resolution.
3607
3608 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
3609
3610         * attribute.cs
3611         (AttributeTester.GetObsoleteAttribute): Returns instance of
3612         ObsoleteAttribute when type is obsolete.
3613
3614         * class.cs
3615         (TypeContainer.VerifyObsoleteAttribute): Override.
3616         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
3617         (MethodCode.VerifyObsoleteAttribute): Override.
3618         (MemberBase.VerifyObsoleteAttribute): Override.
3619
3620         * decl.cs
3621         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
3622         and report proper error.
3623
3624         *delegate.cs
3625         (Delegate.VerifyObsoleteAttribute): Override.
3626
3627         * ecore.cs
3628         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
3629         and report proper error.
3630         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
3631
3632         * enum.cs
3633         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
3634         and enum member.
3635
3636         * expression.cs
3637         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
3638         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
3639         Added test for ObsoleteAttribute.
3640
3641         * statement.cs
3642         (Catch): Derived from Statement.
3643
3644 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3645
3646         * decl.cs: If possible, use lookuptypedirect here. We can only do
3647         this if there is no `.' after the namespace. Avoids using
3648         LookupType, which does lots of slow processing.
3649         (FindNestedType) New method, does what it says :-).
3650         * namespace.cs: use LookupTypeDirect.
3651         * rootcontext.cs: use membercache, if possible.
3652         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
3653
3654 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3655
3656         * expression.cs:
3657         According to the spec, 
3658
3659         In a member access of the form E.I, if E is a single identifier,
3660         and if the meaning of E as a simple-name (§7.5.2) is a constant,
3661         field, property, localvariable, or parameter with the same type as
3662         the meaning of E as a type-name (§3.8), then both possible
3663         meanings of E are permitted.
3664
3665         We did not check that E as a simple-name had the same type as E as
3666         a type name.
3667
3668         This trivial check gives us 5-7% on bootstrap time.
3669
3670 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
3671
3672         Fixed bug #59071 & cs0160.cs
3673         * statement.cs (Try.Resolve): Check here whether order of catch
3674         clauses matches their dependencies.
3675
3676 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
3677
3678         Fixed bug #58624
3679         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
3680         unsafe type.
3681
3682 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3683
3684         * expression.cs (Invocation.OverloadResolve): Avoid the
3685         use of hashtables and boxing here by allocating on demand.
3686
3687 2004-05-30  Martin Baulig  <martin@ximian.com>
3688
3689         * rootcontext.cs (RootContext.LookupType): Don't cache things if
3690         we're doing a silent lookup.  Don't try to lookup nested types in
3691         TypeManager.object_type (thanks to Ben Maurer).
3692
3693 2004-05-30  Martin Baulig  <martin@ximian.com>
3694
3695         Committing a patch from Ben Maurer.
3696
3697         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
3698
3699 2004-05-29  Martin Baulig  <martin@ximian.com>
3700
3701         * class.cs (IMethodData.ShouldIgnore): New method.
3702
3703         * typemanager.cs (TypeManager.MethodFlags): Don't take a
3704         `Location' argument, we don't need it anywhere.  Use
3705         `IMethodData.ShouldIgnore ()' instead of
3706         `MethodData.GetMethodFlags ()'.
3707         (TypeManager.AddMethod): Removed.
3708         (TypeManager.AddMethod2): Renamed to AddMethod.
3709
3710 2004-05-29  Martin Baulig  <martin@ximian.com>
3711
3712         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
3713
3714         * convert.cs (Convert.ImplicitReferenceConversion): If we're
3715         converting from a class type S to an interface type and we already
3716         have an object on the stack, don't box it again.  Fixes #52578.
3717
3718 2004-05-29  Martin Baulig  <martin@ximian.com>
3719
3720         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
3721         Added support for `params' parameters.  Fixes #59267.
3722
3723 2004-05-29  Martin Baulig  <martin@ximian.com>
3724
3725         * literal.cs (NullPointer): Provide a private .ctor which sets
3726         `type' to TypeManager.object_type.  Fixes #59048.
3727
3728 2004-05-29  Martin Baulig  <martin@ximian.com>
3729
3730         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
3731         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
3732
3733         * ecore.cs (EventExpr.instance_expr): Make the field private.
3734
3735 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
3736
3737         Fixed bug #50080 & cs0214-2.cs
3738         * expression.cs (Cast.DoResolve): Check unsafe context here.
3739         
3740         * statement.cs (Resolve.DoResolve): Likewise.
3741
3742 2004-05-26  Martin Baulig  <martin@ximian.com>
3743
3744         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
3745
3746         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
3747         (RootContext.LookupType): Pass down the `silent' flag.
3748
3749 2004-05-25  Martin Baulig  <martin@ximian.com>
3750
3751         * expression.cs
3752         (MethodGroupExpr.IdenticalTypeName): New public property.
3753         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
3754         expression actually refers to a type.
3755
3756 2004-05-25  Martin Baulig  <martin@ximian.com>
3757
3758         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
3759         for #56176 and made it actually work.
3760
3761 2004-05-25  Martin Baulig  <martin@ximian.com>
3762
3763         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
3764         (FieldExpr, PropertyExpr): Override and implement
3765         CacheTemporaries.  Fixes #52279.
3766
3767 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
3768
3769         * location.cs: In the new compiler listing a file twice is a
3770         warning, not an error.
3771
3772 2004-05-24  Martin Baulig  <martin@ximian.com>
3773
3774         * enum.cs (Enum.DefineType): For the `BaseType' to be a
3775         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
3776
3777 2004-05-24  Martin Baulig  <martin@ximian.com>
3778
3779         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
3780         walking the `using' list.  Fixes #53921.
3781
3782 2004-05-24  Martin Baulig  <martin@ximian.com>
3783
3784         * const.cs (Const.LookupConstantValue): Added support for
3785         EmptyCast's; fixes #55251.
3786
3787 2004-05-24  Martin Baulig  <martin@ximian.com>
3788
3789         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
3790         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
3791         which does the CS0135 check.  The reason is that we first need to
3792         check whether the variable actually exists.
3793
3794 2004-05-24  Martin Baulig  <martin@ximian.com>
3795
3796         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
3797         than RootContext.LookupType() to find the explicit interface
3798         type.  Fixes #58584.
3799
3800 2004-05-24  Raja R Harinath  <rharinath@novell.com>
3801
3802         * Makefile: Simplify.  Use executable.make.
3803         * mcs.exe.sources: New file.  List of sources of mcs.exe.
3804
3805 2004-05-24  Anders Carlsson  <andersca@gnome.org>
3806
3807         * decl.cs:
3808         * enum.cs:
3809         Use the invariant culture when doing String.Compare for CLS case
3810         sensitivity.
3811         
3812 2004-05-23  Martin Baulig  <martin@ximian.com>
3813
3814         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
3815         don't have any dots.  Fixes #52622, added cs0246-8.cs.
3816
3817         * namespace.cs (NamespaceEntry.Lookup): Likewise.
3818
3819 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3820
3821         * class.cs (MemberBase.Define): Reuse MemberType member for 
3822         resolved type. Other methods can use it too.
3823
3824 2004-05-23  Martin Baulig  <martin@ximian.com>
3825
3826         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
3827         the variable also exists in the current block (otherwise, we need
3828         to report a CS0103).  Fixes #58670.
3829
3830 2004-05-23  Martin Baulig  <martin@ximian.com>
3831
3832         * flowanalysis.cs (Reachability.Reachable): Compute this
3833         on-the-fly rather than storing it as a field.
3834
3835 2004-05-23  Martin Baulig  <martin@ximian.com>
3836
3837         * flowanalysis.cs (Reachability.And): Manually compute the
3838         resulting `barrier' from the reachability.      
3839        
3840 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3841
3842         Fix bug #57835
3843         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
3844         instance of ObsoleteAttribute when symbol is obsolete.
3845
3846         * class.cs
3847         (IMethodData): Extended interface for ObsoleteAttribute support.
3848
3849 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3850
3851         * attribute.cs: Fix bug #55970
3852
3853 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3854
3855         Fix bug #52705
3856         * attribute.cs
3857         (GetObsoleteAttribute): New method. Creates the instance of
3858         ObsoleteAttribute.
3859         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
3860         ObsoleteAttribute when member is obsolete.
3861         (AttributeTester.Report_ObsoleteMessage): Common method for
3862         Obsolete error/warning reporting.
3863
3864         * class.cs
3865         (TypeContainer.base_classs_type): New member for storing parent type.
3866
3867         * decl.cs
3868         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
3869         for this MemberCore.
3870
3871 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3872
3873         * attribute.cs, const.cs: Fix bug #58590
3874
3875 2004-05-21  Martin Baulig  <martin@ximian.com>
3876
3877         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
3878         out parameters if the end of the method is unreachable.  Fixes
3879         #58098. 
3880
3881 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3882
3883         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
3884         Hari was right, why extra method.
3885
3886 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3887
3888         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
3889
3890 2004-05-20  Martin Baulig  <martin@ximian.com>
3891
3892         * delegate.cs: Convert this file to Unix mode - like the original
3893         version in mcs is.
3894
3895 2004-05-20  Martin Baulig  <martin@ximian.com>
3896
3897         * attribute.cs: Convert this file to Unix mode - like the original
3898         version in mcs is.
3899
3900 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
3901
3902        Fix bug #58688 (MCS does not report error when the same attribute
3903        is assigned twice)
3904
3905        * attribute.cs (Attribute.Emit): Distinction between null and default.
3906
3907 2004-05-19  Raja R Harinath  <rharinath@novell.com>
3908
3909        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
3910        of a top-level attribute without an attribute target.
3911        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
3912        Make non-static.
3913        (Attribute.Conditional_GetConditionName), 
3914        (Attribute.Obsolete_GetObsoleteMessage): Update.
3915        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
3916        part of ScanForIndexerName.
3917        (Attribute.CanIgnoreInvalidAttribute): New function.
3918        (Attribute.ScanForIndexerName): Move to ...
3919        (Attributes.ScanForIndexerName): ... here.
3920        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
3921        (Attributes.Search): New internal variant that can choose not to
3922        complain if types aren't resolved.  The original signature now
3923        complains.
3924        (Attributes.GetClsCompliantAttribute): Use internal variant, with
3925        complaints suppressed.
3926        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
3927        only if it not useful.
3928        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
3929        top-level for attributes that are shared between the assembly
3930        and a top-level class.
3931        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
3932        * class.cs: Update to reflect changes.
3933        (DefineIndexers): Fuse loops.
3934        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
3935        a couple more variants of attribute names.
3936
3937 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
3938
3939         Fix bug #52585 (Implemented explicit attribute declaration)
3940
3941         * attribute.cs:
3942         (Attributable.ValidAttributeTargets): New abstract method. It gets
3943         list of valid attribute targets for explicit target declaration.
3944         (Attribute.Target): It holds target itself.
3945         (AttributeSection): Removed.
3946         (Attribute.CheckTargets): New method. It checks whether attribute
3947         target is valid for the current element.
3948
3949         * class.cs:
3950         (EventProperty): New class. For events that are declared like
3951         property (with add and remove accessors).
3952         (EventField): New class. For events that are declared like field.
3953         class.cs
3954
3955         * cs-parser.jay: Implemented explicit attribute target declaration.
3956
3957         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
3958         Override ValidAttributeTargets.
3959
3960         * parameter.cs:
3961         (ReturnParameter): Class for applying custom attributes on 
3962         the return type.
3963         (ParameterAtribute): New class. Class for applying custom
3964         attributes on the parameter type.
3965
3966 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
3967
3968         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
3969         definitions. 
3970
3971         (Method): Allow UNSAFE here.
3972
3973         * modifiers.cs: Support unsafe reporting.
3974
3975 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
3976
3977         * decl.cs: Fix bug #58478.
3978
3979 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3980
3981         * statement.cs: When checking for unreachable code on an EmptyStatement,
3982         set the location. Fixes bug #58488.
3983
3984 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
3985
3986         * driver.cs: Add -pkg handling.
3987
3988         From Gonzalo: UseShelLExecute=false
3989
3990 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
3991
3992         * attribute.cs:
3993         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
3994         for attribute.
3995         (Attribute.IsClsCompliaceRequired): Moved to base for better
3996         accesibility.
3997         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
3998         when attribute is AttributeUsageAttribute.
3999         (Attribute.GetValidTargets): Simplified.
4000         (Attribute.GetAttributeUsage): New method returns AttributeUsage
4001         attribute for this type.
4002         (Attribute.ApplyAttributes): Method renamed to Emit and make
4003         non-static.
4004         (GlobalAttributeSection): New class for special handling of global
4005         attributes (assembly, module).
4006         (AttributeSection.Emit): New method.
4007
4008         * class.cs: Implemented Attributable abstract methods.
4009         (MethodCore.LabelParameters): Moved to Parameter class.
4010         (Accessor): Is back simple class.
4011         (PropertyMethod): Implemented Attributable abstract class.
4012         (DelegateMethod): Implemented Attributable abstract class.
4013         (Event): New constructor for disctintion between normal Event
4014         and Event with accessors.
4015
4016         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
4017
4018         * codegen.cs, const.cs, decl.cs, delegate.cs:
4019         (CommonAssemblyModulClass): Implemented Attributable abstract class
4020         and simplified.
4021
4022         * enum.cs: Implement IAttributeSupport interface.
4023         (EnumMember): New class for emum members. Implemented Attributable
4024         abstract class
4025
4026         * parameter.cs:
4027         (ParameterBase): Is abstract.
4028         (ReturnParameter): New class for easier [return:] attribute handling.
4029
4030         * typemanager.cs: Removed builder_to_attr.
4031
4032 2004-05-11  Raja R Harinath  <rharinath@novell.com>
4033
4034         Fix bug #57151.
4035         * attribute.cs (Attribute.GetPositionalValue): New function.
4036         * class.cs (TypeContainer.VerifyMembers): New function.
4037         (TypeContainer.Emit): Use it.
4038         (ClassOrStruct): New base class for Class and Struct.
4039         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
4040         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
4041         class.
4042         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
4043         then each non-static field should have a FieldOffset attribute.
4044         Otherwise, none of the fields should have a FieldOffset attribute.
4045         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
4046         and FieldOffset attributes.
4047         * typemanager.cs (TypeManager.struct_layout_attribute_type)
4048         (TypeManager.field_offset_attribute_type): New core types.
4049         (TypeManager.InitCoreTypes): Initialize them.
4050
4051 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
4052
4053         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
4054         Return correct type.
4055         From bug #58270.
4056
4057 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
4058
4059         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
4060         be implicitly converted to ulong.
4061         
4062         * expression.cs: The logic for allowing operator &, | and ^ worked
4063         was wrong, it worked before because we did not report an error in
4064         an else branch.  Fixes 57895.
4065
4066         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
4067         allow volatile fields to be reference types.
4068
4069 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
4070
4071         * driver.cs: Add support for /debug-
4072
4073 2004-05-07  Raja R Harinath  <rharinath@novell.com>
4074
4075         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
4076         Add a 'complain' parameter to silence errors.
4077         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
4078         silently overlooked type-resolutions.
4079         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
4080         to reflect changes.
4081         (Attributes.Search): New function.
4082         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
4083         (Attributes.GetAttributeFullName): Remove hack.
4084         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
4085         Update to reflect changes.
4086         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
4087         Use Attributes.Search instead of nested loops.
4088
4089 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
4090
4091         * decl.cs:
4092         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
4093         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
4094         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
4095
4096         * report.cs: (Report.Warning): Renamed to Warning_T because of
4097         parameter collision.
4098
4099 2004-05-05  Raja R Harinath  <rharinath@novell.com>
4100
4101         * expression.cs (MemberAccess.ResolveMemberAccess):
4102         Exit with non-zero status after Report.Error.
4103         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
4104         Likewise.
4105         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
4106
4107 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
4108
4109         * support.cs: Don't hang when the file is empty.
4110
4111 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
4112
4113         * support.cs: In SeekableStreamReader, compute the preamble size of the
4114           underlying stream. Position changes should take into account that initial
4115           count of bytes.
4116
4117 2004-05-03  Todd Berman  <tberman@sevenl.net>
4118
4119         * driver.cs: remove unused GetSysVersion function.
4120
4121 2004-05-03  Todd Berman  <tberman@sevenl.net>
4122
4123         * driver.cs: Remove the hack from saturday, as well as the hack
4124         from jackson (LoadAssemblyFromGac), also adds the CWD to the
4125         link_paths to get that bit proper.
4126
4127 2004-05-01  Todd Berman  <tberman@sevenl.net>
4128
4129         * driver.cs: Try a LoadFrom before a Load, this checks the current
4130         path. This is currently a bug in mono that is be fixed, however, this
4131         provides a workaround for now. This will be removed when the bug
4132         is fixed.
4133
4134 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
4135
4136         * CryptoConvert.cs: Updated to latest version. Fix issue with 
4137         incomplete key pairs (#57941).
4138
4139 2004-05-01  Todd Berman  <tberman@sevenl.net>
4140
4141         * driver.cs: Remove '.' from path_chars, now System.* loads properly
4142         from the GAC
4143
4144 2004-04-30  Jackson Harper  <jackson@ximian.com>
4145
4146         * codegen.cs: Open keys readonly.
4147         
4148 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4149
4150         * typemanager.cs: don't report cyclic struct layout when a struct
4151         contains 2 or more fields of the same type. Failed for Pango.AttrShape
4152         which has 2 Pango.Rectangle fields.
4153
4154 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4155
4156         * expression.cs: Handle IntPtr comparisons with IL code
4157         rather than a method call.
4158
4159 2004-04-29  Martin Baulig  <martin@ximian.com>
4160
4161         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
4162         the list of PropertyInfo's in class hierarchy and find the
4163         accessor.  Fixes #56013.
4164
4165 2004-04-29  Martin Baulig  <martin@ximian.com>
4166
4167         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
4168
4169 2004-04-29  Martin Baulig  <martin@ximian.com>
4170
4171         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
4172
4173         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
4174
4175 2004-04-29  Martin Baulig  <martin@ximian.com>
4176
4177         * class.cs (ConstructorInitializer.Resolve): Check whether the
4178         parent .ctor is accessible.  Fixes #52146.
4179
4180 2004-04-29  Martin Baulig  <martin@ximian.com>
4181
4182         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
4183
4184         * statement.cs (Using.EmitLocalVariableDecls): Use
4185         TypeManager.idisposable_type, not typeof (IDisposable).
4186         (Foreach.EmitCollectionForeach): Added support for valuetypes.
4187
4188 2004-04-29  Martin Baulig  <martin@ximian.com>
4189
4190         * class.cs (Event.Define): Don't emit the field and don't set
4191         RTSpecialName and SpecialName for events on interfaces.  Fixes
4192         #57703. 
4193
4194 2004-04-29  Raja R Harinath  <rharinath@novell.com>
4195
4196         Refactor Attribute.ApplyAttributes.
4197         * attribute.cs (Attributable): New base class for objects that can
4198         have Attributes applied on them.
4199         (Attribute): Make AttributeUsage fields public.
4200         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
4201         (Attribute.IsInternalCall): New property.
4202         (Attribute.UsageAttr): Convert to a public read-only property.
4203         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
4204         (Attribute.ResolveType, Attribute.Resolve)
4205         (Attribute.ScanForIndexerName): Update to reflect changes.
4206         (Attribute.CheckAttributeTarget): Re-format.
4207         (Attribute.ApplyAttributes): Refactor, to various
4208         Attributable.ApplyAttributeBuilder methods.
4209         * decl.cs (MemberCore): Make Attributable.
4210         * class.cs (Accessor): Make Attributable.
4211         (MethodData.ApplyAttributes): Use proper attribute types, not
4212         attribute names.
4213         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
4214         (TypeContainer.ApplyAttributeBuilder)
4215         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
4216         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
4217         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
4218         (Operator.ApplyAttributeBuilder): New factored-out methods.
4219         * const.cs (Const.ApplyAttributeBuilder): Likewise.
4220         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
4221         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
4222         * parameter.cs (ParameterBase): New Attributable base class
4223         that can also represent Return types.
4224         (Parameter): Update to the changes.
4225
4226 2004-04-29  Jackson Harper  <jackson@ximian.com>
4227
4228         * driver.cs: Prefer the corlib system version when looking for
4229         assemblies in the GAC. This is still a hack, but its a better hack
4230         now.
4231         
4232 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
4233
4234         * decl.cs, enum.cs: Improved error 3005 reporting.
4235   
4236         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
4237         (related_symbols): New private member for list of symbols
4238         related to reported error/warning.
4239         
4240         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
4241
4242 2004-04-29  Martin Baulig  <martin@ximian.com>
4243
4244         * ecore.cs (Expression.Constantify): If we're an enum and
4245         TypeManager.TypeToCoreType() doesn't give us another type, use
4246         t.UnderlyingSystemType.  Fixes #56178.  
4247
4248 2004-04-29  Martin Baulig  <martin@ximian.com>
4249
4250         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
4251         interfaces and for each interface, only add members directly
4252         declared in that interface.  Fixes #53255.
4253
4254 2004-04-28  Martin Baulig  <martin@ximian.com>
4255
4256         * expression.cs (ConditionalLogicalOperator): Use a temporary
4257         variable for `left' to avoid that we evaluate it more than once;
4258         bug #52588.
4259
4260 2004-04-28  Martin Baulig  <martin@ximian.com>
4261
4262         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
4263         `void[]' (CS1547).
4264
4265 2004-04-28  Martin Baulig  <martin@ximian.com>
4266
4267         * statement.cs (LocalInfo.Resolve): Check whether the type is not
4268         void (CS1547).
4269
4270         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
4271         whether the type is not void (CS1547).
4272
4273 2004-04-28  Martin Baulig  <martin@ximian.com>
4274
4275         * expression.cs (Unary.DoResolveLValue): Override this and report
4276         CS0131 for anything but Operator.Indirection.
4277
4278 2004-04-28  Martin Baulig  <martin@ximian.com>
4279
4280         Committing a patch from Ben Maurer; see bug #50820.
4281
4282         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
4283         check for classes.
4284
4285         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
4286         classes.        
4287
4288 2004-04-28  Martin Baulig  <martin@ximian.com>
4289
4290         Committing a patch from Ben Maurer; see bug #50820.
4291
4292         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
4293         check for classes.
4294
4295         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
4296         classes.        
4297
4298 2004-04-28  Martin Baulig  <martin@ximian.com>
4299
4300         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
4301         (Block.AddLabel): Call DoLookupLabel() to only search in the
4302         current block.
4303
4304 2004-04-28  Martin Baulig  <martin@ximian.com>
4305
4306         * cfold.cs (ConstantFold.BinaryFold): Added special support for
4307         comparing StringConstants and NullLiterals in Equality and Inequality.
4308
4309 2004-04-28  Jackson Harper  <jackson@ximian.com>
4310
4311         * driver.cs: Attempt to load referenced assemblies from the
4312         GAC. This is the quick and dirty version of this method that
4313         doesnt take into account versions and just takes the first
4314         canidate found. Will be good enough for now as we will not have more
4315         then one version installed into the GAC until I update this method.
4316
4317 2004-04-28  Martin Baulig  <martin@ximian.com>
4318
4319         * typemanager.cs (TypeManager.CheckStructCycles): New public
4320         static method to check for cycles in the struct layout.
4321
4322         * rootcontext.cs (RootContext.PopulateTypes): Call
4323         TypeManager.CheckStructCycles() for each TypeContainer.
4324         [Note: We only need to visit each type once.]
4325
4326 2004-04-28  Martin Baulig  <martin@ximian.com>
4327
4328         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
4329
4330         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
4331         success and added `out object value'.  Use a `bool resolved' field
4332         to check whether we've already been called rather than
4333         `ConstantValue != null' since this breaks for NullLiterals.
4334
4335 2004-04-28  Raja R Harinath  <rharinath@novell.com>
4336
4337         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
4338         setting of this flag, since the 'set' method may be non-public.
4339
4340 2004-04-28  Raja R Harinath  <rharinath@novell.com>
4341
4342         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
4343         check on current_vector.Block.
4344
4345 2004-04-27  Martin Baulig  <martin@ximian.com>
4346
4347         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
4348         a field initializer.  Fixes #56459.
4349
4350 2004-04-27  Martin Baulig  <martin@ximian.com>
4351
4352         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
4353         we're not attempting to use an indexer.  Fixes #52154.
4354
4355 2004-04-27  Martin Baulig  <martin@ximian.com>
4356
4357         * statement.cs (Return): Don't create a return label if we don't
4358         need it; reverts my change from January 20th.  Thanks to Ben
4359         Maurer for this.
4360
4361 2004-04-27  Martin Baulig  <martin@ximian.com>
4362
4363         According to the spec, `goto' can only leave a nested scope, but
4364         never enter it.
4365
4366         * statement.cs (Block.LookupLabel): Only lookup in the current
4367         block, don't recurse into parent or child blocks.
4368         (Block.AddLabel): Check in parent and child blocks, report
4369         CS0140/CS0158 if we find a duplicate.
4370         (Block): Removed this indexer for label lookups.
4371         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
4372         this already does the error reporting for us.
4373
4374         * flowanalysis.cs
4375         (FlowBranching.UsageVector.Block): New public variable; may be null.
4376         (FlowBranching.CreateSibling): Added `Block' argument.
4377         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
4378         label for the target of a `goto' and check whether we're not
4379         leaving a `finally'.
4380
4381 2004-04-27  Martin Baulig  <martin@ximian.com>
4382
4383         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
4384         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
4385         just for returns).
4386
4387 2004-04-27  Martin Baulig  <martin@ximian.com>
4388
4389         * statement.cs (Block.AddLabel): Also check for implicit blocks
4390         and added a CS0158 check.
4391
4392 2004-04-27  Martin Baulig  <martin@ximian.com>
4393
4394         * flowanalysis.cs (FlowBranchingLoop): New class.
4395         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
4396         UsageVector's instead of an ArrayList.
4397         (FlowBranching.Label): Likewise.
4398         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
4399         (FlowBranching.AddBreakVector): New method.
4400
4401 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
4402
4403         * attribute.cs: Small regression fix: only convert the type if we
4404         the type is different, fixes System.Drawing build.
4405
4406 2004-04-27  Martin Baulig  <martin@ximian.com>
4407
4408         * attribute.cs (Attribute.Resolve): If we have a constant value
4409         for a named field or property, implicity convert it to the correct
4410         type.
4411
4412 2004-04-27  Raja R Harinath  <rharinath@novell.com>
4413
4414         * statement.cs (Block.Block): Implicit blocks share
4415         'child_variable_names' fields with parent blocks.
4416         (Block.AddChildVariableNames): Remove.
4417         (Block.AddVariable): Mark variable as "used by a child block" in
4418         every surrounding block.
4419         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
4420         been used in a child block, complain about violation of "Invariant
4421         meaning in blocks" rule.
4422         * cs-parser.jay (declare_local_variables): Don't use
4423         AddChildVariableNames.
4424         (foreach_statement): Don't create an implicit block: 'foreach'
4425         introduces a scope.
4426
4427 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
4428
4429         * convert.cs (ImplicitNumericConversion): 0 is also positive when
4430         converting from 0L to ulong.  Fixes 57522.
4431
4432 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
4433
4434         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
4435         derived class hides via 'new' keyword field from base class (test-242.cs).
4436         TODO: Handle this in the more general way.
4437         
4438         * class.cs (CheckBase): Ditto.
4439
4440 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
4441
4442         * decl.cs (caching_flags): New member for storing cached values
4443         as bit flags.
4444         (MemberCore.Flags): New enum where bit flags for caching_flags
4445         are defined.
4446         (MemberCore.cls_compliance): Moved to caching_flags.
4447         (DeclSpace.Created): Moved to caching_flags.
4448
4449         * class.cs: Use caching_flags instead of DeclSpace.Created
4450         
4451 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
4452
4453         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
4454         if we are only a derived class, not a nested class.
4455
4456         * typemanager.cs: Same as above, but do this at the MemberLookup
4457         level (used by field and methods, properties are handled in
4458         PropertyExpr).   Allow for the qualified access if we are a nested
4459         method. 
4460
4461 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
4462
4463         * class.cs: Refactoring.
4464         (IMethodData): New inteface; Holds links to parent members
4465         to avoid member duplication (reduced memory allocation).
4466         (Method): Implemented IMethodData interface.
4467         (PropertyBase): New inner classes for get/set methods.
4468         (PropertyBase.PropertyMethod): Implemented IMethodData interface
4469         (Event): New inner classes for add/remove methods.
4470         (Event.DelegateMethod): Implemented IMethodData interface.
4471
4472         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
4473         EmitContext (related to class.cs refactoring).
4474
4475 2004-04-21  Raja R Harinath  <rharinath@novell.com>
4476
4477         * delegate.cs (Delegate.VerifyApplicability): If the number of
4478         arguments are the same as the number of parameters, first try to
4479         verify applicability ignoring  any 'params' modifier on the last
4480         parameter.
4481         Fixes #56442.
4482
4483 2004-04-08  Martin Baulig  <martin@ximian.com>
4484
4485         Merged latest changes into gmcs.  Please keep this comment in
4486         here, it makes it easier for me to see what changed in MCS since
4487         the last time I merged.
4488
4489 2004-04-16  Raja R Harinath  <rharinath@novell.com>
4490
4491         * class.cs (TypeContainer.AddIndexer): Use
4492         'ExplicitInterfaceName' to determine if interface name was
4493         explicitly specified.  'InterfaceType' is not initialized at this time.
4494         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
4495         Indexers array is already in the required order.  Initialize
4496         'IndexerName' only if there are normal indexers.
4497         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
4498         (TypeContainer.Emit): Emit DefaultMember attribute only if
4499         IndexerName is initialized.
4500         Fixes #56300.
4501
4502 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
4503
4504         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
4505         Fixes #57007
4506
4507 2004-04-15  Raja R Harinath  <rharinath@novell.com>
4508
4509         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
4510         attributes.
4511         Fix for #56456.
4512
4513         * attribute.cs (Attribute.Resolve): Check for duplicate named
4514         attributes.
4515         Fix for #56463.
4516
4517 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
4518
4519         * iterators.cs (MarkYield): track whether we are in an exception,
4520         and generate code accordingly.  Use a temporary value to store the
4521         result for our state.
4522
4523         I had ignored a bit the interaction of try/catch with iterators
4524         since their behavior was not entirely obvious, but now it is
4525         possible to verify that our behavior is the same as MS .NET 2.0
4526
4527         Fixes 54814
4528
4529 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
4530
4531         * iterators.cs: Avoid creating temporaries if there is no work to
4532         do. 
4533
4534         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
4535         Enumerations, use TypeManager.EnumToUnderlying and call
4536         recursively. 
4537
4538         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
4539         bug #57013
4540
4541         (This.Emit): Use EmitContext.EmitThis to emit our
4542         instance variable.
4543
4544         (This.EmitAssign): Ditto.
4545
4546         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
4547         codepaths, we will move all the functionality into
4548         Mono.CSharp.This 
4549
4550         (FieldExpr.EmitAssign): Ditto.
4551
4552         This fixes several hidden bugs that I uncovered while doing a code
4553         review of this today.
4554
4555         * codegen.cs (EmitThis): reworked so the semantics are more clear
4556         and also support value types "this" instances.
4557
4558         * iterators.cs: Changed so that for iterators in value types, we
4559         do not pass the value type as a parameter.  
4560
4561         Initialization of the enumerator helpers is now done in the caller
4562         instead of passing the parameters to the constructors and having
4563         the constructor set the fields.
4564
4565         The fields have now `assembly' visibility instead of private.
4566
4567 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
4568
4569         * expression.cs (Argument.Resolve): Check if fields passed as ref
4570         or out are contained in a MarshalByRefObject.
4571
4572         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
4573         another compiler type.
4574
4575 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
4576
4577         * class.cs (Indexer.Define): use the new name checking method.
4578         Also, return false on an error.
4579         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
4580         (is_identifier_[start/part]_character): make static.
4581
4582 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
4583
4584         * expression.cs (Binary.ResolveOperator): Do no append strings
4585         twice: since we can be invoked more than once (array evaluation)
4586         on the same concatenation, take care of this here.  Based on a fix
4587         from Ben (bug #56454)
4588
4589 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
4590
4591         * codegen.cs: Fix another case where CS1548 must be reported (when 
4592         delay-sign isn't specified and no private is available #56564). Fix
4593         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
4594         error when MCS is used on the MS runtime and we need to delay-sign 
4595         (which seems unsupported by AssemblyBuilder - see #56621).
4596
4597 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
4598
4599         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
4600         (TypeManager.ComputeNamespaces): Faster implementation for
4601         Microsoft runtime.
4602
4603         * compiler.csproj: Updated AssemblyName to mcs.
4604
4605 2004-05-11  Jackson Harper  <jackson@ximian.com>
4606
4607         * Makefile: Preserve MONO_PATH
4608         
4609 2004-05-11  Jackson Harper  <jackson@ximian.com>
4610
4611         * Makefile: Use mono and mcs to build gmcs
4612         
4613 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
4614
4615         * codegen.cs: Add patch from Robert Shade
4616         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
4617         sync with mcs.
4618
4619 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
4620
4621         * CryptoConvert.cs: Updated to latest version. Fix issue with 
4622         incomplete key pairs (#57941).
4623
4624 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
4625
4626         * codegen.cs: Fix another case where CS1548 must be reported (when 
4627         delay-sign isn't specified and no private is available #56564). Fix
4628         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
4629         error when MCS is used on the MS runtime and we need to delay-sign 
4630         (which seems unsupported by AssemblyBuilder - see #56621).
4631
4632 2004-04-29  Jackson Harper  <jackson@ximian.com>
4633
4634         * Makefile: Set MONO_PATH to use the bootstrap corlib
4635         * driver.cs: Check the GAC for referenced assemblies.
4636                 
4637 2004-04-29  Martin Baulig  <martin@ximian.com>
4638
4639         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
4640
4641 2004-04-07  Martin Baulig  <martin@ximian.com>
4642
4643         * expression.cs (Binary.ResolveOperator): Added special case for
4644         Equality/Inequality between a type parameter and a null literal.
4645
4646 2004-04-07  Martin Baulig  <martin@ximian.com>
4647
4648         * convert.cs: Check null literal -> type parameter conversions.
4649
4650 2004-04-07  Martin Baulig  <martin@ximian.com>
4651
4652         * generic.cs (ConstructedType.CheckConstraints): Enforce the
4653         `class' and `struct' constraints.
4654
4655 2004-04-07  Martin Baulig  <martin@ximian.com>
4656
4657         * generic.cs (SpecialConstraint): New public enum.
4658         (Constraints.Resolve): Added support for the `class' and `struct'
4659         constraints.
4660
4661         * cs-parser.jay (type_parameter_constraint): Added support for the
4662         `class' and `struct' constraints.
4663
4664 2004-04-07  Martin Baulig  <martin@ximian.com>
4665
4666         * support.cs (GenericConstraints): Replaced `Types' by
4667         `ClassConstraint' and `InterfaceConstraints'; added
4668         `HasClassConstraint'.   
4669
4670 2004-04-07  Martin Baulig  <martin@ximian.com>
4671
4672         * generic.cs
4673         (Constraints.InterfaceConstraints): New public property.
4674         (Constraints.Types): Make this property public
4675         (TypeParameter): Implement IMemberContainer.
4676         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
4677         instead of a TypeBuilder/MethodBuilder; pass the interface
4678         constraints to TypeManager.AddTypeParameter().
4679         (TypeParameter.DefineType): Just take an EmitContext and no
4680         TypeBuilder/MethodBuilder.  Use the new public API.
4681
4682         * typemanager.cs (TypeManager.AddTypeParameter): Added
4683         `TypeExpr[]' argument; add the interfaces to the
4684         `builder_to_ifaces' hash.
4685         (TypeManager.LookupMemberContainer): For
4686         GenericTypeParameterBuilders, get the TypeParameter from the
4687         `builder_to_type_param'.
4688         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
4689         the TypeParameter and call FindMembers on it.
4690
4691 2004-04-07  Martin Baulig  <martin@ximian.com>
4692
4693         * class.cs
4694         (MethodCore.GenericMethod): Moved this field here from Method.
4695         (MethodCore.IsDuplicateImplementation): Take the number of type
4696         parameters into account if we're a generic method.
4697
4698         * expression.cs (Invocation.InferTypeArguments): Don't return true
4699         if `arguments' is null; we still need to check whether we actually
4700         don't need to infer anything in this case.
4701         (MemberAccess): Merged the functionality from GenericMemberAccess
4702         into this class.
4703
4704         * generic.cs (GenericMemberAccess): Removed.
4705
4706 2004-04-05  Martin Baulig  <martin@ximian.com>
4707
4708         * decl.cs (MemberCore): For generic classes, interfaces and
4709         structs, `Name' now includes the number of type parameters
4710         ("Stack!1.Node!1").
4711         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
4712         encode the number of type arguments in the type name.
4713
4714         * expression.cs (Expression.MemberLookup): Removed the
4715         `num_type_args' argument; we now encode the number of type
4716         arguments in the type name.
4717
4718         * ecore.cs (SimpleName): Encode the number of type arguments in
4719         the type name itself.
4720
4721         * generic.cs (ConstructedType): Likewise.
4722
4723         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
4724         `MemberName'; we now include the number of type parameters in the
4725         type name.
4726
4727         * typemanager.cs (TypeManager.CheckGeneric): Removed.
4728         (TypeManager.MemberLookup): Removed the
4729         `num_type_args' argument; we now encode the number of type
4730         arguments in the type name.     
4731
4732 2004-04-03  Martin Baulig  <martin@ximian.com>
4733
4734         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
4735         (MemberCore.MemberName): Moved here from MemberBase.
4736         (DeclSpace.SetParameterInfo): Just take the constraints as an
4737         ArrayList; we already have the type parameters in our
4738         `MemberName'; also do the CS0080 reporting here.
4739
4740         * cs-parser.jay (struct_declaration): Use `member_name' instead of
4741         `IDENTIFIER opt_type_parameter_list'; when constructing our
4742         `MemberName', it'll already include our type parameters.
4743         (class_declaration, interface_declaration): Likewise.
4744         (delegate_declaration): Likewise.
4745         (MakeName): Take a MemberName and return a MemberName.
4746         The following two changes are required to avoid shift/reduce conflicts:
4747         (member_name): Don't include a TypeName anymore; ie. this is now
4748         just 'IDENTIFIER opt_type_parameter_list'.
4749         (property_declaration, event_declaration): Use a
4750         `namespace_or_type_name' instead of a `member_name'.            
4751
4752 2004-04-03  Martin Baulig  <martin@ximian.com>
4753
4754         * decl.cs (MemberName): Renamed to `TypeName' and created a new
4755         `MemberName' class.
4756         (TypeName): Formerly known as MemberName.
4757
4758         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
4759         instead of a `MemberName'.
4760
4761         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
4762         (member_name): New rule; create a MemberName.
4763
4764 2004-04-02  Martin Baulig  <martin@ximian.com>
4765
4766         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
4767         (CS0305 and CS0308).
4768
4769 2004-04-02  Martin Baulig  <martin@ximian.com>
4770
4771         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
4772         support for nested types.
4773
4774 2004-04-02  Martin Baulig  <martin@ximian.com>
4775
4776         * ecore.cs (IAlias): New public interface.
4777         (TypeExpr, TypeExpression): Implement IAlias.
4778         (TypeAliasExpression): New public class.
4779
4780         * namespace.cs (Namespace): Implement IAlias.
4781         (Namespace.Lookup): Return an IAlias instead on an object.
4782         (Namespace.DefineName): Take an IAlias instead of an object.
4783         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
4784         an object.
4785         (NamespaceEntry.UsingAlias): Take a Membername instead of an
4786         Expression.
4787         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
4788         object.
4789         (NamespaceEntry.Lookup): Likewise.
4790
4791         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
4792         instead of a Type.      
4793
4794         * decl.cs (DeclSpace): Implement IAlias.
4795         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
4796
4797         * generic.cs (ConstructedType): Improved error checking.
4798
4799 2004-04-02  Martin Baulig  <martin@ximian.com>
4800
4801         * convert.cs: Added type parameter conversions.
4802
4803         * ecore.cs
4804         (UnboxCast.Emit): Emit an `unbox.any' for type params.
4805         (ClassCast.Emit): If the source type is a type parameter, box it.
4806         If the target type is a type parameter, emit an `unbox.any'
4807         instead of a `classcast'.1      
4808
4809 2004-04-01  Martin Baulig  <martin@ximian.com>
4810
4811         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
4812
4813 2004-04-01  Martin Baulig  <martin@ximian.com>
4814
4815         * generic.cs (ConstructedType.CheckConstraints): Use
4816         Convert.ImplicitStandardConversionExists(); user-defined implicit
4817         conversions are not allowed according to the spec.
4818
4819 2004-03-30  Martin Baulig  <martin@ximian.com>
4820
4821         * expression.cs (New): Added support for type parameters.
4822
4823         * typemanager.cs
4824         (TypeManager.activator_type): New public static field.
4825         (TypeManager.activator_create_instance): Likewise.
4826
4827 2004-03-30  Martin Baulig  <martin@ximian.com>
4828
4829         * typemanager.cs (TypeManager.HasConstructorConstraint): New
4830         public method.
4831
4832 2004-03-30  Martin Baulig  <martin@ximian.com>
4833
4834         * generic.cs (ConstructedType.CheckConstraints): Actually follow
4835         the spec here: the argument type must be convertible to the
4836         constraints.
4837
4838 2004-03-30  Martin Baulig  <martin@ximian.com>
4839
4840         * generic.cs
4841         (TypeParameter.Define, TypeParameter.DefineMethod): Call
4842         TypeManager.AddTypeParameter().
4843         (ConstructedType.CheckConstraints): Re-enable this and actually
4844         check whether we have a constructor constraint.
4845
4846         * typemanager.cs
4847         (TypeManager.builder_to_type_param): New static field.
4848         (TypeManager.AddTypeParameter): New static method.
4849         (TypeManager.LookupTypeParameter): New public method.
4850
4851 2004-03-30  Martin Baulig  <martin@ximian.com>
4852
4853         * generic.cs (TypeParameter.DefineType): Return a boolean and use
4854         the new API to actually define the constructor constraint.
4855
4856         * typemanager.cs
4857         (TypeManager.new_constraint_attr_type): New static field.
4858         (TypeManager.InitCoreTypes): Initialize it.
4859
4860 2004-03-30  Martin Baulig  <martin@ximian.com>
4861
4862         * generic.cs (Constraints): Completed error checking, use correct
4863         error numbers.
4864
4865 2004-03-29  Martin Baulig  <martin@ximian.com>
4866
4867         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
4868
4869         * expression.cs (Invocation.InferTypeArguments): Added overloaded
4870         public version which takes a `ParameterData pd' instead of an
4871         `ArrayList args'.
4872
4873 2004-03-29  Martin Baulig  <martin@ximian.com>
4874
4875         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
4876         not a MethodInfo.       
4877
4878 2004-03-29  Martin Baulig  <martin@ximian.com>
4879
4880         * expression.cs (Argument.ResolveMethodGroup): If we're a
4881         ConstructedType, call GetMemberAccess() on it.  
4882
4883 2004-03-29  Martin Baulig  <martin@ximian.com>
4884
4885         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
4886         (MethodCore.CheckGenericOverride): When overriding a generic
4887         method, check whether the constraints match.
4888
4889         * support.cs (GenericConstraints): New public interface.
4890         (ParameterData.GenericConstraints): New public method.
4891
4892         * parameter.cs (Parameter.Resolve): Check whether we're a generic
4893         method parameter and compute our constraints if appropriate.
4894         (Parameter.GenericConstraints): New public property.
4895
4896         * generic.cs (Constraints): Implement GenericConstraints.
4897
4898 2004-03-29  Martin Baulig  <martin@ximian.com>
4899
4900         * decl.cs (MemberCache.FindMemberToOverride): Use
4901         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
4902
4903 2004-03-29  Martin Baulig  <martin@ximian.com>
4904
4905         * generic.cs (GenericMethod.Define): Resolve our type parameters.
4906
4907 2004-03-29  Martin Baulig  <martin@ximian.com>
4908
4909         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
4910         not allowed on non-generic declarations").
4911
4912 2004-03-29  Martin Baulig  <martin@ximian.com>
4913
4914         * expression.cs (Invocation.InferTypeArguments): Added overloaded
4915         public version of this method.
4916
4917         * class.cs (MethodCore.IsDuplicateImplementation): Use
4918         Invocation.InferTypeArguments() to check this.
4919
4920 2004-03-29  Martin Baulig  <martin@ximian.com>
4921
4922         * convert.cs: Use TypeManager.IsDelegateType() instead of
4923         comparing types correctly.
4924
4925 2004-03-29  Martin Baulig  <martin@ximian.com>
4926
4927         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
4928         types directly to make it work for generic instances.
4929
4930         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
4931
4932 2004-03-29  Martin Baulig  <martin@ximian.com>
4933
4934         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
4935         support for arrays.     
4936
4937 2004-03-24  Martin Baulig  <martin@ximian.com>
4938
4939         * decl.cs (DeclSpace.FindType): Also use
4940         TypeManager.CheckGeneric() for types from the using clauses.
4941
4942 2004-03-23  Martin Baulig  <martin@ximian.com>
4943
4944         * expression.cs (Invocation.OverloadResolve): Added `bool
4945         may_fail' argument and use it instead of the Location.IsNull() hack.
4946
4947 2004-03-23  Martin Baulig  <martin@ximian.com>
4948
4949         * expression.cs (Invocation.InferType): Use correct type inference
4950         rules here.     
4951
4952 2004-03-23  Martin Baulig  <martin@ximian.com>
4953
4954         * ecore.cs (MethodGroupExpr.Name): Use
4955         TypeManager.CSharpSignature() instead of just the name.
4956
4957         * expression.cs (Invocation.OverloadResolve): Provide better error
4958         reporting.
4959         (Invocation.DoResolve): OverloadResolve() never returns null
4960         without reporting an error, so removed the error -6 reporting here.
4961
4962 2004-03-23  Martin Baulig  <martin@ximian.com>
4963
4964         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
4965         generic methods.
4966
4967         * cs-parser.jay (delegate_declaration): Support generic delegates.
4968
4969         * delegate.cs: Support generic delegates.
4970
4971 2004-03-22  Martin Baulig  <martin@ximian.com>
4972
4973         * expression.cs (Invocation.InferParamsTypeArguments): New static
4974         method; does type inference for params arguments.
4975
4976 2004-03-21  Martin Baulig  <martin@ximian.com>
4977
4978         * typemanager.cs (TypeManager.IsGenericMethod): New public static
4979         method; checks whether a method is a generic method.    
4980
4981         * expression.cs (Invocation.InferTypeArguments): New static method;
4982         infer type arguments for generic method invocation.
4983
4984         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
4985         property; we set this to true if we're resolving a generic method
4986         invocation and the user specified type arguments, ie. we're not
4987         doing type inference.
4988
4989 2004-03-20  Martin Baulig  <martin@ximian.com>
4990
4991         * class.cs (MethodData.DeclaringType): New public property.
4992         (MethodData.Define): Set DeclaringType here.
4993         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
4994         instead of OperatorMethodBuilder.DeclaringType.
4995
4996 2004-03-20  Martin Baulig  <martin@ximian.com>
4997
4998         * cs-tokenizer.cs (xtoken): Return a special
4999         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
5000
5001         * cs-parser.jay (default_value_expression): Switch to the new
5002         syntax (14.5.13).
5003
5004 2004-03-19  Martin Baulig  <martin@ximian.com>
5005
5006         * decl.cs (MemberName): New class.  We use this to "construct"
5007         namespace_or_type_name's.
5008
5009         * generics.cs (TypeArguments.GetDeclarations): New public method;
5010         returns the type arguments as a string[] and reports a CS0081 if
5011         one of them is not an identifier.
5012
5013         * class.cs (MemberBase): The .ctor now takes the name as a
5014         MemberName instead of a string.
5015         (MemberBase.ExplicitInterfaceName): Changed type from string to
5016         Expression.
5017         (MemberBase.DoDefine): If we're an explicit implementation, the
5018         InterfaceType may be a generic instance.
5019
5020         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
5021         (namespace_name): Call MemberName.GetName () to transform the
5022         MemberName into a string and ensure we don't have any type
5023         arguments.
5024         (type_name): Call MemberName.GetTypeExpression() to transfrom the
5025         MemberName into an expression.
5026         (method_header): Use namespace_or_type_name instead of member_name.     
5027
5028 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
5029
5030         * rootcontext.cs: Add new types to the boot resolution.
5031
5032         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
5033         MulticastDelegate is not allowed.
5034
5035         * typemanager.cs: Add new types to lookup: System.TypedReference
5036         and ArgIterator.
5037
5038         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
5039         check for TypedReference or ArgIterator, they are not allowed. 
5040
5041         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
5042         makes us properly catch 1510 in some conditions (see bug 56016 for
5043         details). 
5044
5045 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
5046
5047         * CryptoConvert.cs: update from corlib version
5048         with endian fixes.
5049
5050 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
5051
5052         * class.cs (Indexer.Define): Check indexername declaration
5053
5054 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
5055
5056         * attribute.cs (IsClsCompliant): Fixed problem with handling
5057         all three states (compliant, not-compliant, undetected).
5058
5059 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
5060
5061         * attribute.cs (Attribute): Location is now public.
5062         (Resolve): Store resolved arguments (pos_values) in attribute class.
5063         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
5064         (GetClsCompliantAttributeValue): New method that gets
5065         CLSCompliantAttribute value.
5066         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
5067         if exists else null.
5068         (AttributeTester): New class for CLS-Compliant verification routines.
5069
5070         * class.cs (Emit): Add CLS-Compliant verification.
5071         (Method.GetSignatureForError): Implemented.
5072         (Constructor.GetSignatureForError): Implemented
5073         (Constructor.HasCompliantArgs): Returns if constructor has
5074         CLS-Compliant arguments.
5075         (Constructor.Emit): Override.
5076         (Construcor.IsIdentifierClsCompliant): New method; For constructors
5077         is needed to test only parameters.
5078         (FieldBase.GetSignatureForError): Implemented.
5079         (TypeContainer): New member for storing base interfaces.
5080         (TypeContainer.FindMembers): Search in base interfaces too.
5081
5082         * codegen.cs (GetClsComplianceAttribute): New method that gets
5083         assembly or module CLSCompliantAttribute value.
5084         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
5085         for assembly.
5086         (ModuleClass.Emit): Add error 3012 test.
5087
5088         * const.cs (Emit): Override and call base for CLS-Compliant tests.
5089
5090         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
5091         state for all decl types.
5092         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
5093         if CLS-Compliant tests are required.
5094         (IsClsCompliaceRequired): New method. Analyze whether code
5095         must be CLS-Compliant.
5096         (IsExposedFromAssembly): New method. Returns true when MemberCore
5097         is exposed from assembly.
5098         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
5099         value or gets cached value.
5100         (HasClsCompliantAttribute): New method. Returns true if MemberCore
5101         is explicitly marked with CLSCompliantAttribute.
5102         (IsIdentifierClsCompliant): New abstract method. This method is
5103         used to testing error 3005.
5104         (IsIdentifierAndParamClsCompliant): New method. Common helper method
5105         for identifier and parameters CLS-Compliant testing.
5106         (VerifyClsCompliance): New method. The main virtual method for
5107         CLS-Compliant verifications.
5108         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
5109         null. I don't know why is null (too many public members !).
5110         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
5111         and get value of first CLSCompliantAttribute that found.
5112
5113         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
5114         (VerifyClsCompliance): Override and add extra tests.
5115
5116         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
5117         clscheck- disable CLS-Compliant verification event if assembly is has
5118         CLSCompliantAttribute(true).
5119
5120         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
5121         ApllyAttribute is now called in emit section as in the other cases.
5122         Possible future Emit integration.
5123         (IsIdentifierClsCompliant): New override.
5124         (VerifyClsCompliance): New override.
5125         (GetEnumeratorName): Returns full enum name.
5126
5127         * parameter.cs (GetSignatureForError): Implemented.
5128
5129         * report.cs (WarningData): New struct for Warning message information.
5130         (LocationOfPreviousError): New method.
5131         (Warning): New method. Reports warning based on the warning table.
5132         (Error_T): New method. Reports error based on the error table.
5133
5134         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
5135         verifications are done here.
5136
5137         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
5138
5139         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
5140         CLSCompliantAttribute.
5141         (all_imported_types): New member holds all imported types from other
5142         assemblies.
5143         (LoadAllImportedTypes): New method fills static table with exported types
5144         from all referenced assemblies.
5145         (Modules): New property returns all assembly modules.
5146
5147 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
5148
5149         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
5150         throwing a parser error.
5151
5152         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
5153         which removes the hardcoded get_/set_ prefixes for properties, as
5154         IL allows for the properties to be named something else.  
5155
5156         Bug #56013
5157
5158         * expression.cs: Do not override operand before we know if it is
5159         non-null.  Fix 56207
5160
5161 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
5162
5163         * typemanager.cs: support for pinned variables.
5164
5165 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
5166
5167         * decl.cs, typemanager.cs: Avoid using an arraylist
5168         as a buffer if there is only one result set.
5169
5170 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
5171
5172         * expression.cs: Make sure you cant call a static method
5173         with an instance expression, bug #56174.
5174
5175 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
5176
5177         * class.cs (IsDuplicateImplementation): Improve error reporting to
5178         flag 663 (method only differs in parameter modifier).
5179
5180         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
5181         in preprocessor directives.
5182
5183         * location.cs (LookupFile): Allow for the empty path.
5184
5185         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
5186         better approach for some of that patch, but its failing with the
5187         CharSet enumeration.  For now try/catch will do.
5188
5189         * typemanager.cs: Do not crash if a struct does not have fields.
5190         Fixes 56150.
5191
5192 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5193
5194         * expression.cs: cs0213, cant fix a fixed expression.
5195         fixes 50231.
5196
5197 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5198
5199         * cs-parser.jay: detect invalid embeded statements gracefully.
5200         bug #51113.
5201
5202 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5203
5204         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
5205         As a regex:
5206         s/
5207         the invocation type may not be a subclass of the tye of the item/
5208         The type of the item must be a subclass of the invocation item.
5209         /g
5210
5211         Fixes bug #50820.
5212
5213 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
5214
5215         * attribute.cs: Added methods to get a string and a bool from an
5216         attribute. Required to information from AssemblyKeyFileAttribute,
5217         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
5218         * codegen.cs: Modified AssemblyName creation to include support for
5219         strongnames. Catch additional exceptions to report them as CS1548.
5220         * compiler.csproj: Updated include CryptoConvert.cs.
5221         * compiler.csproj.user: Removed file - user specific configuration.
5222         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
5223         Mono.Security assembly. The original class is maintained and tested in
5224         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
5225         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
5226         like CSC 8.0 (C# v2) supports.
5227         * Makefile: Added CryptoConvert.cs to mcs sources.
5228         * rootcontext.cs: Added new options for strongnames.
5229
5230 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
5231
5232         * driver.cs: For --expect-error, report error code `2'
5233         if the program compiled with no errors, error code `1' if
5234         it compiled with an error other than the one expected.
5235
5236 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
5237
5238         * compiler.csproj: Updated for Visual Studio .NET 2003.
5239         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
5240         * compiler.sln: Updated for Visual Studio .NET 2003.
5241
5242 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
5243
5244         * expression.cs: Fix bug #47234. We basically need to apply the
5245         rule that we prefer the conversion of null to a reference type
5246         when faced with a conversion to 'object' (csc behaviour).
5247
5248 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5249
5250         * statement.cs: Shorter form for foreach, eliminates
5251         a local variable. r=Martin.
5252
5253 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5254
5255         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
5256         checks if we can use brtrue/brfalse to test for 0.
5257         * expression.cs: use the above in the test for using brtrue/brfalse.
5258         cleanup code a bit.
5259
5260 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5261
5262         * expression.cs: Rewrite string concat stuff. Benefits:
5263
5264         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
5265         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
5266         rather than a concat chain.
5267
5268         * typemanager.cs: Add lookups for more concat overloads.
5269
5270 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5271
5272         * expression.cs: Emit shorter il code for array init.
5273
5274         newarr
5275         dup
5276         // set 1
5277
5278         // set 2
5279
5280         newarr
5281         stloc.x
5282
5283         ldloc.x
5284         // set 1
5285
5286         ldloc.x
5287         // set 2
5288
5289 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
5290
5291         * statement.cs: Before, two switch blocks would be merged if the
5292         total size of the blocks (end_item - begin_item + 1) was less than
5293         two times the combined sizes of the blocks.
5294
5295         Now, it will only merge if after the merge at least half of the
5296         slots are filled.
5297
5298         fixes 55885.
5299
5300 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
5301
5302         * class.cs : csc build fix for GetMethods(). See bug #52503.
5303
5304 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
5305
5306         * expression.cs: Make sure fp comparisons work with NaN.
5307         This fixes bug #54303. Mig approved this patch a long
5308         time ago, but we were not able to test b/c the runtime
5309         had a related bug.
5310
5311 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
5312
5313         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
5314
5315 2004-03-19  Martin Baulig  <martin@ximian.com>
5316
5317         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
5318         two overloads may unify for some type parameter substitutions and
5319         report a CS0408 if appropriate.
5320
5321 2004-03-19  Martin Baulig  <martin@ximian.com>
5322
5323         * class.cs (MemberCore.IsDuplicateImplementation): Report the
5324         error here and not in our caller.
5325
5326 2004-03-19  Martin Baulig  <martin@ximian.com>
5327
5328         * interface.cs: Completely killed this file.
5329         (Interface): We're now a TypeContainer and live in class.cs.
5330
5331         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
5332         argument; we're now also called for interfaces.
5333         (TypeContainer.DefineMembers): Allow this method being called
5334         multiple times.
5335         (TypeContainer.GetMethods): New public method; formerly known as
5336         Interface.GetMethod().  This is used by PendingImplementation.
5337         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
5338         it's now private and non-static.
5339         (Interface): Moved this here; it's now implemented similar to
5340         Class and Struct.
5341         (Method, Property, Event, Indexer): Added `bool is_interface'
5342         argument to their .ctor's.
5343         (MemberBase.IsInterface): New public field.
5344
5345         * cs-parser.jay: Create normal Method, Property, Event, Indexer
5346         instances instead of InterfaceMethod, InterfaceProperty, etc.
5347         (opt_interface_base): Removed; we now use `opt_class_base' instead.
5348         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
5349
5350 2004-03-19  Martin Baulig  <martin@ximian.com>
5351
5352         * class.cs (MethodCore.IsDuplicateImplementation): New private
5353         method which does the CS0111 checking.
5354         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
5355         Use IsDuplicateImplementation().
5356
5357 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
5358
5359         * decl.cs (FindMemberToOverride): New method to find the correct
5360         method or property to override in the base class.
5361         * class.cs
5362             - Make Method/Property use the above method to find the
5363               version in the base class.
5364             - Remove the InheritableMemberSignatureCompare as it is now
5365               dead code.
5366
5367         This patch makes large code bases much faster to compile, as it is
5368         O(n) rather than O(n^2) to do this validation.
5369
5370         Also, it fixes bug 52458 which is that nested classes are not
5371         taken into account when finding the base class member.
5372
5373         Reviewed/Approved by Martin.
5374
5375 2004-03-17  Martin Baulig  <martin@ximian.com>
5376
5377         * expression.cs (MemberAccess.DoResolve): Take the parent's number
5378         of type arguments into account; use the `real_num_type_args'
5379         approach like in DoResolveAsTypeStep().
5380
5381         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
5382         nested types.
5383
5384 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
5385
5386         * interface.cs: In all interface classes removed redundant
5387         member initialization.
5388
5389 2004-03-16  Martin Baulig  <martin@ximian.com>
5390
5391         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
5392
5393 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
5394
5395         * decl.cs (DefineTypeAndParents): New helper method to define a
5396         type's containers before the type itself is defined;  This is a
5397         bug exposed by the recent changes to Windows.Forms when an
5398         implemented interface was defined inside a class that had not been
5399         built yet.   
5400
5401         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
5402
5403         (Check): Loop correctly to report errors modifiers
5404         (UNSAFE was not in the loop, since it was the same as TOP).
5405
5406         * interface.cs: Every interface member now takes a ModFlags,
5407         instead of a "is_new" bool, which we set on the base MemberCore. 
5408
5409         Every place where we called "UnsafeOk" in the interface, now we
5410         call the proper member (InterfaceMethod.UnsafeOK) instead to get
5411         the unsafe settings from the member declaration instead of the
5412         container interface. 
5413
5414         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
5415
5416         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
5417         `set_indexer_name' to the pending bits (one per type).
5418
5419         We fixed a bug today that was picking the wrong method to
5420         override, since for properties the existing InterfaceMethod code
5421         basically ignored the method name.  Now we make sure that the
5422         method name is one of the valid indexer names.
5423
5424 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
5425  
5426         * support.cs (SeekableStreamReader): Keep track of stream byte
5427         positions and don't mix them with character offsets to the buffer.
5428
5429         Patch from Gustavo Giráldez
5430
5431 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
5432
5433         * interface.cs (InterfaceSetGetBase): Removed double member
5434         initialization, base class does it as well.
5435
5436 2004-03-13  Martin Baulig  <martin@ximian.com>
5437
5438         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
5439         when compiling corlib.
5440
5441 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
5442
5443         * convert.cs (ExplicitConversion): We were reporting an error on
5444         certain conversions (object_type source to a value type, when the
5445         expression was `null') before we had a chance to pass it through
5446         the user defined conversions.
5447
5448         * driver.cs: Replace / and \ in resource specifications to dots.
5449         Fixes 50752
5450
5451         * class.cs: Add check for duplicate operators.  Fixes 52477
5452
5453 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
5454
5455         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
5456         that are in the middle of the statements, not only at the end.
5457         Fixes #54987
5458
5459         * class.cs (TypeContainer.AddField): No longer set the
5460         `HaveStaticConstructor' flag, now we call it
5461         `UserDefineStaticConstructor' to diferentiate the slightly
5462         semantic difference.
5463
5464         The situation is that we were not adding BeforeFieldInit (from
5465         Modifiers.TypeAttr) to classes that could have it.
5466         BeforeFieldInit should be set to classes that have no static
5467         constructor. 
5468
5469         See:
5470
5471         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
5472
5473         And most importantly Zoltan's comment:
5474
5475         http://bugzilla.ximian.com/show_bug.cgi?id=44229
5476
5477         "I think beforefieldinit means 'it's ok to initialize the type sometime 
5478          before its static fields are used', i.e. initialization does not need
5479          to be triggered by the first access to the type. Setting this flag
5480          helps the JIT to compile better code, since it can run the static
5481          constructor at JIT time, and does not need to generate code to call it
5482          (possibly lots of times) at runtime. Unfortunately, mcs does not set
5483          this flag for lots of classes like String. 
5484          
5485          csc sets this flag if the type does not have an explicit static 
5486          constructor. The reasoning seems to be that if there are only static
5487          initalizers for a type, and no static constructor, then the programmer
5488          does not care when this initialization happens, so beforefieldinit
5489          can be used.
5490          
5491          This bug prevents the AOT compiler from being usable, since it 
5492          generates so many calls to mono_runtime_class_init that the AOT code
5493          is much slower than the JITted code. The JITted code is faster, 
5494          because it does not generate these calls if the vtable is type is
5495          already initialized, which is true in the majority of cases. But the
5496          AOT compiler can't do this."
5497
5498 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
5499
5500         * class.cs (MethodData.Emit): Refactor the code so symbolic
5501         information is generated for destructors;  For some reasons we
5502         were taking a code path that did not generate symbolic information
5503         before. 
5504
5505 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
5506
5507         * class.cs: Create a Constructor.CheckBase method that
5508         takes care of all validation type code. The method
5509         contains some code that was moved from Define.
5510
5511         It also includes new code that checks for duplicate ctors.
5512         This fixes bug #55148.
5513
5514 2004-03-09  Joshua Tauberer <tauberer@for.net>
5515
5516         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
5517         a { ... }-style array creation invokes EmitStaticInitializers
5518         which is not good for reference-type arrays.  String, decimal
5519         and now null constants (NullCast) are not counted toward
5520         static initializers.
5521
5522 2004-03-05  Martin Baulig  <martin@ximian.com>
5523
5524         * location.cs (SourceFile.HasLineDirective): New public field;
5525         specifies whether the file contains or is referenced by a "#line"
5526         directive.
5527         (Location.DefineSymbolDocuments): Ignore source files which
5528         either contain or are referenced by a "#line" directive.        
5529
5530 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
5531
5532         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
5533         direct access to our parent, so check the method inline there.
5534
5535 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
5536
5537         * expression.cs (Invocation.EmitCall): Miguel's last commit
5538         caused a regression. If you had:
5539
5540             T t = null;
5541             t.Foo ();
5542
5543         In Foo the implict this would be null.
5544
5545 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
5546
5547         * expression.cs (Invocation.EmitCall): If the method is not
5548         virtual, do not emit a CallVirt to it, use Call.
5549
5550         * typemanager.cs (GetFullNameSignature): Improve the method to
5551         cope with ".ctor" and replace it with the type name.
5552
5553         * class.cs (ConstructorInitializer.Resolve): Now the method takes
5554         as an argument the ConstructorBuilder where it is being defined,
5555         to catch the recursive constructor invocations.
5556
5557 2004-03-16  Martin Baulig  <martin@ximian.com>
5558
5559         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
5560         ConstructedType, call ResolveType() on it to get the type rather
5561         than just using `expr.Type'.
5562
5563 2004-03-16  Martin Baulig  <martin@ximian.com>
5564
5565         * generics.cs (ConstructedType.GetMemberAccess): Take the
5566         EmitContext instead on the TypeExpr and use
5567         ec.TypeContainer.CurrentType/ec.ContainerType.
5568
5569 2004-03-16  Martin Baulig  <martin@ximian.com>
5570
5571         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
5572         parameters before aliases.
5573
5574 2004-03-16  Martin Baulig  <martin@ximian.com>
5575
5576         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
5577         New oublic function; checks whether two generic instances may become
5578         equal under some instantiations (26.3.1).
5579
5580         * class.cs (TypeContainer.Define): Call
5581         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
5582         error.
5583
5584 2004-03-16  Martin Baulig  <martin@ximian.com>
5585
5586         * class.cs (TypeContainer.GetClassBases): Moved
5587         Error_TypeParameterAsBase() here and also check whether the base
5588         class is not an attribute.
5589
5590 2004-03-16  Martin Baulig  <martin@ximian.com>
5591
5592         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
5593
5594 2004-03-16  Martin Baulig  <martin@ximian.com>
5595
5596         * class.cs (Error_TypeParameterAsBase): Use correct error number
5597         here (CS0689).  
5598
5599 2004-03-16  Martin Baulig  <martin@ximian.com>
5600
5601         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
5602         for generics.
5603
5604         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
5605         error reporting.
5606
5607 2004-03-15  Martin Baulig  <martin@ximian.com>
5608
5609         * typemanager.cs (TypeManager.GetFullName): New public method.
5610         (TypeManager.MemberLookup): Added `int_num_type_arguments'
5611         argument; only return members with the correct number of type
5612         arguments.
5613         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
5614         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
5615         whether the number of type arguments matches.
5616
5617         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
5618         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
5619
5620         * expression.cs (MemberAccess): Added public `NumTypeArguments'
5621         field; it's set by the protected .ctor when we're actually a
5622         GenericMemberAccess.
5623         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
5624         arguments and pass it to MemberLookupFinal ().
5625
5626         * ecore.cs (Expression.MemberLookup): Added `int
5627         num_type_arguments' argument; only return members with the correct
5628         number of type arguments.
5629         (Expression.MemberLookupFailed): Check whether the MemberLookup
5630         failed because we did not have the correct number of type
5631         arguments; report CS0305 in this case.
5632
5633         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
5634         `e.ResolveAsTypeTerminal()' already did so.
5635
5636 2004-03-15  Martin Baulig  <martin@ximian.com>
5637
5638         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
5639         we're a ConstructedType; in this case, the caller must report an
5640         error (for instance CS0131).
5641
5642         * generic.cs (TypeArguments): Added Location argument to the .ctor.
5643         (TypeArguments.Resolve): Actually report errors here.
5644
5645 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
5646
5647         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
5648         `set_indexer_name' to the pending bits (one per type).
5649
5650         We fixed a bug today that was picking the wrong method to
5651         override, since for properties the existing InterfaceMethod code
5652         basically ignored the method name.  Now we make sure that the
5653         method name is one of the valid indexer names.
5654
5655 2004-03-15  Martin Baulig  <martin@ximian.com>
5656
5657         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
5658         for generic instances.
5659
5660 2004-03-13  Martin Baulig  <martin@ximian.com>
5661
5662         * class.cs (TypeContainer.DefineType): Call
5663         TypeManager.AddUserType() immediately after creating the
5664         TypeBuilder; pass all type parameters when creating the
5665         CurrentType.
5666
5667         * decl.cs (DeclSpace.FindNestedType): New public method.
5668         (DeclSpace.FindType): Added `int num_type_args' argument; only
5669         return types with the correct number of type parameters.
5670         (DeclSpace.CountTypeParams): New public property.
5671
5672         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
5673         the number of type parameters; defaults to zero.
5674
5675         * generic.cs (TypeArguments.Count): New public property.
5676         (ConstructedType.DoResolveAsTypeStep): First call
5677         ds.FindNestedType() to find out whether we're nested in the
5678         current generic type; in this case, we inherit all type parameters
5679         from the current class.
5680
5681         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
5682         num_type_args' argument.
5683         (RootContext.LookupType): Added overloaded version which takes the
5684         number of type arguments; only return types with the correct
5685         number of type arguments.
5686
5687         * typemanager.cs (TypeManager.CheckGeneric): New public function;
5688         checks whether `Type t' has `int num_type_args'.
5689
5690 2004-03-13  Martin Baulig  <martin@ximian.com>
5691
5692         * generic.cs (GenericMethod.DefineType): New method; calls
5693         DefineType() on all the type parameters.
5694
5695         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
5696         (MethodData.Define): If we're a generic method, call
5697         GenericMethod.DefineType() to define the type parameters.       
5698
5699 2004-03-10  Martin Baulig  <martin@ximian.com>
5700
5701         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
5702         instead of IsAssignableFrom.    
5703
5704 2004-03-10  Martin Baulig  <martin@ximian.com>
5705
5706         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
5707
5708         * support.cs (ParameterData.HasArrayParameter): New property.
5709         (ReflectionParameters.ctor): Take a MethodBase instead of a
5710         ParameterInfo[].  If we have any type parameters, get the generic
5711         method definition and ask it whether we have variable arguments.
5712
5713 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
5714
5715         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
5716         routines to check if a type is an enumerable/enumerator allow
5717         classes that implement the IEnumerable or IEnumerator interfaces.
5718
5719         * class.cs (Property, Operator): Implement IIteratorContainer, and
5720         implement SetYields.
5721
5722         (Property.Define): Do the block swapping for get_methods in the
5723         context of iterators.   We need to check if Properties also
5724         include indexers or not.
5725
5726         (Operator): Assign the Block before invoking the
5727         OperatorMethod.Define, so we can trigger the Iterator code
5728         replacement. 
5729
5730         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
5731         Property and Operator classes are not created when we parse the
5732         declarator but until we have the block completed, so we use a
5733         singleton SimpleIteratorContainer.Simple to flag whether the
5734         SetYields has been invoked.
5735
5736         We propagate this setting then to the Property or the Operator to
5737         allow the `yield' to function.
5738
5739 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
5740
5741         * codegen.cs: Implemented attribute support for modules.
5742         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
5743         Assembly/Module functionality.
5744
5745         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
5746         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
5747         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
5748
5749 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
5750
5751         * interface.cs (FindMembers): The operation is performed on all base
5752         interfaces and not only on the first. It is required for future CLS Compliance patch.
5753
5754 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
5755
5756         * statement.cs, codegen.cs:
5757         This patch deals with patterns such as:
5758
5759         public class List : IEnumerable {
5760
5761                 public MyEnumerator GetEnumerator () {
5762                         return new MyEnumerator(this);
5763                 }
5764
5765                 IEnumerator IEnumerable.GetEnumerator () {
5766                         ...
5767                 }
5768                 
5769                 public struct MyEnumerator : IEnumerator {
5770                         ...
5771                 }
5772         }
5773
5774         Before, there were a few things we did wrong:
5775         1) we would emit callvirt on a struct, which is illegal
5776         2) we emited ldarg when we needed to emit ldarga
5777         3) we would mistakenly call the interface methods on an enumerator
5778         type that derived from IEnumerator and was in another assembly. For example:
5779
5780         public class MyEnumerator : IEnumerator
5781
5782         Would have the interface methods called, even if there were public impls of the
5783         method. In a struct, this lead to invalid IL code.
5784
5785 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
5786
5787         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
5788           renamed to Emit.
5789
5790         * delegate.cs (Define): Fixed crash when delegate type is undefined.
5791
5792 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
5793
5794         * cs-parser.jay: Fix small regression: we were not testing V2
5795         compiler features correctly.
5796
5797         * interface.cs: If the emit context is null, then create one
5798
5799 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
5800
5801         * decl.cs (GetSignatureForError): New virtual method to get full name
5802           for error messages.
5803
5804         * attribute.cs (IAttributeSupport): New interface for attribute setting.
5805           Now it is possible to rewrite ApplyAttributes method to be less if/else.
5806
5807         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
5808           Duplicated members and code in these classes has been removed.
5809           Better encapsulation in these classes.
5810
5811 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
5812
5813         * assign.cs (Assign.DoResolve): When dealing with compound
5814         assignments, there is a new rule in ECMA C# 2.4 (might have been
5815         there before, but it is documented here) that states that in:
5816
5817         a op= b;
5818
5819         If b is of type int, and the `op' is a shift-operator, then the
5820         above is evaluated as:
5821
5822         a = (int) a op b 
5823
5824         * expression.cs (Binary.ResolveOperator): Instead of testing for
5825         int/uint/long/ulong, try to implicitly convert to any of those
5826         types and use that in pointer arithmetic.
5827
5828         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
5829         method to print information for from the type, not from the
5830         null-method we were given.
5831
5832 2004-02-01  Duncan Mak  <duncan@ximian.com>
5833
5834         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
5835         parsing for cmd, fixes bug #53694.
5836
5837 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
5838
5839         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
5840         in the member name duplication tests. Property and operator name duplication
5841         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
5842
5843 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
5844
5845         * interface.cs (PopulateMethod): Fixed crash when interface method
5846         returns not existing type (error test cs0246-3.cs).
5847
5848 2004-02-02  Ravi Pratap M <ravi@ximian.com>
5849
5850         * cs-parser.jay (interface_accessors): Re-write actions to also
5851         store attributes attached to get and set methods. Fix spelling
5852         while at it.
5853
5854         (inteface_property_declaration): Modify accordingly.
5855
5856         (InterfaceAccessorInfo): New helper class to store information to pass
5857         around between rules that use interface_accessors.
5858
5859         * interface.cs (Emit): Apply attributes on the get and set
5860         accessors of properties and indexers too.
5861
5862         * attribute.cs (ApplyAttributes): Modify accordingly to use the
5863         right MethodBuilder when applying attributes to the get and set accessors.
5864
5865 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
5866
5867         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
5868
5869 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
5870
5871         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
5872
5873 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
5874
5875         * cs-parser.jay: Remove YIELD token, instead use the new grammar
5876         changes that treat `yield' specially when present before `break'
5877         or `return' tokens.
5878
5879         * cs-tokenizer.cs: yield is no longer a keyword.
5880
5881 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
5882
5883         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
5884         setting for default constructors.
5885         For default constructors are almost every time set wrong Modifier. The
5886         generated IL code has been alright. But inside mcs this values was
5887         wrong and this was reason why several of my CLS Compliance tests
5888         failed.
5889
5890 2004-02-27  Martin Baulig  <martin@ximian.com>
5891
5892         * generics.cs (ConstructedType.ResolveType): Make the nested type
5893         stuff actually work.
5894
5895 2004-02-25  Martin Baulig  <martin@ximian.com>
5896
5897         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
5898         property; returns the type parameters just from the current type,
5899         ie. with the ones from outer classes.
5900         (DeclSpace.LookupGeneric): First search in the current class, then
5901         in outer classes.
5902         (DeclSpace.initialize_type_params): When hiding a type parameter
5903         from an outer class, put it into the `type_param_list' anyways.
5904
5905         * expression.cs (MemberAccess.expr): Made this field protected.
5906
5907         * class.cs (TypeContainer.Define): The `CurrentType' just contains
5908         the type parameters from the current class.
5909
5910         * generic.cs (ConstructedType.ResolveType): Support nested generic
5911         types by taking the type parameters which we inherit from outer
5912         classes into account.
5913         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
5914         support for nested generic types.
5915
5916 2004-02-23  Martin Baulig  <martin@ximian.com>
5917
5918         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
5919         field and check whether we're nested inside a generic type.
5920         (DeclSpace.ResolveType): If we're resolving to a generic type
5921         definition, create a ConstructedType and return its resolved type.
5922         (DeclSpace.initialize_type_params): New private method;
5923         initializes the `type_param_list' field from the type parameters
5924         from this and all enclosing classes.
5925         (DeclSpace.TypeParameters): Call initialize_type_params() unless
5926         we're already initialized.
5927
5928 2004-02-23  Martin Baulig  <martin@ximian.com>
5929
5930         * class.cs (Method.Define): Create the generic method before
5931         calling DoDefine().
5932         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
5933         the TypeContainer one); we use this for generic methods.
5934
5935         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
5936         parent's TypeBuilder.
5937
5938 2004-02-18  Martin Baulig  <martin@ximian.com>
5939
5940         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
5941         to check for equality.
5942
5943 2004-02-05  Martin Baulig  <martin@ximian.com>
5944
5945         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
5946         `ec.TypeContainer.CurrentType', use it instead of
5947         `ec.ContainerType' to check whether we're in the type's ctor.
5948
5949 2004-01-29  Martin Baulig  <martin@ximian.com>
5950
5951         * expression.cs (Invocation.DoResolve): If we're a
5952         `ConstructedType', then we're actually a generic method, so
5953         rewrite the expr as a GenericMemberAccess.
5954
5955         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
5956         here; manually parse it into a string.
5957
5958 2004-01-28  Martin Baulig  <martin@ximian.com>
5959
5960         * typemanager.cs (TypeManager.IsEqual): New static method.
5961         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
5962         check for equality instead of using `=='.
5963
5964 2004-01-26  Martin Baulig  <martin@ximian.com>
5965
5966         * decl.cs (DeclSpace.CurrentType): New public field.
5967
5968         * expression.cs (This.ResolveBase): If we have an
5969         `ec.TypeContainer.CurrentType', use it instead of
5970         `ec.ContainerType'.
5971
5972         * class.cs (TypeContainer.DefineType): If we're a generic type,
5973         create the `CurrentType' (unresolved).
5974         (TypeContainer.GenericType): New private field.
5975         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
5976         it and store it in `GenericType' before creating the MemberCache.
5977         (TypeContainer.GetMembers): If we have a `GenericType', call
5978         TypeManager.FindMembers() on it.
5979
5980         * interface.cs (Interface.GenericType): New private field.
5981         (Interface.DefineType): If we're a generic type, create the
5982         `CurrentType' (unresolved).
5983         (Interface.DefineMembers): If we have a `CurrentType', resolve it
5984         and store it in `GenericType' before creating the MemberCache.
5985         (Interface.GetMembers): If we have a `GenericType', call
5986         TypeManager.FindMembers() on it.
5987
5988 2004-01-22  Martin Baulig  <martin@ximian.com>
5989
5990         * cs-parser.jay (namespace_or_type_name): Return an Expression,
5991         not a QualifiedIdentifier.  This is what `type_name_expression'
5992         was previously doing.
5993         (type_name_expression): Removed; the code is now in
5994         `namespace_or_type_name'.
5995         (qualified_identifier): Removed, use `namespace_or_type_name'
5996         instead.
5997         (QualifiedIdentifier): Removed this class.      
5998
5999 2004-01-22  Martin Baulig  <martin@ximian.com>
6000
6001         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
6002         not a string as alias name.
6003
6004 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
6005
6006         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
6007         #52730 bug, and instead compute correctly the need to use a
6008         temporary variable when requesting an address based on the
6009         static/instace modified of the field and the constructor.
6010  
6011 2004-01-21  Martin Baulig  <martin@ximian.com>
6012
6013         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
6014         class and namespace before looking up aliases.  Fixes #52517.
6015
6016 2004-01-21  Martin Baulig  <martin@ximian.com>
6017
6018         * flowanalysis.cs (UsageVector.Merge): Allow variables being
6019         assinged in a 'try'; fixes exception4.cs.
6020
6021 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6022         * class.cs : Implemented parameter-less constructor for TypeContainer
6023
6024         * decl.cs: Attributes are now stored here. New property OptAttributes
6025
6026         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
6027
6028         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
6029
6030 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6031
6032         * typemanager.cs (CSharpSignature): Now reports also inner class name.
6033           (CSharpSignature): New method for indexer and property signature.
6034
6035 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6036
6037         * pending.cs (IsVirtualFilter): Faster implementation.
6038
6039 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6040
6041         * typemanager.cs: Avoid inclusion of same assembly more than once.
6042
6043 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6044
6045         * cs-parser.jay: Fixed problem where the last assembly attribute
6046           has been applied also to following declaration (class, struct, etc.)
6047           
6048 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6049
6050         * class.cs: Added error CS0538, CS0539 reporting.
6051         Fixed crash on Microsoft runtime when field type is void.
6052
6053         * cs-parser.jay: Added error CS0537 reporting.
6054
6055         * pending.cs: Added error CS0535 reporting.
6056         Improved error report for errors CS0536, CS0534.
6057
6058 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
6059
6060         Merge a few bits from the Anonymous Method MCS tree.
6061
6062         * statement.cs (ToplevelBlock): New class for toplevel methods,
6063         will hold anonymous methods, lifted variables.
6064
6065         * cs-parser.jay: Create toplevel blocks for delegates and for
6066         regular blocks of code. 
6067
6068 2004-01-20  Martin Baulig  <martin@ximian.com>
6069
6070         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
6071         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
6072         and `NeedExplicitReturn'; added `IsLastStatement'.
6073         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
6074         have a `ReturnLabel' or we're not unreachable.
6075
6076         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
6077         child's reachability; don't just override ours with it.  Fixes
6078         #58058 (lluis's example).
6079         (FlowBranching): Added public InTryOrCatch(), InCatch(),
6080         InFinally(), InLoop(), InSwitch() and
6081         BreakCrossesTryCatchBoundary() methods.
6082
6083         * statement.cs (Return): Do all error checking in Resolve().
6084         Unless we are the last statement in a top-level block, always
6085         create a return label and jump to it.
6086         (Break, Continue): Do all error checking in Resolve(); also make
6087         sure we aren't leaving a `finally'.
6088         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
6089         statement in a top-level block.
6090         (Block.Flags): Added `IsDestructor'.
6091         (Block.IsDestructor): New public property.
6092
6093 2004-01-20  Martin Baulig  <martin@ximian.com>
6094
6095         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
6096
6097 2004-01-20  Martin Baulig  <martin@ximian.com>
6098
6099         * statement.cs (Statement.ResolveUnreachable): New public method.
6100         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
6101         (Block.Resolve): Resolve unreachable statements.
6102
6103 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
6104
6105         * expression.cs: We need to fix the case where we do
6106         not have a temp variable here.
6107
6108         * assign.cs: Only expression compound assignments need
6109         temporary variables.
6110
6111 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
6112
6113         * flowanalysis.cs: Reduce memory allocation in a few ways:
6114           - A block with no variables should not allocate a bit
6115             vector for itself.
6116           - A method with no out parameters does not need any tracking
6117             for assignment of the parameters, so we need not allocate
6118             any data for it.
6119           - The arrays:
6120                 public readonly Type[] VariableTypes;
6121                 public readonly string[] VariableNames;
6122             Are redundant. The data is already stored in the variable
6123             map, so we need not allocate another array for it.
6124           - We need to add alot of checks for if (params | locals) == null
6125             due to the first two changes.
6126
6127 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
6128
6129         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
6130         implement IMemoryLocation, we store a copy on a local variable and
6131         take the address of it.  Patch from Benjamin Jemlich
6132
6133         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
6134         to use a special "type_name_expression" rule which reduces the
6135         number of "QualifiedIdentifier" classes created, and instead
6136         directly creates MemberAccess expressions.
6137
6138 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
6139
6140         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
6141         that fixes #52853.  Null literal assignment to ValueType
6142
6143         * class.cs (MethodData.Emit): Instead of checking the name of the
6144         method to determine if its a destructor, create a new derived
6145         class from Method called Destructor, and test for that.  
6146
6147         * cs-parser.jay: Create a Destructor object instead of a Method.  
6148
6149         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
6150
6151         Fixes: 52933
6152
6153 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
6154
6155         * expression.cs (Binary.ResolveOperator): Perform an implicit
6156         conversion from MethodGroups to their delegate types on the
6157         Addition operation.
6158
6159         * delegate.cs: Introduce a new class DelegateCreation that is the
6160         base class for `NewDelegate' and `ImplicitDelegateCreation',
6161         factor some code in here.
6162
6163         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
6164         conversion from MethodGroups to compatible delegate types. 
6165
6166         * ecore.cs (Expression.Resolve): Do not flag error 654
6167         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
6168         we allow conversions from MethodGroups to delegate types now.
6169
6170         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
6171         assignments in v2 either.
6172
6173 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
6174
6175         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
6176         static read-only fields in ctors.
6177
6178         Applied patch from Benjamin Jemlich 
6179
6180         * expression.cs (UnaryMutator): Avoid leaking local variables. 
6181
6182 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
6183
6184         * cs-tokenizer.cs (IsCastToken): Allow the various native types
6185         here to return true, as they can be used like this:
6186
6187                 (XXX) int.MEMBER ()
6188
6189         Fixed 49836 and all the other dups
6190
6191 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
6192
6193         * driver.cs: Implement /win32res and /win32icon.
6194
6195 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
6196
6197         * cs-parser.jay: Add a rule to improve error handling for the
6198         common mistake of placing modifiers after the type.
6199
6200 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
6201
6202         * cs-parser.jay (interface_event_declaration): Catch
6203         initialization of events on interfaces, and report cs0068
6204
6205         * cs-parser.jay (interface_event_declaration): Catch
6206         initialization of events. 
6207
6208         * ecore.cs: Better report missing constructors.
6209
6210         * expression.cs (Binary.ResolveOperator): My previous bug fix had
6211         the error reporting done in the wrong place.  Fix.
6212
6213         * expression.cs (Binary.ResolveOperator): Catch the 
6214         operator + (E x, E y) error earlier, and later allow for implicit
6215         conversions in operator +/- (E e, U x) from U to the underlying
6216         type of E.
6217
6218         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
6219         52596, if the container class is abstract, the default constructor
6220         is protected otherwise its public (before, we were always public).
6221
6222         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
6223         fixed statement.
6224
6225         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
6226         Jemlich that fixes bug #52597, MCS was generating invalid code for
6227         idisposable structs.   Thanks to Ben for following up with this
6228         bug as well.
6229
6230 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
6231
6232         * driver.cs: Allow assemblies without code to be generated, fixes
6233         52230.
6234
6235 2004-01-07  Nick Drochak <ndrochak@gol.com>
6236
6237         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
6238
6239 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
6240
6241         * cs-parser.jay: Add rules to improve error reporting if fields or
6242         methods are declared at the namespace level (error 116)
6243
6244         * Add rules to catch event add/remove
6245
6246 2004-01-04  David Sheldon <dave-mono@earth.li>
6247
6248   * expression.cs: Added matching ")" to error message for 
6249   CS0077
6250
6251 2004-01-03 Todd Berman <tberman@gentoo.org>
6252
6253         * ecore.cs, attribute.cs:
6254         Applying fix from #52429.
6255
6256 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6257
6258         * ecore.cs, expression.cs, statement.cs:
6259         Total rewrite of how we handle branching. We
6260         now handle complex boolean expressions with fewer
6261         jumps. As well if (x == 0) no longer emits a ceq.
6262
6263         if (x is Foo) is much faster now, because we generate
6264         better code.
6265
6266         Overall, we get a pretty big improvement on our benchmark
6267         tests. The code we generate is smaller and more readable.
6268
6269         I did a full two-stage bootstrap. The patch was reviewed
6270         by Martin and Miguel.
6271
6272 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6273
6274         * cs-parser.jay: Make primary_expression not take a QI.
6275         we dont need this because the member_access rule covers
6276         us here. So we replace the rule with just IDENTIFIER.
6277
6278         This has two good effects. First, we remove a s/r conflict.
6279         Second, we allocate many fewer QualifiedIdentifier objects.
6280
6281 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6282
6283         * attribute.cs: Handle MarshalAs attributes as pseudo, and
6284         set the correct information via SRE. This prevents
6285         hanging on the MS runtime. Fixes #29374.
6286
6287 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6288
6289         * convert.cs: correctly handle conversions to value types
6290         from Enum and ValueType as unboxing conversions.
6291
6292         Fixes bug #52569. Patch by Benjamin Jemlich.
6293
6294 2004-01-02  Ravi Pratap  <ravi@ximian.com>
6295
6296         * expression.cs (BetterConversion): Prefer int -> uint
6297         over int -> ulong (csc's behaviour). This fixed bug #52046.
6298
6299 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
6300
6301         * decl.cs (MemberCache.FindMembers): now returns a
6302         MemberInfo [].
6303
6304         * typemanager.cs: In general, go with with ^^.
6305         (CopyNewMethods): take an IList.
6306         (RealMemberLookup): Only allocate an arraylist
6307         if we copy from two sets of methods.
6308
6309         This change basically does two things:
6310         1) Fewer array lists allocated due to CopyNewMethods.
6311         2) the explicit cast in MemberList costed ALOT.
6312
6313 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
6314
6315         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
6316         a hashtable to avoid needless string allocations when an identifier is
6317         used more than once (the common case).
6318
6319 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
6320
6321         * pending.cs: MS's TypeBuilder.GetInterfaces ()
6322         is broken, it will not return anything. So, we
6323         have to use the information we have in mcs to
6324         do the task.
6325
6326         * typemanager.cs: Add a cache for GetInterfaces,
6327         since this will now be used more often (due to ^^)
6328
6329         (GetExplicitInterfaces) New method that gets the
6330         declared, not effective, interfaces on a type
6331         builder (eg, if you have interface IFoo, interface
6332         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
6333         { IBar }.
6334
6335         This patch makes MCS able to bootstrap itself on
6336         Windows again.
6337
6338 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
6339
6340         * expression.cs: Remove the Nop's that Miguel put
6341         in by mistake.
6342
6343 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6344
6345         * report.cs, codegen.cs: Give the real stack trace to
6346         the error when an exception is thrown.
6347
6348 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6349
6350         * decl.cs: only allocate hashtables for ifaces if 
6351         it is an iface!
6352
6353 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6354
6355         * expression.cs: fix the error from cs0121-2.cs
6356         (a parent interface has two child interfaces that
6357         have a function with the same name and 0 params
6358         and the function is called through the parent).
6359
6360 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
6361
6362         * class.cs, rootcontext.cs, typmanager.cs: do not
6363         leak pointers.
6364
6365 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
6366
6367         * codegen.cs: remove stack for the ec flow branching.
6368         It is already a linked list, so no need.
6369
6370 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
6371
6372         * Makefile: Allow custom profiler here.
6373
6374 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
6375
6376         * typemanager.cs (LookupType):
6377           - Use a static char [], because split takes
6378             a param array for args, so it was allocating
6379             every time.
6380           - Do not store true in a hashtable, it boxes.
6381
6382 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
6383
6384         * flowanalysis.cs: bytify common enums.
6385
6386 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6387
6388         * modifiers.cs: Add a new set of flags for the
6389         flags allowed on explicit interface impls.
6390         * cs-parser.jay: catch the use of modifiers in
6391         interfaces correctly.
6392         * class.cs: catch private void IFoo.Blah ().
6393
6394         All related to bug #50572.
6395
6396 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6397
6398         * decl.cs: Rewrite the consistant accessability checking.
6399         Accessability is not linear, it must be implemented in
6400         a tableish way. Fixes #49704.
6401
6402 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6403
6404         * expression.cs: Handle negation in a checked context.
6405         We must use subtraction from zero. Fixes #38674.
6406
6407 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
6408
6409         * class.cs: Ignore static void main in DLLs.
6410         * rootcontext.cs: Handle the target type here,
6411         since we are have to access it from class.cs
6412         * driver.cs: account for the above.
6413
6414 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
6415
6416         * report.cs: Give line numbers and files if available.
6417
6418 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
6419
6420         * driver.cs: Implement /addmodule.
6421
6422         * typemanager.cs:  Change 'modules' field so it now contains Modules not
6423         ModuleBuilders.
6424
6425 2003-12-20  Martin Baulig  <martin@ximian.com>
6426
6427         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
6428         (FieldBase.IsAssigned): Removed this field.
6429         (FieldBase.SetAssigned): New public method.
6430         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
6431
6432 2003-12-20  Martin Baulig  <martin@ximian.com>
6433
6434         * expression.cs (LocalVariableReference.DoResolve): Don't set
6435         `vi.Used' if we're called from DoResolveLValue().
6436
6437         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
6438         returns the usage vector it just merged into the current one -
6439         pass this one to UsageWarning().
6440         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
6441         of the `EmitContext', don't call this recursively on our children.
6442
6443 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
6444
6445         * driver.cs: Implement /target:module.
6446
6447 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
6448
6449         * support.cs (CharArrayHashtable): New helper class.
6450
6451         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
6452         char arrays, not strings, so we can avoid creating a string in
6453         consume_identifier if the identifier is a keyword.
6454
6455 2003-12-16  Martin Baulig  <martin@ximian.com>
6456
6457         * statement.cs (LocalInfo.Assigned): Removed this property.
6458         (LocalInfo.Flags): Removed `Assigned'.
6459         (LocalInfo.IsAssigned): New public method; takes the EmitContext
6460         and uses flow analysis.
6461         (Block.UsageWarning): Made this method private.
6462         (Block.Resolve): Call UsageWarning() if appropriate.
6463
6464         * expression.cs (LocalVariableReference.DoResolve): Always set
6465         LocalInfo.Used here.
6466
6467 2003-12-13  Martin Baulig  <martin@ximian.com>
6468
6469         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
6470         any value here; we're now using flow analysis to figure out
6471         whether a statement/block returns a value.
6472
6473 2003-12-13  Martin Baulig  <martin@ximian.com>
6474
6475         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
6476         working again.
6477         (FlowBranching.MergeFinally): Don't call
6478         `branching.CheckOutParameters()' here, this is called in
6479         MergeTopBlock().
6480         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
6481         when adding the `finally' vector.       
6482
6483 2003-12-13  Martin Baulig  <martin@ximian.com>
6484
6485         * flowanalysis.cs
6486         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
6487         actually work and also fix #48962.
6488
6489 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
6490
6491         * decl.cs: Do not check System.Object for nested types,
6492         since we know it does not have any. Big bang for buck:
6493
6494         BEFORE:
6495            Run 1:   8.35 seconds
6496            Run 2:   8.32 seconds
6497            corlib:  17.99 seconds
6498         AFTER:
6499            Run 1:   8.17 seconds
6500            Run 2:   8.17 seconds
6501            corlib:  17.39 seconds
6502
6503 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
6504
6505         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
6506         time we are returning 0 members, so we save alot here.
6507
6508 2003-12-11  Martin Baulig  <martin@ximian.com>
6509
6510         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
6511         `MergeChild()', also just take the `FlowBranching' as argument;
6512         call Merge() on it and return the result.
6513         (FlowBranching.Merge): We don't need to do anything if we just
6514         have one sibling.
6515
6516 2003-12-11  Martin Baulig  <martin@ximian.com>
6517
6518         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
6519         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
6520         Maurer for this idea.
6521
6522 2003-12-11  Martin Baulig  <martin@ximian.com>
6523
6524         * flowanalysis.cs (MergeResult): This class is now gone; we now
6525         use the `UsageVector' for this.  The reason for this is that if a
6526         branching just has one sibling, we don't need to "merge" them at
6527         all - that's the next step to do.
6528         (FlowBranching.Merge): We now return a `UsageVector' instead of a
6529         `MergeResult'.
6530
6531 2003-12-11  Martin Baulig  <martin@ximian.com>
6532
6533         Reworked flow analyis and made it more precise and bug-free.  The
6534         most important change is that we're now using a special `Reachability'
6535         class instead of having "magic" meanings of `FlowReturns'.  I'll
6536         do some more cleanups and optimizations and also add some more
6537         documentation this week.
6538
6539         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
6540         largely reworked this class.
6541         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
6542         the new `Reachability' class instead of having "magic" values here.
6543         (FlowBranching): We're now using an instance of `Reachability'
6544         instead of having separate `Returns', `Breaks' etc. fields.
6545
6546         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
6547         based on flow analysis; ignore the return value of block.Emit ().
6548
6549 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
6550
6551         * driver.cs typemanager.cs: Find the mono extensions to corlib even
6552         if they are private.
6553
6554 2003-12-09  Martin Baulig  <martin@ximian.com>
6555
6556         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
6557         call them directly on the UsageVector.
6558
6559 2003-12-09  Martin Baulig  <martin@ximian.com>
6560
6561         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
6562         Changed return type from `FlowReturns' to `Reachability'.
6563
6564 2003-12-09  Martin Baulig  <martin@ximian.com>
6565
6566         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
6567         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
6568         `Reachable' fields with a single `Reachability' one.
6569
6570 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6571
6572         * class.cs (FindMembers): Remove foreach's.
6573
6574         Bootstrap times:
6575
6576         BEFORE
6577                 Run 1:   8.74 seconds
6578                 Run 2:   8.71 seconds
6579
6580         AFTER
6581                 Run 1:   8.64 seconds
6582                 Run 2:   8.58 seconds
6583
6584
6585 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6586
6587         * cs-parser.jay:
6588         * gen-treedump.cs:
6589         * statement.cs:
6590         This patch does a few things:
6591                 1. EmptyStatement is now a singleton, so it is never reallocated.
6592                 2. All blah is EmptyStatement constructs have been changed to
6593                    blah == EmptyStatement.Value, which is much faster and valid
6594                    now that EmptyStatement is a singleton.
6595                 3. When resolving a block, rather than allocating a new array for
6596                    the non-empty statements, empty statements are replaced with
6597                    EmptyStatement.Value
6598                 4. Some recursive functions have been made non-recursive.
6599         Mainly the performance impact is from (3), however (1) and (2) are needed for
6600         this to work. (4) does not make a big difference in normal situations, however
6601         it makes the profile look saner.
6602
6603         Bootstrap times:
6604
6605         BEFORE
6606         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
6607         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
6608         Total memory allocated: 56397 KB
6609
6610         AFTER
6611         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
6612         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
6613         Total memory allocated: 55666 KB
6614
6615 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6616
6617         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
6618         than the hashtable in a hashtable version
6619
6620         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
6621         we always end up concating a string. This results in a huge perf
6622         loss, because many strings have to be tracked by the GC. In this
6623         patch, we first use a hashtable that works with two keys, so that
6624         the strings do not need to be concat'ed.
6625
6626         Bootstrap times:
6627         BEFORE
6628                 Run 1:   8.74 seconds
6629                 Run 2:   8.71 seconds
6630
6631         AFTER
6632                 Run 1:   8.65 seconds
6633                 Run 2:   8.56 seconds
6634
6635 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6636
6637         * Makefile: Add a new target `do-time' that does a quick and simple
6638         profile, leaving easy to parse output.
6639
6640 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
6641
6642         * codegen.cs (Init): Create the dynamic assembly with 
6643         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
6644
6645 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
6646
6647         * support.cs: Make the PtrHashtable use only one
6648         instance of its comparer.
6649
6650 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
6651
6652         * typemanager.cs: Fix lookup of GetNamespaces.
6653
6654 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
6655
6656         * expression.cs: Removed redundant line.
6657
6658         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
6659         ArrayLists, use for loops with bounds.  
6660
6661         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
6662         arraylist.
6663
6664         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
6665         arraylists, use for loop with bounds.
6666
6667         The above three changes give us a 0.071 second performance
6668         improvement out of 3.294 seconds down to 3.223.  On my machine
6669         the above changes reduced the memory usage by 1,387 KB during
6670         compiler bootstrap.
6671
6672         * cs-parser.jay (QualifiedIdentifier): New class used to represent
6673         QualifiedIdentifiers.  Before we created a new string through
6674         concatenation, and mostly later on, the result would be
6675         manipulated by DecomposeQI through string manipulation.
6676
6677         This reduced the compiler memory usage for bootstrapping from
6678         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
6679         compile times in 0.05 seconds.
6680
6681 2003-11-28  Dick Porter  <dick@ximian.com>
6682
6683         * support.cs: Do string compares with the Invariant culture.
6684
6685         * rootcontext.cs: 
6686         * gen-treedump.cs: 
6687         * expression.cs: 
6688         * driver.cs: 
6689         * decl.cs: 
6690         * codegen.cs: 
6691         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
6692         the comparison is done with the Invariant culture.
6693
6694 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
6695
6696         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
6697         GetEnumerator method.
6698
6699         (ProbeCollectionType): Iterate starting at the most specific type
6700         upwards looking for a GetEnumerator
6701
6702         * expression.cs: Shift count can be up to 31 for int/uint and 63
6703         for long/ulong.
6704
6705 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
6706
6707         * statement.cs (Block.LookupLabel): Also look for the label on the
6708         children blocks.  Use a hash table to keep track of visited
6709         nodes. 
6710
6711         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
6712         we actually did transform the other operand, otherwise fall back
6713         to the common codepath that casts to long.
6714
6715         * cs-tokenizer.cs: Use the same code pattern as the int case.
6716         Maybe I should do the parsing myself, and avoid depending on the
6717         Parse routines to get this done.
6718
6719 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
6720
6721         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
6722         which fixes bug 51347.  This time test it.
6723
6724         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
6725         attributes for example can not tell the difference between these.
6726         The difference was only a syntax feature of the language. 
6727
6728         * attribute.cs: Apply attributes to delegates.
6729
6730         * delegate.cs: Call the apply attributes method.
6731
6732 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
6733
6734         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
6735         comparing 0 vs Byte.MinValue, not the value
6736
6737         (ImplicitConversionRequired): When reporting a conversion error,
6738         use error 31 to print out the constant error instead of the
6739         simpler 29.
6740
6741         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
6742         which fixes bug 51347.
6743
6744 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
6745
6746         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
6747         which fixes the -warnaserror command line option.
6748
6749 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
6750
6751         * cfold.cs (DoNumericPromotions): During constant folding of
6752         additions on UIntConstant, special case intconstants with
6753         IntConstants like we do on the expression binary operator. 
6754
6755 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
6756
6757         * convert.cs (ImplicitReferenceConversion): We were missing a case
6758         (System.Enum are not value types or class types, so we need to
6759         classify them separatedly).
6760
6761         * driver.cs: We do not support error 2007.
6762
6763 2003-11-12 Jackson Harper <jackson@ximian.com>
6764
6765         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
6766         system directory. Also use the full file name so users can
6767         libraries names mscorlib-o-tron.dll in a non system dir.
6768         
6769 2004-01-04  David Sheldon <dave-mono@earth.li>
6770
6771         * expression.cs: Added matching ")" to error message for CS0077.
6772
6773 2003-12-19  Martin Baulig  <martin@ximian.com>
6774
6775         * typemanager.cs (TypeManager.IsEqualGenericType): New public
6776         static method; see documentation in the method.
6777         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
6778
6779         * convert.cs (Convert.ImplicitReferenceConversion,
6780         Convert.ImplicitReferenceConversionExists): Add support for
6781         generic type declarations; see gen-36.cs.
6782
6783 2003-12-19  Martin Baulig  <martin@ximian.com>
6784
6785         * pending.cs (Pending.InterfaceMethod): Use
6786         `Type.IsAssignableFrom()' instead of `=='.
6787
6788 2003-12-18  Martin Baulig  <martin@ximian.com>
6789
6790         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
6791         byref types first.
6792
6793         * convert.cs (Convert.ImplicitStandardConversionExists): Use
6794         `expr_type.Equals (target_type)' instead of `=='.
6795
6796 2003-12-08  Martin Baulig  <martin@ximian.com>
6797
6798         * generics.cs (Constraints.Types): Removed.
6799         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
6800         to Type's.
6801         (Constraints.ResolveTypes): New public method; resolves the
6802         TypeExpr's to Type's.
6803         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
6804         longer takes the constraints.
6805         (TypeParameter.DefineMethod): Likewise.
6806         (TypeParameter.DefineType): New public method.  Calls
6807         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
6808         the constraints.
6809
6810 2003-12-08  Martin Baulig  <martin@ximian.com>
6811
6812         * convert.cs (Convert.ImplicitConversionStandard): Use
6813         `expr_type.Equals (target_type)' instead of `=='.
6814
6815 2003-12-08  Martin Baulig  <martin@ximian.com>
6816
6817         * typemanager.cs (TypeManager.GetReferenceType): Call
6818         `Type.MakeByRefType ()'.
6819
6820 2003-12-08  Martin Baulig  <martin@ximian.com>
6821
6822         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
6823         just has some special meaning in some situations.  For instance,
6824         it is allowed to use `where' as the name of a variable etc.
6825
6826 2003-12-04  Martin Baulig  <martin@ximian.com>
6827
6828         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
6829         `Type.MakeArrayType()' for array types.
6830
6831 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
6832
6833         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
6834         debugging message.
6835
6836         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
6837         corlib to compile.
6838
6839 2003-11-16  Martin Baulig  <martin@ximian.com>
6840
6841         * codegen.cs (EmitContext.IsGeneric): Removed.
6842
6843         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
6844         ResolveGeneric() on the DeclSpace.
6845
6846 2003-11-16  Martin Baulig  <martin@ximian.com>
6847
6848         * generic.cs (TypeArguments.Resolve):
6849         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
6850         `ResolveType()' on it to get the Type.
6851
6852 2003-11-15  Martin Baulig  <martin@ximian.com>
6853
6854         * generic.cs (ConstructedType.GetInterfaces): Override this.
6855
6856 2003-11-14  Martin Baulig  <martin@ximian.com>
6857
6858         * interface.cs (Interface.DefineType): Define all type parameters
6859         before adding the interfaces we inherit.
6860
6861 2003-11-11  Martin Baulig  <martin@ximian.com>
6862
6863         * generic.cs (ConstructedType.ResolveType): Always call
6864         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
6865
6866 2003-11-10  Martin Baulig  <martin@ximian.com>
6867
6868         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
6869         (TypeManager.InitCoreTypes): Initialize them here, but instead of
6870         calling `ResolveType()' on them, directly assign their `Type'.
6871
6872 2003-11-08  Martin Baulig  <martin@ximian.com>
6873
6874         * generic.cs (ConstructedType): Override `IsClass' etc.
6875
6876 2003-11-08  Martin Baulig  <martin@ximian.com>
6877
6878         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
6879         return value and the `out parent' parameter.
6880         (TypeContainer.DefineType): Moved the CS0644 check into
6881         GetClassBases().  Don't pass the interface types to the
6882         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
6883         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
6884
6885         * ecore.cs (TypeExpr.IsAttribute): New property.
6886         (TypeExpr.GetInterfaces): New method.
6887
6888         * interface.cs (Interface.GetInterfaceTypeByName): Return a
6889         TypeExpr instead of a Type.
6890         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
6891         (Interface.DefineType): Don't pass the interface types to the
6892         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
6893         them later and then call `TypeBulider.AddInterfaceImplementation()'.
6894
6895         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
6896         instead of a `Type[]'.
6897         (TypeManager.RegisterBuilder): Likewise.
6898         (TypeManager.AddUserInterface): Likewise.
6899         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
6900         `Type[]' and also return a `TypeExpr[]'.
6901         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
6902
6903 2003-11-08  Martin Baulig  <martin@ximian.com>
6904
6905         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
6906         Expression.     
6907
6908 2003-11-08  Martin Baulig  <martin@ximian.com>
6909
6910         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
6911         TypeManager.ResolveExpressionTypes().
6912
6913         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
6914         instead of an Expression.
6915         (TypeExpr): This is now an abstract base class for `TypeExpression'.
6916         (TypeExpression): New public class; formerly known as `TypeExpr'.
6917
6918         * expression.cs (ComposedCast): Derive from TypeExpr.
6919
6920         * typemanager.cs (TypeManager.system_*_expr): These are now
6921         TypExpr's instead of Expression's.
6922         (TypeManager.ResolveExpressionTypes): New public static function;
6923         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
6924         of them.        
6925
6926 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
6927
6928         * expression.cs (New.DoResolve): Do not dereference value that
6929         might be a null return.
6930
6931         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
6932         sure that the constant value has the right type.  Fixes an
6933         unreported bug, similar to 50425.
6934
6935         * const.cs (Const.LookupConstantValue): Call
6936         ImplicitStandardConversionExists before doing a conversion to
6937         avoid havng the TypeManager.ChangeType do conversions.
6938
6939         Reduced the number of casts used
6940
6941         (Const.ChangeType): New routine to enable reuse of the constant
6942         type changing code from statement.
6943
6944         * typemanager.cs (ChangeType): Move common initialization to
6945         static global variables.
6946
6947         Fixes #50425.
6948
6949         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
6950         every value type to go through, even if it was void.  Fix that. 
6951
6952         * cs-tokenizer.cs: Use is_identifier_start_character on the start
6953         character of the define, and the is_identifier_part_character for
6954         the rest of the string.
6955
6956 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
6957
6958         * expression.cs (UnaryMutator.EmitCode): When I updated
6959         LocalVariableReference.DoResolve, I overdid it, and dropped an
6960         optimization done on local variable references.
6961
6962 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
6963
6964         * ecore.cs: Convert the return from Ldlen into an int.
6965
6966 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
6967
6968         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
6969         the accessibility, this is a special case for toplevel non-public
6970         classes (internal for instance).
6971
6972 2003-10-20  Nick Drochak <ndrochak@gol.com>
6973
6974         * ecore.cs: Fix typo and build.  Needed another right paren.
6975
6976 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
6977
6978         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
6979         `internal' case regular and protected, but not allowing protected
6980         to be evaluated later.  Bug 49840
6981
6982 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
6983
6984         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
6985         to kb.Nlast, and not the kb.nFirst to isolate the switch
6986         statement.
6987
6988         Extract the underlying type, so enumerations of long/ulong are
6989         treated like long/ulong.
6990
6991 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
6992
6993         * expression.cs (New): Overload the meaning of RequestedType to
6994         track the possible creation of the NewDelegate type, since
6995         DoResolve is invoked more than once for new constructors on field
6996         initialization.
6997
6998         See bugs: #48800 and #37014
6999
7000         * cs-parser.jay (declare_local_constants): Take an arraylist
7001         instead of a single constant.
7002
7003         (local_constant_declaration): It should take a
7004         constant_declarators, not a constant_declarator.  Fixes 49487
7005
7006         * convert.cs: Fix error report.
7007
7008 2003-10-13 Jackson Harper <jackson@ximian.com>
7009
7010         * typemanager.cs (TypeToCoreType): Add float and double this fixes
7011         bug #49611
7012         
7013 2003-11-03  Martin Baulig  <martin@ximian.com>
7014
7015         * expression.cs (ArrayAccess.GetStoreOpcode): Added
7016         `out bool has_type_arg'; if set, we need to pass the type to
7017         ig.Emit().
7018         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
7019         Stelem_Any/Ldelem_Any for generic parameters.   
7020
7021 2003-11-02  Martin Baulig  <martin@ximian.com>
7022
7023         * expression.cs (Invocation.EmitCall): Use
7024         `TypeManager.IsValueType()' to check whether it's a value type.
7025         Don't set `struct_call' when calling a method on a type parameter.
7026
7027 2003-11-02  Martin Baulig  <martin@ximian.com>
7028
7029         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
7030         and removed the TypeBuilder argument.
7031
7032         * typemanager.cs (TypeManager.IsValueType): Return
7033         `t.IsGenericParameter || t.IsValueType'.
7034
7035 2003-10-25  Martin Baulig  <martin@ximian.com>
7036
7037         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
7038         call ConstructedType.Resolve() on it.
7039
7040         * generic.cs (ConstructedType.Resolve): Set `type' on success.
7041
7042 2003-10-25  Martin Baulig  <martin@ximian.com>
7043
7044         * class.cs (TypeContainer.GetClassBases): Changed
7045         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
7046         CS8214 reporting here.
7047         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
7048         instead of a `Type' for our parent.  In case of a recursive
7049         declaration (see tests/gen-23.cs for an example), our parent is a
7050         ConstructedType and it doesn't have its type set.  So, first
7051         create our own TypeBuilder, then call constructed.Resolve() to get
7052         the parent's type and finally TypeBuilder.SetParent() it.
7053
7054         * ecore.cs (TypeExpr.Name): New public virtual property.
7055
7056         * generic.cs
7057         (ConstructedType): We're now a TypeExpr and not just an Expression.
7058         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
7059         arguments here; this is done later.
7060         (ConstructedType.Resolve): New public method to resolve the type
7061         arguments and bind them.
7062
7063 2003-10-21  Martin Baulig  <martin@ximian.com>
7064
7065         * convert.cs: Use `TypeManager.IsValueType' instead of
7066         'type.IsValueType' everywhere.
7067
7068         * typemanager.cs (TypeManager.IsValueType): Return true for type
7069         parameters.  The reason for this is that we need to box a type
7070         parameter when converting it to a reference type.
7071
7072         * cs-parser.jay: Added support for default value expressions.
7073
7074         * generics.cs (DefaultValueExpression): New public class.       
7075
7076 2003-10-17  Martin Baulig  <martin@ximian.com>
7077
7078         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
7079         TypeContainer so we can also use this for Interfaces.
7080         (TypeParameter.Resolve): Likewise.
7081
7082         * interface.cs (Interface.DefineType): Added support for generic
7083         interfaces.
7084
7085         * cs-parser.jay: Added support for generic structs and interfaces.
7086
7087 2003-10-17  Martin Baulig  <martin@ximian.com>
7088
7089         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
7090         call generic methods :-)
7091
7092 2003-10-16  Martin Baulig  <martin@ximian.com>
7093
7094         * cs-parser.jay (namespace_or_type_name): Only create a
7095         GenericMemberAccess if we actually have type arguments.
7096
7097 2003-10-13  Martin Baulig  <martin@ximian.com>
7098
7099         * class.cs (Method.Define): If we're a generic method, call
7100         TypeBuilder.DefineGenericMethod () before resolving
7101         the parameters.
7102         (MethodData): Added .ctor which takes an additional MethodBuilder
7103         argument; this is used for generic methods.
7104         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
7105         we already have a MethodBuilder.
7106
7107 2003-10-10  Martin Baulig  <martin@ximian.com>
7108
7109         * class.cs (Method): Added .ctor which takes a `GenericMethod'
7110         instead of a `DeclSpace'.  This is used for generic methods.
7111
7112         * cs-parser.jay (method_header): Added support for generic
7113         methods; create a `GenericMethod' instance and pass it to the
7114         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
7115         parameters and locals.
7116
7117         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
7118         since we already have the location.  Check whether we're a generic
7119         type declaration or a generic method and create the correct type
7120         parameter.
7121
7122         * generic.cs (TypeParameter.DefineMethod): New public method.
7123         (GenericMethod): New public class; derives from DeclSpace and is
7124         used for generic methods.       
7125
7126 2003-10-09  Martin Baulig  <martin@ximian.com>
7127
7128         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
7129         to the .ctor.
7130         (MethodCore.DoDefineParameters): Removed the TypeContainer
7131         argument; use the DeclSpace which was passed to the .ctor instead.
7132         (MethodCore.CheckParameter): Take a DeclSpace instead of a
7133         TypeContainer; we only need a DeclSpace here.
7134
7135 2003-10-09  Martin Baulig  <martin@ximian.com>
7136
7137         * class.cs (MethodData): Added additional `DeclSpace ds' argument
7138         to the .ctor.
7139         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
7140         EmitContext's .ctor.    
7141
7142 2003-10-09  Martin Baulig  <martin@ximian.com>
7143
7144         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
7145         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
7146         AsAccessible(), moved them as well.
7147
7148         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
7149
7150 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
7151
7152         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
7153         generation for >=, as spotted by Paolo, bug 48679.  
7154         Patch from David Waite.
7155
7156         * cs-tokenizer.cs: Add handling for #pragma.
7157
7158         * cs-parser.jay: Allow for both yield and yield return in the
7159         syntax.  The anti-cobolization of C# fight will go on!
7160
7161         * class.cs (TypeBuilder.DefineType): Catch error condition here
7162         (Parent.DefineType erroring out and returning null).
7163
7164         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
7165         coping with enumerations variables, we were mistakenly processing
7166         them as a regular value type instead of built-in types.  Fixes the
7167         bug #48063
7168
7169         * typemanager.cs (IsBuiltinOrEnum): New method.
7170
7171 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
7172
7173         * cs-parser.jay: Upgrade: yield now needs the return clause.
7174
7175 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
7176
7177         * cs-parser.jay : Renamed yyName to yyNames related to jay.
7178
7179 2003-09-29  Martin Baulig  <martin@ximian.com>
7180
7181         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
7182         inflated generic methods.
7183
7184         * generics.cs (ConstructedType): Distinguish between open and
7185         closed constructed types; correctly resolve the arguments.
7186
7187 2003-09-22  Martin Baulig  <martin@ximian.com>
7188
7189         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
7190         all type arguments meet their constraints.
7191
7192 2003-09-19  Martin Baulig  <martin@ximian.com>
7193
7194         * decl.cs (MemberCache.SetupCacheForInterface): Take a
7195         `MemberCache parent' argument.  Normally, an interface doesn't
7196         have a parent type except System.Object, but we use this in gmcs
7197         for generic type parameters.
7198
7199 2003-09-18  Martin Baulig  <martin@ximian.com>
7200
7201         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
7202         on `type.IsInterface'; don't check whether the type has a parent
7203         to determine whether it's an interface.
7204
7205 2003-09-17  Martin Baulig  <martin@ximian.com>
7206
7207         * generic.cs (ConstructedType.ToString): Always use `name' as the
7208         type name.
7209
7210 2003-09-15  Martin Baulig  <martin@ximian.com>
7211
7212         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
7213
7214         * generic.cs (Constraints.Resolve): New public method; this is
7215         called to resolve the constraint types and to check whether all
7216         the constraints are correct.
7217         (Constraints.Types): New public property.
7218         (TypeParameter.Resolve): New public method; resolves all the
7219         type's constraints.
7220
7221         * class.cs (TypeContainer.DefineType): Call
7222         TypeParameter.Resolve() before actually defining the type.
7223
7224 2003-09-15  Martin Baulig  <martin@ximian.com>
7225
7226         * class.cs (TypeContainer.DefineType): Added an error flag to
7227         avoid reporting duplicate CS0146's ("class definition is
7228         circular.").
7229
7230         * driver.cs (Driver.MainDriver): Abort if
7231         RootContext.ResolveTree() reported any errors.
7232
7233 2003-09-07  Martin Baulig  <martin@ximian.com>
7234
7235         * report.cs (Error, Warning): Added overloaded versions which take
7236         a `params object[] args' and call String.Format().
7237
7238 2003-09-07  Martin Baulig  <martin@ximian.com>
7239
7240         * decl.cs (DeclSpace..ctor): Don't call
7241         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
7242         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
7243         (DeclSpace.RecordDecl): New method.
7244
7245         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
7246
7247 2003-09-02  Ravi Pratap  <ravi@ximian.com>
7248
7249         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
7250         value attributes to be applied to ParameterBuilders.
7251
7252         * class.cs (MethodCore.LabelParameters): Make static and more
7253         generic so that it can be used from other places - like interface
7254         methods, for instance.
7255
7256         * interface.cs (Interface.Emit): Call LabelParameters before
7257         emitting attributes on the InterfaceMethod.
7258
7259 2003-09-07  Martin Baulig  <martin@ximian.com>
7260
7261         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
7262         if the number of type parameters doesn't match.
7263
7264 2003-09-04  Martin Baulig  <martin@ximian.com>
7265
7266         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
7267         for arrays of generic type params (ie. `!0[]').
7268
7269 2003-09-04  Martin Baulig  <martin@ximian.com>
7270
7271         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
7272         for the moment.
7273
7274 2003-09-04  Martin Baulig  <martin@ximian.com>
7275
7276         * decl.cs (DeclSpace.LookupGeneric): New method.
7277         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
7278         moment.
7279
7280         * generic.cs (TypeParameterExpr): Take a TypeParameter as
7281         argument, not just a string.
7282         (TypeParameter.Define): New public method; this is called to
7283         actually define the generic parameter; after this, you can use the
7284         new `Type' property to get the type.
7285
7286 2003-09-04  Martin Baulig  <martin@ximian.com>
7287
7288         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
7289         is now an ArrayList; initialize the result of the `TypeParameters'
7290         property here.
7291         (DeclSpace.GetGenericData): Removed.
7292         (DeclSpace.LookupGeneric): Temporarily removed; we need to
7293         implement this in a different way.
7294         (DeclSpace.GetTypeParameters): Removed; there's now a
7295         `TypeParameters' property.
7296         (DeclSpace.TypeParameters): New public property.
7297
7298         * generic.cs (Constraints): Make this class public.
7299         (TypeParameter): New public class.
7300
7301 2003-09-04  Martin Baulig  <martin@ximian.com>
7302
7303         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
7304         generic parameters.
7305
7306         * class.cs (TypeContainer.DefineType): Call
7307         TypeBuilder.DefineGenericParameter () on all generic parameters if
7308         this is a generic type.
7309
7310 2003-08-28  Martin Baulig  <martin@ximian.com>
7311
7312         * sample-stack.il: Compile this with ilasm: "ilasm /dll
7313         sample-stack.il".
7314
7315         * sample-hello.cs: Compile this with gmcs: "gmcs
7316         /r:sample-stack.dll sample-hello.cs".
7317
7318 2003-08-28  Martin Baulig  <martin@ximian.com>
7319
7320         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
7321         the parameters to the generic type.
7322
7323 2003-08-28  Martin Baulig  <martin@ximian.com>
7324
7325         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
7326
7327 2003-08-28  Martin Baulig  <martin@ximian.com>
7328
7329         * cs-parser.jay (opt_type_argument_list): Use
7330         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
7331         (primary_expression): Replace `qualified_identifier' with `type_name'.
7332         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
7333
7334         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
7335         parser to check whether it is syntactically a type parameter list;
7336         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
7337         this case.
7338
7339 2003-08-26  Martin Baulig  <martin@ximian.com>
7340
7341         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
7342         resolving aliases; fixes #47927.
7343
7344 2003-08-26  Martin Baulig  <martin@ximian.com>
7345
7346         * statement.cs (Using.DoResolve): This is internally emitting a
7347         try/finally clause, so we need to set ec.NeedExplicitReturn if we
7348         do not always return.  Fixes #47681.
7349
7350 2003-08-26  Martin Baulig  <martin@ximian.com>
7351
7352         * decl.cs (MemberCore): Moved WarningNotHiding(),
7353         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
7354         into MemberBase.
7355         (AdditionResult): Make this nested in DeclSpace.
7356         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
7357         argument; call NamespaceEntry.Define() unless we're nested in a
7358         class or struct.
7359
7360         * namespace.cs (Namespace.DefineName): New public function.  This
7361         is called from DeclSpace's .ctor to add 
7362         (Namespace.Lookup): Include DeclSpaces in the lookup.
7363
7364         * class.cs (Operator): Derive from MemberBase, not MemberCore.
7365
7366         * const.cs (Const): Derive from MemberBase, not MemberCore.     
7367
7368 2003-08-25  Martin Baulig  <martin@ximian.com>
7369
7370         * convert.cs (Convert.ExplicitReferenceConversion): When
7371         converting from an interface type to a class, unbox if the target
7372         type is a struct type.  Fixes #47822.
7373
7374 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7375
7376         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
7377         #47854.
7378
7379 2003-08-22  Martin Baulig  <martin@ximian.com>
7380
7381         * class.cs (TypeManager.DefineType): When defining a nested type,
7382         call DefineType() on our parent; fixes #47801.
7383
7384 2003-08-22  Martin Baulig  <martin@ximian.com>
7385
7386         * class.cs (MethodData.Define): While checking if a method is an
7387         interface implementation, improve the test a bit more to fix #47654.
7388
7389 2003-08-22  Martin Baulig  <martin@ximian.com>
7390
7391         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
7392         correctly; fixes #47722.
7393
7394 2003-08-22  Martin Baulig  <martin@ximian.com>
7395
7396         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
7397         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
7398
7399         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
7400
7401 2003-08-22  Martin Baulig  <martin@ximian.com>
7402
7403         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
7404         can only be assigned in static constructors.  Fixes #47161.
7405
7406 2003-08-22  Martin Baulig  <martin@ximian.com>
7407
7408         Rewrote and improved the flow analysis code.
7409
7410         * flowbranching.cs (FlowBranching): Make this class abstract.
7411         (FlowBranching.CreateBranching): New static function to create a
7412         new flow branching.
7413         (FlowBranchingBlock, FlowBranchingException): New classes.
7414         (FlowBranching.UsageVector.Type): New public readonly field.
7415         (FlowBranching.UsageVector.Breaks): Removed the setter.
7416         (FlowBranching.UsageVector.Returns): Removed the setter.
7417         (FlowBranching.UsageVector): Added Break(), Return(),
7418         NeverReachable() and Throw() methods to modify the reachability.
7419         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
7420         done by FlowBranching.Merge().
7421         (FlowBranching.UsageVector.MergeChild): New method; merges the
7422         merge result into the current vector.
7423         (FlowBranching.Merge): New abstract method to merge a branching.
7424
7425 2003-08-12  Martin Baulig  <martin@ximian.com>
7426
7427         * expression.cs (Indirection.CacheTemporaries): Create the
7428         LocalTemporary with the pointer type, not its element type.
7429
7430 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
7431
7432         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
7433         token was a keyword or not.
7434
7435         Add `error' options where an IDENTIFIER was expected;  Provide
7436         CheckToken and CheckIdentifierToken convenience error reporting
7437         functions. 
7438
7439         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
7440
7441         * decl.cs: Rename `NamespaceEntry Namespace' public field into
7442         NameSpaceEntry NameSpaceEntry.
7443
7444         (LookupInterfaceOrClass): Avoid creating a full qualified name
7445         from namespace and name: avoid doing lookups when we know the
7446         namespace is non-existant.   Use new Tree.LookupByNamespace which
7447         looks up DeclSpaces based on their namespace, name pair.
7448
7449         * driver.cs: Provide a new `parser verbose' to display the
7450         exception thrown during parsing.  This is turned off by default
7451         now, so the output of a failure from mcs is more graceful.
7452
7453         * namespace.cs: Track all the namespaces defined in a hashtable
7454         for quick lookup.
7455
7456         (IsNamespace): New method
7457
7458 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
7459
7460         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
7461         we know that we need to concatenate (full typename can never be
7462         null). 
7463
7464         * class.cs: ditto.
7465
7466         * statement.cs: Use a bitfield;  Do not initialize to null things
7467         which are done by the constructor by default.
7468
7469         * cs-parser.jay: bug fix, parameter was 4, not 3.
7470
7471         * expression.cs: Just use the property;
7472
7473         * statement.cs: No need for GetVariableInfo method.
7474
7475 2003-08-08  Martin Baulig  <martin@ximian.com>
7476
7477         * flowanalysis.cs (FlowReturns): This is now nested in the
7478         `FlowBranching' class.
7479         (MyBitVector): Moved this here from statement.cs.
7480         (FlowBranching.SiblingType): New enum type.
7481         (FlowBranching.CreateSibling): Added `SiblingType' argument.
7482
7483 2003-08-07  Martin Baulig  <martin@ximian.com>
7484
7485         * flowanalysis.cs (FlowBranchingType): This is now nested in the
7486         `FlowBranching' class and called `BranchingType'.
7487
7488 2003-08-07  Martin Baulig  <martin@ximian.com>
7489
7490         * flowanalysis.cs: Moved all the control flow analysis code into
7491         its own file.
7492
7493 2003-08-07  Martin Baulig  <martin@ximian.com>
7494
7495         * assign.cs (Assign.DoResolve): `target' must either be an
7496         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
7497         #37319.
7498
7499 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
7500
7501         * expression.cs (BinaryMethod): This kind of expression is created by the
7502         Binary class if it determines that the operator has to be handled
7503         by a method.
7504
7505         (BinaryDelegate): This kind of expression is created if we are
7506         dealing with a + or - operator on delegates.
7507
7508         (Binary): remove method, argumetns, and DelegateOperator: when
7509         dealing with methods, 
7510
7511         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
7512
7513         * statement.cs (Block): use bitfields for the three extra booleans
7514         we had in use.   Remove unused topblock parameter.
7515
7516         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
7517
7518         * assign.cs: Drop extra unneeded tests.
7519
7520 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
7521
7522         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
7523
7524         * statement.cs (Foreach): Use VariableStorage instead of
7525         LocalBuilders.   
7526
7527         * codegen.cs (VariableStorage): New class used by clients that
7528         require a variable stored: locals or fields for variables that
7529         need to live across yield.
7530
7531         Maybe provide a convenience api for EmitThis+EmitLoad?
7532
7533         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
7534         these bad boys.
7535
7536 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
7537
7538         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
7539         RemapParameterLValue): New methods that are used to turn a
7540         precomputed FieldInfo into an expression like this:
7541
7542                 instance.FieldInfo
7543
7544         The idea is to use this instead of making LocalVariableReference
7545         have more than one meaning.
7546
7547         * cs-parser.jay: Add error production to BASE.
7548
7549         * ecore.cs: Deal with TypeManager.GetField returning null, which
7550         is now a valid return value.
7551
7552         (FieldExprNoAddress): New expression for Fields whose address can
7553         not be taken.
7554
7555         * expression.cs (LocalVariableReference): During the resolve
7556         phases, create new expressions if we are in a remapping context.
7557         Remove code that dealt with remapping here.
7558
7559         (ParameterReference): same.
7560
7561         (ProxyInstance): New expression, like the `This' expression, but
7562         it is born fully resolved.  We know what we are doing, so remove
7563         the errors that are targeted to user-provided uses of `this'.
7564
7565         * statement.cs (Foreach): our variable is now stored as an
7566         Expression;  During resolution, follow the protocol, dont just
7567         assume it will return this.
7568
7569 2003-08-06  Martin Baulig  <martin@ximian.com>
7570
7571         * support.cs (SeekableStreamReader.cs): New public class.
7572
7573         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
7574         SeekableStreamReader instead of the normal StreamReader.
7575
7576 2003-08-04  Martin Baulig  <martin@ximian.com>
7577
7578         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
7579         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
7580         deambiguate casts and delegate invocations.
7581         (parenthesized_expression): Use the new tokens to ensure this is
7582         not a cast of method invocation.
7583
7584         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
7585         when reading a `)' and Deambiguate_CloseParens () was previously
7586         called.
7587
7588         * expression.cs (ParenthesizedExpression): New class.  This is
7589         just used for the CS0075 test.
7590         (Binary.DoResolve): Check for CS0075.   
7591
7592 2003-07-29  Ravi Pratap  <ravi@ximian.com>
7593
7594         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
7595         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
7596         reference comparison.
7597
7598         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
7599         examine the ReturnType for equality - this is necessary in the
7600         cases of implicit and explicit operators whose signature also
7601         includes the return type.
7602
7603 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
7604
7605         * namespace.cs: Cache the result of the namespace computation,
7606         instead of computing it every time.
7607
7608 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
7609
7610         * decl.cs: Use a global arraylist that we reuse over invocations
7611         to avoid excesive memory consumption.  Reduces memory usage on an
7612         mcs compile by one meg (45 average).
7613
7614         * typemanager.cs (LookupTypeReflection): In .NET pointers are
7615         private, work around that.
7616
7617 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
7618
7619         * literal.cs (IntLiteral): Define Zero and One static literals. 
7620
7621         * cs-parser.jay (integer_literal): use static literals to reduce
7622         memory usage for the most used literals (0, 1 and -1).  211kb
7623         reduced in memory usage.
7624
7625         Replace all calls to `new ArrayList' with `new
7626         ArrayList(4)' which is a good average number for most allocations,
7627         and also requires only 16 bytes of memory for its buffer by
7628         default. 
7629
7630         This reduced MCS memory usage in seven megabytes for the RSS after
7631         bootstrapping.
7632
7633 2003-07-28  Ravi Pratap  <ravi@ximian.com>
7634
7635         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
7636         handle params methods the correct way by forming only one
7637         applicable set with params and normal methods in them. Earlier we
7638         were looking at params methods only if we found no normal methods
7639         which was not the correct thing to do.
7640
7641         (Invocation.BetterFunction): Take separate arguments indicating
7642         when candidate and the best method are params methods in their
7643         expanded form.
7644
7645         This fixes bugs #43367 and #46199.
7646
7647         * attribute.cs: Documentation updates.
7648
7649         (CheckAttribute): Rename to CheckAttributeTarget.
7650         (GetValidPlaces): Rename to GetValidTargets.
7651
7652         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
7653         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
7654
7655         Fixes bug #44468.
7656
7657 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
7658
7659         * codegen.cs: Compute IsGeneric correctly.
7660
7661         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
7662         resolution. 
7663
7664         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
7665         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
7666         regressions, and I was chasing more bugs than I required.
7667
7668         * interface.cs: Use expressions for base type names (like classes
7669         and structs have been doing for a while now), and resolve that.
7670         This patch should probably go into head as well.
7671
7672         This makes it one less user of FindType.
7673
7674 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
7675
7676         This compiler can not self host currently.  Need to fix that.
7677         
7678         * Makefile: compile to `gmcs.exe'
7679
7680         * driver.cs: Turn on v2 by default on gmcs.
7681
7682         * generic.cs (ConstructedType): Does no longer take a container
7683         type argument;  That will be taken care of later.
7684
7685         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
7686         Use SimpleName to resolve for now, so we can continue the work on
7687         the parser, until we get Type.GetType that understands generics.
7688
7689         (ConstructedType.ToString): Implement
7690
7691         (TypeArguments.Resolve): Resolve the child expressions as types. 
7692         
7693         * cs-parser.jay: Rename interface_constraints to
7694         type_parameter_constraints
7695
7696         (namespace_or_type_name): Only use constructed types for the basic
7697         construction, we will deal with identifier<...> later.
7698
7699         (type/type_name): No longer call DecomposeQI, as
7700         namespace_or_type_name is always decoded now.
7701         
7702 2003-07-22  Ravi Pratap  <ravi@ximian.com>
7703
7704         * expression.cs (Invocation.OverloadResolve): Follow the spec more
7705         closely: we eliminate methods in base types when we have an
7706         applicable method in a top-level type.
7707
7708         Please see section 14.5.5.1 for an exact description of what goes
7709         on. 
7710
7711         This fixes bug #45127 and a host of other related to corlib compilation.
7712
7713         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
7714         array is the method corresponding to the top-level type (this is
7715         because of the changes made to icall.c) so we change this
7716         accordingly.
7717
7718         (MethodGroupExpr.Name): This too.
7719
7720         * typemanager.cs (GetElementType): New method which does the right
7721         thing when compiling corlib. 
7722
7723         * everywhere: Make use of the above in the relevant places.
7724
7725 2003-07-22  Martin Baulig  <martin@ximian.com>
7726
7727         * cs-parser.jay (invocation_expression): Moved
7728         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
7729         `cast_expression', but create a InvocationOrCast which later
7730         resolves to either an Invocation or a Cast.
7731
7732         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
7733         method; call this before EmitStatement() to make sure that this
7734         expression can be used as a statement.
7735
7736         * expression.cs (InvocationOrCast): New class; resolves to either
7737         an Invocation or a Cast.
7738
7739         * statement.cs (StatementExpression): Call ResolveStatement() on
7740         the ExpressionStatement before emitting it.
7741
7742 2003-07-21  Martin Baulig  <martin@ximian.com>
7743
7744         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
7745         `ref' and `out' attributes match; fixes #46220.
7746         (MemberAccess.ResolveMemberAccess): You can't reference a type
7747         through an expression; fixes #33180.
7748         (Indexers.GetIndexersForType): Don't return the indexers from
7749         interfaces the class implements; fixes #46502.
7750
7751 2003-07-21  Martin Baulig  <martin@ximian.com>
7752
7753         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
7754         CS0661 checks; fixes bug #30442.
7755
7756 2003-07-21  Martin Baulig  <martin@ximian.com>
7757
7758         * decl.cs (AdditionResult): Added `Error'.
7759
7760         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
7761
7762         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
7763         cs0031.cs actually work.
7764
7765  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
7766  
7767         * cs-parser.jay (namespace_name): do not use
7768         namespace_or_type_name, use qualified_identifier, because
7769         namespace_or_type_name will soon return a composed expression
7770         instead of a string.
7771  
7772         (namespace_or_type_name): Instead of returning a string, now this
7773         production returns an expression.
7774  
7775         * codegen.cs (EmitContext): Setup IsGeneric property based on
7776         whether our DeclSpace is generic, our the method is generic.
7777  
7778         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
7779         the method is generic.
7780  
7781         * cs-parser.jay (type_arguments, opt_type_argument_list,
7782         type_parameters, type_parameter_list, opt_type_parameter_list,
7783         type_parameter,, opt_type_parameter_constraints_clauses,
7784         type_parameter_constraints_clauses,
7785         type_parameter_constraint_clause, type_parameter_constraint,
7786         interface_constraints): Add new production
7787  
7788         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
7789         DeclSpace is generic or not.
7790  
7791         (DeclSpace.SetParameterInfo): New routine, used to set the
7792         parameter info for a type.
7793  
7794         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
7795         returns a GenericTypeExpr
7796  
7797         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
7798         generic, lookup the generic argument.
7799  
7800         * attribute.cs: Do not allow TypeParameterExpressions in
7801         Attributes.
7802  
7803         * class.cs: Do not allow the Main method to be defined in a
7804         Generic container.
7805  
7806         * expression.cs (SizeOf): Do not allow generic types to be used as
7807         arguments to sizeof.
7808  
7809         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
7810         it: whether a type is generic or not.  Only works for types we are
7811         currently building for now.
7812         
7813 2003-07-20  Martin Baulig  <martin@ximian.com>
7814
7815         * namespace.cs: Fixed that bug which caused a crash when compiling
7816         the debugger's GUI.
7817
7818 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
7819
7820         * typemanager.cs (LookupTypeReflection): Never expose types which
7821         are NotPublic, NestedPrivate, NestedAssembly, or
7822         NestedFamANDAssem.  We used to return these, and later do a check
7823         that would report a meaningful error, but the problem is that we
7824         would not get the real match, if there was a name override.
7825
7826 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
7827
7828         * namespace.cs (Namespace, Name): Do not compute the namespace
7829         name dynamically, compute it in the constructor.  This reduced
7830         memory usage by 1697 KB.
7831
7832         * driver.cs: Use --pause to pause at the end.
7833
7834 2003-07-17  Peter Williams  <peter@newton.cx>
7835
7836         * Makefile: Change the name of the test target so that it doesn't
7837         conflict with the recursive test target.
7838
7839 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
7840
7841         * expression.cs (LocalVariableReference.Emit, EmitAssign,
7842         AddressOf): Do not use EmitThis, that was wrong, use the actual
7843         this pointer.
7844
7845 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
7846
7847         * class.cs (MethodData.Define): While checking if a method is an
7848         interface implementation, improve the test: If we are not public
7849         (use new test here: use the computed MethodAttributes directly,
7850         instead of the parsed modifier flags) check if the `implementing'
7851         method comes from an interface or not.
7852
7853         * pending.cs (VerifyPendingMethods): Slightly better error
7854         message.
7855
7856         * makefile: add test target that does the mcs bootstrap.
7857
7858 2003-07-16  Ravi Pratap  <ravi@ximian.com>
7859
7860         * interface.cs (Define): Do nothing here since there are no
7861         members to populate etc. Move the attribute emission out of here
7862         since this was just totally the wrong place to put it. Attribute
7863         application happens during the 'Emit' phase, not in the 'Define'
7864         phase.
7865
7866         (Emit): Add this method and move the attribute emission here
7867
7868         * rootcontext.cs (EmitCode): Call the Emit method on interface
7869         types too.
7870
7871 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
7872
7873         * expression.cs (OverloadResolve): Report error only if Location
7874         is not 'Null' which means that there was a probe going on.
7875
7876 2003-07-14  Martin Baulig  <martin@ximian.com>
7877
7878         * expression.cs (ConditionalLogicalOperator): New public class to
7879         implement user defined conditional logical operators.
7880         This is section 14.11.2 in the spec and bug #40505.
7881
7882 2003-07-14  Martin Baulig  <martin@ximian.com>
7883
7884         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
7885
7886 2003-07-14  Martin Baulig  <martin@ximian.com>
7887
7888         * codegen.cs (EmitContext.InFixedInitializer): New public field.
7889
7890         * ecore.cs (IVariable.VerifyFixed): New interface method.
7891
7892         * expression.cs (Unary.ResolveOperator): When resolving the `&'
7893         operator, check whether the variable is actually fixed.  Fixes bug
7894         #36055.  Set a variable definitely assigned when taking its
7895         address as required by the spec.
7896
7897         * statement.cs (LocalInfo.IsFixed): New field.
7898         (LocalInfo.MakePinned): Set `IsFixed' to true.
7899
7900 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
7901
7902         * attribute.cs (Attribute.Resolve): While doing a Member lookup
7903         for .ctors, ensure that we only ask for members declared in the
7904         attribute type (BindingFlags.DeclaredOnly).
7905
7906         Fixes bug #43632.
7907
7908         * expression.cs (Error_WrongNumArguments): Report error 1501
7909         correctly the way CSC does.
7910
7911 2003-07-13  Martin Baulig  <martin@ximian.com>
7912
7913         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
7914         lookup on the fully qualified name, to make things like "X.X" work
7915         where "X.X" is a fully qualified type name, but we also have a
7916         namespace "X" in the using list.  Fixes #41975.
7917
7918 2003-07-13  Martin Baulig  <martin@ximian.com>
7919
7920         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
7921         function. If we're a CompoundAssign, we need to create an embedded
7922         CompoundAssign, not an embedded Assign.
7923         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
7924         Fixes #45854.
7925
7926 2003-07-13  Martin Baulig  <martin@ximian.com>
7927
7928         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
7929         work to fix bug #46088.
7930
7931 2003-07-13  Ravi Pratap <ravi@ximian.com>
7932
7933         * class.cs (Operator.Emit): Do not emit attributes here - it is
7934         taken care of by the Method class that we delegate too. This takes
7935         care of bug #45876.
7936
7937 2003-07-10  Martin Baulig  <martin@ximian.com>
7938
7939         * expression.cs (TypeOfVoid): New class.
7940         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
7941
7942 2003-07-10  Martin Baulig  <martin@ximian.com>
7943
7944         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
7945         bug #35957.
7946
7947 2003-07-10  Martin Baulig  <martin@ximian.com>
7948
7949         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
7950         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
7951
7952         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
7953
7954         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
7955
7956 2003-07-10  Martin Baulig  <martin@ximian.com>
7957
7958         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
7959         of decimal.  Fixes #42850.
7960
7961         NOTE: I also fixed the created byte blob, but this doesn't work on
7962         the MS runtime and csc never produces any byte blobs for decimal
7963         arrays.
7964
7965 2003-07-10  Martin Baulig  <martin@ximian.com>
7966
7967         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
7968         structs; fixes #32068.
7969         (Block.AddChildVariableNames): Fixed #44302.
7970
7971 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7972
7973         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
7974
7975 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
7976
7977         * attribute.cs: And this test is onger needed.
7978
7979 2003-07-08  Martin Baulig  <martin@ximian.com>
7980
7981         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
7982         inaccessible types.  Fixes #36313.
7983
7984         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
7985
7986         * namespace.cs (NamespaceEntry): Create implicit entries for all
7987         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
7988         implicit entries for N1.N2 and N1.
7989
7990 2003-07-08  Martin Baulig  <martin@ximian.com>
7991
7992         Rewrote the handling of namespaces to fix a lot of the issues
7993         wrt. `using' aliases etc.
7994
7995         * namespace.cs (Namespace): Splitted this class into a
7996         per-assembly `Namespace' and a per-file `NamespaceEntry'.
7997
7998         * typemanager.cs (TypeManager.IsNamespace): Removed.
7999         (TypeManager.ComputeNamespaces): Only compute namespaces from
8000         loaded assemblies here, not the namespaces from the assembly we're
8001         currently compiling.
8002
8003 2003-07-08  Martin Baulig  <martin@ximian.com>
8004
8005         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
8006
8007 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
8008
8009         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
8010         already fixed it.  
8011
8012         I thought about the memory savings here, but LookupTypeReflection
8013         is used under already very constrained scenarios.  Compiling
8014         corlib or mcs only exposes one hit, so it would not really reduce
8015         any memory consumption.
8016
8017 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8018
8019         * typemanager.cs: fixes bug #45889 by only adding public types from
8020         other assemblies to the list of known types.
8021
8022 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
8023
8024         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
8025         on the type we resolved.
8026
8027 2003-07-05  Martin Baulig  <martin@ximian.com>
8028
8029         * pending.cs (PendingImplementation.ParentImplements): Don't
8030         create the proxy if the parent is abstract.
8031
8032         * class.cs (TypeContainer.DefineIndexers): Process explicit
8033         interface implementations first.  Fixes #37714.
8034
8035 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
8036
8037         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
8038         defined recursively;  but since we modify the input parameters
8039         (left is set to `this' temporarily), we reset this value if the
8040         left_is_explicit is false, which gives the original semantics to
8041         the code.  
8042
8043         * literal.cs (NullPointer): new class used to represent a null
8044         literal in a pointer context.
8045
8046         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
8047         type is a pointer, use a NullPointer object instead of a
8048         NullLiteral.   Closes 43687
8049
8050         (ExplicitConversion): Convert pointer values using
8051         the conv opcode to the proper type.
8052
8053         * ecore.cs (New): change ValueTypeVariable property into a method,
8054         that returns whether the valuetype is suitable for being used.
8055
8056         * expression.cs (Binary.DoNumericPromotions): Only return if we
8057         the int constant was a valid uint, and we can return both left and
8058         right as uints.  If not, we continue processing, to trigger the
8059         type conversion.  This fixes 39018.
8060
8061         * statement.cs (Block.EmitMeta): During constant resolution, set
8062         the CurrentBlock property on the emitcontext, so that we resolve
8063         constants propertly.
8064
8065 2003-07-02  Martin Baulig  <martin@ximian.com>
8066
8067         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
8068         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
8069
8070         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
8071         than emitting it here.
8072
8073         * statement.cs: Fixed some more flow analysis bugs.
8074
8075 2003-07-02  Martin Baulig  <martin@ximian.com>
8076
8077         * class.cs (MethodData.Define): When implementing interface
8078         methods, set Final unless we're Virtual.
8079
8080         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
8081         check work for interface methods.
8082
8083 2003-07-01  Martin Baulig  <martin@ximian.com>
8084
8085         * ecore.cs (EmitContext.This): Replaced this property with a
8086         GetThis() method which takes a Location argument.  This ensures
8087         that we get the correct error location for a CS0188.
8088
8089 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
8090
8091         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
8092         ImplicitStandardConversion.
8093
8094         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
8095
8096 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
8097
8098         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
8099         optimization.
8100
8101 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
8102
8103         * class.cs (Constructor.Define): Turn off initlocals for unsafe
8104         constructors.
8105
8106         (MethodData.Define): Turn off initlocals for unsafe methods.
8107
8108 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
8109
8110         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
8111         complete;  Fixes #37521.
8112
8113         * delegate.cs: Use Modifiers.TypeAttr to compute the
8114         TypeAttributes, instead of rolling our own.  This makes the flags
8115         correct for the delegates.
8116
8117 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
8118
8119         * class.cs (Constructor.Define): Set the private flag for static
8120         constructors as well.
8121
8122         * cs-parser.jay (statement_expression): Set the return value to
8123         null, to avoid a crash when we catch an error.
8124
8125 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
8126
8127         * cs-parser.jay: Applied patch from Jackson that adds support for
8128         extern and unsafe modifiers to destructor declarations.
8129
8130         * expression.cs: Report error 21 if the user is trying to index a
8131         System.Array.
8132
8133         * driver.cs: Add an error message, suggested by the bug report.
8134
8135         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
8136         if we do not have a ": this ()" constructor initializer.  Fixes 45149
8137
8138 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
8139
8140         * namespace.cs: Add some information to reduce FAQs.
8141
8142 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
8143
8144         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
8145         underlying enumeration types.  Fixes #43915.
8146
8147         * expression.cs: Treat ushort/short as legal values to be used in
8148         bitwise operations.
8149
8150 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
8151
8152         * delegate.cs: transfer custom attributes for paramenters from
8153         the delegate declaration to Invoke and BeginInvoke.
8154
8155 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
8156
8157         * attribute.cs: handle custom marshalers and emit marshal info
8158         for fields, too.
8159
8160 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
8161
8162         * makefile.gnu: Added anonymous.cs to the compiler sources.
8163
8164 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
8165
8166         * iterators.cs: Change the name of the proxy class to include two
8167         underscores.
8168
8169         * cs-parser.jay: Update grammar to include anonymous methods.
8170
8171         * anonymous.cs: new file.
8172
8173 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
8174
8175         * class.cs (Field.Define): Add missing test for pointers and
8176         safety. 
8177
8178 2003-05-27  Ravi Pratap  <ravi@ximian.com>
8179
8180         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
8181         we use the stobj opcode.
8182
8183         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
8184         since it wasn't the correct fix. 
8185
8186         It still is puzzling that we are required to use stobj for IntPtr
8187         which seems to be a ValueType.
8188
8189 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
8190
8191         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
8192         during regular simple name resolution.   Now, the trick is that
8193         instead of returning for processing the simplename, we do a
8194         TypeManager.LookupType (ie, a rooted lookup as opposed to a
8195         contextual lookup type).   If a match is found, return that, if
8196         not, return for further composition.
8197
8198         This fixes long-standing 30485.
8199
8200         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
8201         using the address to initialize an object, do an Stobj instead of
8202         using the regular Stelem.
8203
8204         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
8205         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
8206         Because if we are a BaseIndexerAccess that value will be true.
8207         Fixes 43643.
8208
8209         * statement.cs (GotoCase.Resolve): Return after reporting an
8210         error, do not attempt to continue. 
8211
8212         * expression.cs (PointerArithmetic.Emit): If our operand is a
8213         long, convert our constants to match the operand before
8214         multiplying.  Convert to I type before adding.   Fixes 43670.
8215
8216 2003-05-14  Ravi Pratap  <ravi@ximian.com>
8217
8218         * enum.cs (ImplicitConversionExists) : Rename to
8219         ImplicitEnumConversionExists to remove ambiguity. 
8220
8221         * ecore.cs (NullCast): New type of cast expression class which
8222         basically is very similar to EmptyCast with the difference being
8223         it still is a constant since it is used only to cast a null to
8224         something else
8225         (eg. (string) null)
8226
8227         * convert.cs (ImplicitReferenceConversion): When casting a null
8228         literal, we return a NullCast.
8229
8230         * literal.cs (NullLiteralTyped): Remove - I don't see why this
8231         should be around anymore.
8232
8233         The renaming (reported was slightly wrong). Corrections:
8234
8235         ConvertImplicitStandard -> ImplicitConversionStandard
8236         ConvertExplicitStandard -> ExplicitConversionStandard
8237
8238         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
8239         before passing them in !
8240
8241         * convert.cs (ImplicitConversionStandard): When comparing for
8242         equal expr and target types, ensure that expr is not a
8243         NullLiteral.
8244
8245         In general, we must not be checking (expr_type ==
8246         target_type) in the top level conversion methods
8247         (ImplicitConversion, ExplicitConversion etc). This checking is
8248         done in the methods that they delegate to.
8249
8250 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
8251
8252         * convert.cs: Move Error_CannotConvertType,
8253         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
8254         ImplicitNumericConversion, ImplicitConversionExists,
8255         ImplicitUserConversionExists, StandardConversionExists,
8256         FindMostEncompassedType, FindMostSpecificSource,
8257         FindMostSpecificTarget, ImplicitUserConversion,
8258         ExplicitUserConversion, GetConversionOperators,
8259         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
8260         TryImplicitIntConversion, Error_CannotConvertImplicit,
8261         ConvertImplicitRequired, ConvertNumericExplicit,
8262         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
8263         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
8264         its own file.
8265
8266         Perform the following renames:
8267
8268         StandardConversionExists -> ImplicitStandardConversionExists
8269         ConvertImplicit -> ImplicitConversion
8270         ConvertImplicitStandard -> ImplicitStandardConversion
8271         TryImplicitIntConversion -> ImplicitIntConversion
8272         ConvertImplicitRequired -> ImplicitConversionRequired
8273         ConvertNumericExplicit -> ExplicitNumericConversion
8274         ConvertReferenceExplicit -> ExplicitReferenceConversion
8275         ConvertExplicit -> ExplicitConversion
8276         ConvertExplicitStandard -> ExplicitStandardConversion
8277
8278 2003-05-19  Martin Baulig  <martin@ximian.com>
8279
8280         * statement.cs (TypeInfo.StructInfo): Made this type protected.
8281         (TypeInfo): Added support for structs having structs as fields.
8282
8283         * ecore.cs (FieldExpr): Implement IVariable.
8284         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
8285         VariableInfo for the field.
8286
8287 2003-05-18  Martin Baulig  <martin@ximian.com>
8288
8289         * expression.cs (This.DoResolve): Report a CS0027 if we're
8290         emitting a field initializer.
8291
8292 2003-05-18  Martin Baulig  <martin@ximian.com>
8293
8294         * expression.cs (This.ResolveBase): New public function.
8295         (This.DoResolve): Check for CS0188.
8296
8297         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
8298         This.Resolve().
8299
8300         * ecore.cs (MethodGroupExpr.DoResolve): Set the
8301         `instance_expression' to null if we don't have any non-static
8302         methods.
8303
8304 2003-05-18  Martin Baulig  <martin@ximian.com>
8305
8306         Reworked the way how local variables and parameters are handled by
8307         the flow analysis code.
8308
8309         * statement.cs (TypeInfo, VariableMap): New public classes.
8310         (VariableInfo): New public class.  This is now responsible for
8311         checking whether a variable has been assigned.  It is used for
8312         parameters and local variables.
8313         (Block.EmitMeta): Take the InternalParameters as argument; compute
8314         the layout of the flow vectors here.
8315         (Block.LocalMap, Block.ParameterMap): New public properties.
8316         (FlowBranching): The .ctor doesn't get the InternalParameters
8317         anymore since Block.EmitMeta() now computes the layout of the flow
8318         vector.
8319         (MyStructInfo): This class is now known as `StructInfo' and nested
8320         in `TypeInfo'; we don't access this directly anymore.
8321
8322         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
8323         property and removed IsAssigned(), IsFieldAssigned(),
8324         SetAssigned() and SetFieldAssigned(); we now call them on the
8325         VariableInfo so we don't need to duplicate this code everywhere.
8326
8327         * expression.cs (ParameterReference): Added `Block block' argument
8328         to the .ctor.
8329         (LocalVariableReference, ParameterReference, This): The new
8330         VariableInfo class is now responsible for all the definite
8331         assignment stuff.
8332
8333         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
8334         IsParameterAssigned, SetParameterAssigned): Removed.
8335
8336 2003-05-18  Martin Baulig  <martin@ximian.com>
8337
8338         * typemanager.cs (InitCoreTypes): Try calling
8339         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
8340         the 3-args-version.  Corlib now also needs our `void_type'.
8341         (GetMethod): Added overloaded version which takes an optional
8342         `bool report_errors' to allow lookups of optional methods.
8343
8344 2003-05-12  Martin Baulig  <martin@ximian.com>
8345
8346         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
8347         only used for locals and not for parameters.
8348
8349 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
8350
8351         * support.cs (InternalParameters.ParameterType): Return the
8352         ExternalType of the parameter.
8353
8354         * parameter.cs (Parameter.ExternalType): drop the two arguments,
8355         they were unused.
8356
8357 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
8358
8359         * class.cs (MethodData.Define): Do not set the `newslot' on
8360         interface members, if they are also flagged as "override".
8361
8362         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
8363         better code for ++i and i++.  This only works for static fields
8364         and local variables.
8365
8366         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
8367         want to pull the DeclSpace out of the builder_to_declspace instead
8368         of the TypeBuilder (like in TypeContainer.FindMembers).
8369
8370         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
8371         instead of LookupTypeContainer.  Fixes the crash on .NET for
8372         looking up interface members.
8373
8374         * const.cs: Create our own emit context during the Definition
8375         stage, so that constants are evaluated in the proper context, when
8376         a recursive definition happens.
8377
8378 2003-05-11  Martin Baulig  <martin@ximian.com>
8379
8380         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
8381         new block for a switch section.
8382         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
8383         the adding/lookup in the switch block.  Fixes #39828.
8384
8385 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
8386
8387         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
8388         functionality: I needed to convert the data after I had performed
8389         the add/sub operation into the operands type size.
8390
8391         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
8392         pass the type for the box operation, otherwise the resulting
8393         object would have been of type object.
8394
8395         (BoxedCast): Add constructor to specify the type to box as.
8396
8397 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
8398
8399         * iterators.cs: I was reusing the `count' variable inadvertently,
8400         take steps to not allow this to happen.
8401
8402 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
8403
8404         * attribute.cs (Attribute.Resolve): Params attributes are encoded
8405         by creating an array at the point where the params starts and
8406         putting all those arguments there, then adjusting the size of the
8407         array.
8408
8409 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
8410
8411         * expression.cs (New.AddressOf): Implement interface
8412         IMemoryLocation.  This is used when the `new' operator is used in
8413         the context of an invocation to a method on a value type.
8414
8415         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
8416         example. 
8417
8418         * namespace.cs: Also check the using aliases here.
8419
8420         * driver.cs: Move the test for using validity after the types have
8421         been entered, so we do a single pass that also includes the using
8422         aliases. 
8423
8424         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
8425         in the regular case.   CreateSiblingForFinally is doing extra
8426         error checking.
8427
8428         * attribute.cs (GetAttributeArgumentExpression): Store the result
8429         on an out value, and use the return value to indicate failure
8430         instead of using null (which is a valid return for Constant.GetValue).
8431
8432         * statement.cs: Perform the analysis flow for the increment
8433         portion after the statement, because this will be the real flow of
8434         execution.  Fixes #42385
8435
8436         * codegen.cs (EmitContext.EmitArgument,
8437         EmitContext.EmitStoreArgument): New helper functions when the
8438         RemapToProxy flag is set.
8439
8440         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
8441         function.
8442
8443         Add support for remapping parameters. 
8444
8445         * iterators.cs: Propagate parameter values;  Store parameter
8446         values in the proxy classes.
8447
8448 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
8449
8450         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
8451         need a proxy reference;  I do not know what I was thinking
8452
8453         * cs-parser.jay (constructor_initializer): catch another error,
8454         and display nice message.
8455
8456         (field_declaration): catch void field declaration
8457         to flag a better error. 
8458
8459         * class.cs (MemberBase.CheckBase): Report an error instead of a
8460         warning if a new protected member is declared in a struct. 
8461         (Field.Define): catch the error of readonly/volatile.
8462
8463         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
8464
8465         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
8466         volatile variable is taken
8467
8468 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
8469
8470         * statement.cs (Fixed.Resolve): Report an error if we are not in
8471         an unsafe context.
8472
8473 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
8474
8475         * typemanager.cs: reuse the code that handles type clashes for
8476         delegates and enumerations.
8477
8478         * class.cs (Report28): Always report.
8479
8480         * expression.cs (EncodeAsAttribute): Allow nulls here.
8481
8482 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
8483
8484         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
8485         the functionality for testing whether an expression is valid for
8486         an attribute here.  Also handle the case of arrays of elements
8487         being stored. 
8488
8489         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
8490         encoding a linear array into an array of objects that are suitable
8491         to be passed to an CustomAttributeBuilder.
8492
8493         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
8494
8495         * ecore.cs: (FieldExpr): Handle field remapping here.
8496
8497         * iteratators.cs: Pass the instance variable (if the method is an
8498         instance method) to the constructors, so we can access the field
8499         variables on the class.
8500
8501         TODO: Test this with structs.  I think the THIS variable on
8502         structs might have to be a pointer, and not a refenrece
8503
8504 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
8505
8506         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
8507         local variables to fields in a proxy class.
8508
8509         * iterators.cs (PopulateProxy): Rename our internal fields to
8510         <XXX>.  
8511         Create a <THIS> field if we are an instance method, so we can
8512         reference our parent container variables.
8513         (MapVariable): Called back from the EmitContext code to enter a
8514         new variable to field mapping into the proxy class (we just create
8515         a FieldBuilder).
8516
8517         * expression.cs
8518         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
8519         for using the remapped locals to fields.
8520
8521         I placed the code here, because that gives the same semantics to
8522         local variables, and only changes the Emit code.
8523
8524         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
8525         statements inside iterators.
8526         (VariableInfo): Add a FieldBuilder for the cases when we are
8527         remapping local variables to fields in a proxy class
8528
8529         * ecore.cs (SimpleNameResolve): Avoid testing two times for
8530         current_block != null.
8531
8532         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
8533         not cope with strings, as it has been moved to the
8534         TableSwitchEmit.  Fixed bug in switch generation.
8535
8536         * expression.cs (New.DoResolve): Provide more context for the user
8537         when reporting an error.
8538
8539         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
8540         pointers. 
8541
8542         * expression.cs (MemberAccess.DoResolve): When we get a type back,
8543         check the permissions for it.  Note than in a type-resolution
8544         context the check was already present in DeclSpace.ResolveType,
8545         but was missing from the MemberAccess.
8546
8547         (ArrayCreation.CheckIndices): warn if the user has
8548         more nested levels of expressions, but there are no more
8549         dimensions specified.  Avoids crash on bug 41906.
8550
8551 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
8552
8553         * statement.cs (Block): replace Implicit bool, for a generic
8554         flags.   
8555         New flag: `Unchecked'.  This is used during the EmitMeta phase
8556         (which is out-of-line with the regular Resolve/Emit process for a
8557         statement, as this is done ahead of time, but still gets a chance
8558         to call constant resolve).
8559
8560         (Block.Flags): new enum for adding a new flag.
8561
8562         (Block.EmitMeta): track the state of unchecked.
8563
8564         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
8565         to enable constant resolution to work there as well.
8566
8567 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
8568
8569         * typemanager.cs (ienumerable_type): Also look up
8570         System.Collections.IEnumerable. 
8571
8572 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
8573
8574         TODO: Test more than one conditional per method.
8575
8576         * class.cs (Indexer.Define): Report the location where the user is
8577         referencing the unsupported feature.
8578
8579         (MethodData): Overload the use of `conditionals' to
8580         minimize the creation of needless ArrayLists.   This saves roughly
8581         212kb on my machine.
8582
8583         (Method): Implement the new IIteratorContainer interface.
8584         (Method.SetYields): Implement the method by setting the ModFlags
8585         to contain METHOD_YIELDS.
8586
8587         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
8588         which just got set to null.
8589
8590         * iterators.cs: New file.
8591
8592         (Yield, YieldBreak): New statements.
8593
8594         * statement.cs (Return.Resolve): Flag an error if we are used in
8595         an iterator method.
8596
8597         * codegen.cs (InIterator): New flag set if the code is being
8598         compiled in an iterator method.
8599
8600         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
8601         internal modifier, and we just use it to avoid adding extra
8602         fields, as this is seldom used.  
8603
8604         * cs-parser.jay: Add yield_statement (yield and yield break).
8605
8606         * driver.cs: New flag -v2 to turn on version 2 features. 
8607
8608         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
8609         hashtable when v2 is enabled.
8610
8611 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
8612
8613         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
8614         there is already a namespace defined with this name.
8615
8616         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
8617         people upgraded their corlibs.
8618
8619         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
8620         always use fully qualified types, no need to use the compiler
8621         front end.
8622
8623         (TypeManager.IsNamespace): Use binarysearch.
8624
8625         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
8626         AddDelegate): I did not quite use the new IsValid API properly: I
8627         have to pass the short-name and the fullname.  I was passing only
8628         the basename instead of the fullname sometimes. 
8629
8630         (TypeContainer.DefineType): call NamespaceClash.
8631
8632         * interface.cs (Interface.DefineType): use NamespaceClash before
8633         defining the type.
8634
8635         * delegate.cs (Delegate.DefineType): use NamespaceClash before
8636         defining the type.
8637
8638         * enum.cs: (Enum.DefineType): use NamespaceClash before
8639         defining the type.
8640
8641         * typemanager.cs (: 3-line patch that gives us some tasty 11%
8642         speed increase.  First, use the negative_hits cache when we get a
8643         negative.  Second, add the type with its full original name
8644         instead of the new . and + encoded name (reflection uses + to
8645         separate type from a nested type).  Use LookupTypeReflection
8646         directly which bypasses the type->name hashtable (that we already
8647         know does not contain the type.
8648
8649         * decl.cs (DeclSpace.ResolveTypeExpr): track the
8650         location/container type. 
8651
8652         * driver.cs: When passing utf8, use directly the UTF8Encoding.
8653
8654 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
8655
8656         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
8657
8658         * delegate.cs (NewDelegate.Resolve): Test whether an instance
8659         method is being referenced in the method group from a static
8660         context, and report error 120 if so.
8661
8662         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
8663         Error118. 
8664
8665         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
8666         is created, we create the A namespace).
8667
8668         * cs-parser.jay: A namespace also introduces a DeclarationFound.
8669         Fixes #41591
8670
8671 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
8672
8673         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
8674         invocation to ModuleBuilder.GetType with the same values will
8675         return a new type instance, so we need to cache its return
8676         values. 
8677
8678         * expression.cs (Binary.ResolveOperator): Only allow the compare
8679         operators on enums if they are of the same type.
8680
8681         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
8682         types of ValueType on their own case.  Before we were giving them
8683         the same treatment as objects.
8684
8685         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
8686         fullname.  Short name is used to compare against container name.
8687         Fullname is used to check against defined namespace names.
8688
8689         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
8690         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
8691
8692         (Method.CheckBase): Call parent.
8693         (MemberBase.CheckBase): Check for protected members on sealed
8694         classes.
8695         (PropertyBase.CheckBase): Call parent.
8696         (Field.Define): Call parent.
8697
8698         * report.cs: Negative error codes are now mapped to 8000 - code,
8699         so that the display is render more nicely.
8700
8701         * typemanager.cs: Do not use try/catch, instead report a regular
8702         error. 
8703
8704         (GetPointerType, GetReferenceType): These methods provide
8705         mechanisms to obtain the T* and T& from a T.  We had the code
8706         previously scattered around the code base, and it also used
8707         TypeManager.LookupType that would go through plenty of caches.
8708         This one goes directly to the type source.
8709
8710         In some places we did the Type.GetType followed by
8711         ModuleBuilder.GetType, but not in others, so this unifies the
8712         processing as well.
8713
8714         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
8715         statements now that we have namespace information.
8716
8717         * typemanager.cs (IsNamespace): New method, returns whether the
8718         string presented is a namespace or not.
8719
8720         (ComputeNamespaces): New public entry point, computes the list of
8721         available namespaces, using the GetNamespaces API call in Mono, or
8722         the slower version in MS.NET.   
8723
8724         Now before we start the semantic analysis phase, we have a
8725         complete list of namespaces including everything that the user has
8726         provided.
8727
8728         Deleted old code to cache namespaces in .nsc files.
8729
8730 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
8731
8732         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
8733         class/struct location definition Location for the implicit
8734         constructor location.
8735
8736         (Operator.Define): Use the location of the operator for the
8737         implicit Method definition.
8738
8739         (Constructor.Emit): use the constructor location for the implicit
8740         base initializer constructor.
8741
8742         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
8743         and the Expression class now contains two new methods:
8744
8745         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
8746         isolate type lookup from the rest of the resolution process.
8747
8748         Since we use Expressions to hold type definitions due to the way
8749         we parse the input we have historically overloaded Resolve to
8750         perform the Type lookups if a special flag is passed.  Now this is
8751         eliminated and two methods take their place. 
8752
8753         The differences in the two methods between xStep and xTerminal is
8754         that xStep is involved in our current lookup system that uses
8755         SimpleNames to compose a name, while xTerminal is used just to
8756         catch the case where the simplename lookup failed.
8757
8758 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
8759
8760         * expression.cs (ResolveMemberAccess): Remove redundant code.
8761         TypeExpr expressions are always born fully resolved.
8762
8763         * interface.cs (PopulateMethod): Do not lookup the types twice.
8764         We were doing it once during SemanticAnalysis and once during
8765         PopulateMethod.
8766
8767         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
8768         in local variable type definitions, were being returned as a
8769         SimpleName (we decomposed everything into a string), that is
8770         because primary_expression was being used instead of a type in the
8771         grammar (reduce/reduce conflicts).
8772
8773         The part that was wrong is that we converted the expression into a
8774         string (an oversimplification in one hand, compounded with primary
8775         expressions doing string concatenation).
8776
8777         So things like:
8778
8779         A.B.C [] x;
8780
8781         Would return "A.B.C[]" as a SimpleName.  This stopped things like
8782         using clauses from working on this particular context.  And a type
8783         was being matched directly against "A.B.C[]".
8784
8785         We now use the correct approach, and allow for ComposedCast to be
8786         part of the unary expression.  So the "A.B.C []" become a composed
8787         cast of "A.B.C" (as a nested group of MemberAccess with a
8788         SimpleName at the end) plus the rank composition "[]". 
8789
8790         Also fixes 35567
8791
8792 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
8793
8794         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
8795         for the access level checking.
8796
8797         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
8798         `TypeContainer container', because I kept getting confused when I
8799         was debugging this code.
8800
8801         * expression.cs (Indexers): Instead of tracking getters/setters,
8802         we now track them in parallel.  We create one arraylist less, but
8803         most importantly it is possible now for the LValue code to find a
8804         matching get for a set.
8805
8806         (IndexerAccess.DoResolveLValue): Update the code.
8807         GetIndexersForType has been modified already to extract all the
8808         indexers from a type.  The code assumed it did not.
8809
8810         Also make the code set the correct return type for the indexer.
8811         This was fixed a long time ago for properties, but was missing for
8812         indexers.  It used to be void_type.
8813
8814         (Binary.Emit): Test first for doubles instead of
8815         floats, as they are more common.
8816
8817         (Binary.EmitBranchable): Use the .un version of the branch opcodes
8818         when dealing with floats and the <=, >= operators.  This fixes bug
8819         #39314 
8820
8821         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
8822         to load the array value by emitting a load on the foreach variable
8823         type.  This was incorrect.  
8824
8825         We now emit the code to load an element using the the array
8826         variable type, and then we emit the conversion operator.
8827
8828         Fixed #40176
8829
8830 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
8831
8832         * attribute.cs: Avoid allocation of ArrayLists in the common case.
8833
8834 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
8835
8836         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
8837         test for protection before we test for signatures. 
8838
8839         (MethodSignature.ToString): implement.
8840
8841         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
8842         to the case where we reduced into a LongConstant.
8843
8844         * decl.cs (CheckAccessLevel): If the type is an array, we can not
8845         depend on whether the information is acurrate, because the
8846         Microsoft runtime will always claim that the array type is public,
8847         regardless of the real state.
8848
8849         If the type is a pointer, another problem happens: the type is
8850         reported as non-public in Microsoft.  
8851
8852         In both cases we have to call CheckAccessLevel recursively with
8853         the underlying type as the argument to be tested.
8854
8855 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
8856
8857         * assign.cs (Assign.Emit): If we are dealing with a compound
8858         assignment expression, we should use the code path that stores the
8859         intermediate result in a temporary value.  This fixes #40903.
8860
8861         *expression.cs (Indirection.ToString): Provide ToString method for
8862         debugging. 
8863
8864 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
8865
8866         * class.cs: Null out fields holding references to Block objects so
8867         they can be garbage collected.
8868
8869         * expression.cs (OverloadResolve): Remove unused local.
8870
8871 2003-04-07  Martin Baulig  <martin@ximian.com>
8872
8873         * codegen.cs (EmitContext.CurrentFile): New public field.
8874         (EmitContext.Mark): Use the CurrentFile to check whether the
8875         location is in the correct file.
8876         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
8877
8878 2003-04-07  Martin Baulig  <martin@ximian.com>
8879
8880         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
8881
8882         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
8883         location.  [FIXME: The location argument which gets passed to this
8884         method is sometimes wrong!]
8885
8886 2003-04-07  Nick Drochak <ndrochak@gol.com>
8887
8888         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
8889
8890 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
8891
8892         * expression.cs (Indirection.EmitAssign): We were using the
8893         temporary, but returning immediately instead of continuing the
8894         EmitAssing flow.
8895
8896 2003-04-06  Martin Baulig  <martin@ximian.com>
8897
8898         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
8899         if it's a nested child, but also deriving from the outer class.
8900         See test 190.cs.
8901
8902         * typemanager.cs (IsNestedChildOf): Make this work if it's a
8903         nested child, but also deriving from the outer class.  See
8904         test-190.cs.
8905         (FilterWithClosure): We may access private members of the outer
8906         class if we're a nested child and deriving from the outer class.
8907         (RealMemberLookup): Only set `closure_private_ok' if the
8908         `original_bf' contained BindingFlags.NonPublic.
8909
8910 2003-04-05  Martin Baulig  <martin@ximian.com>
8911
8912         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
8913         probe if its a type parameter, and if so, flag an error.
8914
8915         * decl.cs: Move here the SetParameterInfo code from class.cs.
8916         Handle IsGeneric here.
8917
8918         Handle a variety of errors in the parameter info definition.
8919
8920         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
8921         type parameters here.
8922
8923         * cs-parser.jay (class_declaration): report errors for parameters
8924         here as well.
8925
8926 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
8927
8928         * generic.cs: New file, contains support code for generics.
8929
8930         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
8931         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
8932
8933         Update parser for the above removals.
8934
8935         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
8936         now taken care of in the parser.
8937
8938 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
8939
8940         * class.cs (Event.Define): Do not allow abstract events to have
8941         initializers. 
8942
8943 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
8944
8945         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
8946         block in event declarations.
8947
8948         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
8949         value type, get its address.
8950
8951         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
8952         leaving a class on the stack instead of a boolean value (int
8953         0/1).  Change the code so we compare against null, and then the
8954         result against zero.
8955
8956         * class.cs (TypeContainer.GetClassBases): We were checking for the
8957         parent class being sealed too late.
8958
8959         * expression.cs (Binary.Emit): For <= and >= when dealing with
8960         floating point values, use cgt.un and clt.un instead of cgt and
8961         clt alone.
8962
8963 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
8964
8965         * statement.cs: Apply the same optimization as MS: skip the 
8966         GetEnumerator returning an IEnumerator, and use the one returning a 
8967         CharEnumerator instead. This allows us to avoid the try-finally block 
8968         and the boxing.
8969
8970 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
8971
8972         * cs-parser.jay: Attributes cannot be applied to
8973                          namespaces. Fixes #40473
8974
8975 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8976
8977         * class.cs:
8978         (Add*): check if the name is valid using the full name for constants,
8979         fields, properties and events.
8980
8981 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
8982
8983         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
8984         char constants to be part of the enumeration.
8985
8986         * expression.cs (Conditional.DoResolve): Add support for operator
8987         true. Implements the missing functionality from 14.12
8988
8989         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
8990         operator true/false as required by the spec.
8991
8992         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
8993         implicit conversion to boolean.
8994
8995         * statement.cs (Statement.ResolveBoolean): A boolean expression is
8996         also one where the type implements `operator true'. 
8997
8998         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
8999         get an expression that will invoke operator true based on an
9000         expression.  
9001
9002         (GetConversionOperators): Removed the hack that called op_True
9003         here.  
9004
9005         (Expression.ResolveBoolean): Move this from Statement.
9006
9007 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
9008
9009         * ecore.cs (FieldExpr): do not allow initialization of initonly
9010         fields on derived classes
9011
9012 2003-03-13  Martin Baulig  <martin@ximian.com>
9013
9014         * statement.cs (Block.Emit): Call ig.BeginScope() and
9015         ig.EndScope() when compiling with debugging info; call
9016         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
9017
9018 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
9019
9020         * expression.cs (Indexers): Do not construct immediately, allow
9021         for new members to be appended as we go.  Fixes 38143
9022
9023 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9024
9025         * expression.cs: save/restore context when resolving an unchecked
9026         expression.
9027
9028 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
9029
9030         * cfold.cs: Catch division by zero in modulus operator during
9031         constant folding.
9032
9033 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
9034
9035         * interface.cs (Interface.DefineMembers): Avoid defining members
9036         twice. 
9037
9038 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
9039
9040         * driver.cs: handle the +/- options for -noconfig
9041
9042         * statement.cs (Unckeched.Resolve): Also track the state of
9043         unchecked in the Resolve phase.
9044
9045 2003-02-27  Martin Baulig  <martin@ximian.com>
9046
9047         * ecore.cs (Expression.MemberLookup): Don't create a
9048         MethodGroupExpr for something which is not a method.  Fixes #38291.
9049
9050 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
9051
9052         * class.cs (MemberBase.CheckParameters): Also check that the type
9053         is unmanaged if it is a pointer.
9054
9055         * expression.cs (SizeOf.Resolve): Add location information.
9056
9057         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
9058         a managed type is declared.
9059
9060         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
9061         parameter modifiers as well.  Fixes bug 38606
9062
9063         * class.cs: Very sad.  Am backing out the speed up changes
9064         introduced by the ArrayList -> Array in the TypeContainer, as they
9065         were not actually that much faster, and introduced a bug (no error
9066         reports on duplicated methods).
9067
9068         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
9069         source first, this will guarantee that we have a valid expression
9070         before calling in lower levels functions that will require a
9071         resolved object.  Then use this original_source in the
9072         target.ResolveLValue instead of the original source that was
9073         passed to us.
9074
9075         Another change.  Use target.Resolve instead of LValueResolve.
9076         Although we are resolving for LValues, we will let the Assign code
9077         take care of that (it will be called again from Resolve).  This
9078         basically allows code like this:
9079
9080         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
9081         class Y { void A (X x) { x [0] += o; }
9082
9083         The problem was that the indexer was trying to resolve for
9084         set_Item (idx, object o) and never finding one.  The real set_Item
9085         was set_Item (idx, X).  By delaying the process we get the right
9086         semantics. 
9087
9088         Fixes bug 36505
9089
9090 2003-02-23  Martin Baulig  <martin@ximian.com>
9091
9092         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
9093         while calling DoEmit ().
9094
9095         * codegen.cs (EmitContext.Mark): Don't mark locations in other
9096         source files; if you use the #line directive inside a method, the
9097         compiler stops emitting line numbers for the debugger until it
9098         reaches the end of the method or another #line directive which
9099         restores the original file.
9100
9101 2003-02-23  Martin Baulig  <martin@ximian.com>
9102
9103         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
9104
9105 2003-02-23  Martin Baulig  <martin@ximian.com>
9106
9107         * statement.cs (Block.AddChildVariableNames): We need to call this
9108         recursively, not just for our immediate children.
9109
9110 2003-02-23  Martin Baulig  <martin@ximian.com>
9111
9112         * class.cs (Event.Define): Always make the field private, like csc does.
9113
9114         * typemanager.cs (TypeManager.RealMemberLookup): Make events
9115         actually work, fixes bug #37521.
9116
9117 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
9118
9119         * delegate.cs: When creating the various temporary "Parameters"
9120         classes, make sure that we call the ComputeAndDefineParameterTypes
9121         on those new parameters (just like we do with the formal ones), to
9122         allow them to be resolved in the context of the DeclSpace.
9123
9124         This fixes the bug that Dick observed in Bugzilla #38530.
9125
9126 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
9127
9128         * expression.cs (ResolveMemberAccess): When resolving a constant,
9129         do not attempt to pull a constant if the value was not able to
9130         generate a valid constant.
9131
9132         * const.cs (LookupConstantValue): Do not report more errors than required.
9133
9134 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9135
9136         * expression.cs: fixes bug #38328.
9137
9138 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
9139
9140         * class.cs: Changed all the various members that can be part of a
9141         class from being an ArrayList to be an Array of the right type.
9142         During the DefineType type_list, interface_list, delegate_list and
9143         enum_list are turned into types, interfaces, delegates and enums
9144         arrays.  
9145
9146         And during the member population, indexer_list, event_list,
9147         constant_list, field_list, instance_constructor_list, method_list,
9148         operator_list and property_list are turned into their real arrays.
9149
9150         Although we could probably perform this operation earlier, for
9151         good error reporting we need to keep the lists and remove the
9152         lists for longer than required.
9153
9154         This optimization was triggered by Paolo profiling the compiler
9155         speed on the output of `gen-sample-program.pl' perl script. 
9156
9157         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
9158         not crash in methods like MemberLookupFailed that use this field.  
9159
9160         This problem arises when the compiler fails to resolve a type
9161         during interface type definition for example.
9162
9163 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
9164
9165         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
9166         inherit from System.Object, so we have to stop at null, not only
9167         when reaching System.Object.
9168
9169 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
9170
9171         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
9172         DeclaredOnly because the parent indexer might have had a different
9173         name, but did not loop until the top of the hierarchy was reached.
9174
9175         The problem this one fixes is 35492: when a class implemented an
9176         indexer from an interface, we were getting the interface method
9177         (which was abstract) and we were flagging an error (can not invoke
9178         abstract method).
9179
9180         This also keeps bug 33089 functioning, and test-148 functioning.
9181
9182         * typemanager.cs (IsSpecialMethod): The correct way of figuring
9183         out if a method is special is to see if it is declared in a
9184         property or event, or whether it is one of the predefined operator
9185         names.   This should fix correctly #36804.
9186
9187 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
9188
9189         The goal here is to remove the dependency on EmptyCast.Peel ().
9190         Killing it completely.
9191
9192         The problem is that currently in a number of places where
9193         constants are expected, we have to "probe" for an EmptyCast, and
9194         Peel, which is not the correct thing to do, as this will be
9195         repetitive and will likely lead to errors. 
9196
9197         The idea is to remove any EmptyCasts that are used in casts that
9198         can be reduced to constants, so we only have to cope with
9199         constants. 
9200
9201         This bug hunt was triggered by Bug 37363 and the desire to remove
9202         the duplicate pattern where we were "peeling" emptycasts to check
9203         whether they were constants.  Now constants will always be
9204         constants.
9205
9206         * ecore.cs: Use an enumconstant here instead of wrapping with
9207         EmptyCast.  
9208
9209         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
9210         throwing me off.  By handling this we can get rid of a few hacks.
9211
9212         * statement.cs (Switch): Removed Peel() code.
9213
9214 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
9215
9216         * class.cs: Location information for error 508
9217
9218         * expression.cs (New.DoResolve): Add a guard against double
9219         resolution of an expression.  
9220
9221         The New DoResolve might be called twice when initializing field
9222         expressions (see EmitFieldInitializers, the call to
9223         GetInitializerExpression will perform a resolve on the expression,
9224         and later the assign will trigger another resolution
9225
9226         This leads to bugs (#37014)
9227
9228         * delegate.cs: The signature for EndInvoke should contain any ref
9229         or out parameters as well.  We were not doing this in the past. 
9230
9231         * class.cs (Field.Define): Do not overwrite the type definition
9232         inside the `volatile' group.  Turns out that volatile enumerations
9233         were changing the type here to perform a validity test, which
9234         broke conversions. 
9235
9236 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
9237
9238         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
9239         and structs, we do not want to load the instance variable
9240
9241         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
9242         enum_type has to be handled like an object reference (implicit
9243         conversions exists from this to object), but the regular IsClass
9244         and IsValueType tests will never return true for this one.
9245
9246         Also we use TypeManager.IsValueType instead of type.IsValueType,
9247         just for consistency with the rest of the code (this is only
9248         needed if we ever use the construct exposed by test-180.cs inside
9249         corlib, which we dont today).
9250
9251 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
9252
9253         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
9254         just InternalCall.
9255
9256 2003-02-09  Martin Baulig  <martin@ximian.com>
9257
9258         * namespace.cs (Namespace..ctor): Added SourceFile argument.
9259         (Namespace.DefineNamespaces): New static public method; this is
9260         called when we're compiling with debugging to add all namespaces
9261         to the symbol file.
9262
9263         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
9264         pass it to the Namespace's .ctor.
9265
9266         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
9267         and MethodBase arguments; pass the namespace ID to the symwriter;
9268         pass the MethodBase instead of the token to the symwriter.
9269         (SymbolWriter.DefineNamespace): New method to add a namespace to
9270         the symbol file.
9271
9272 2003-02-09  Martin Baulig  <martin@ximian.com>
9273
9274         * symbolwriter.cs: New file.  This is a wrapper around
9275         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
9276         methods here in near future.
9277
9278 2003-02-09  Martin Baulig  <martin@ximian.com>
9279
9280         * codegen.cs (EmitContext.Mark): Just pass the arguments to
9281         ILGenerator.MarkSequencePoint() which are actually used by the
9282         symbol writer.
9283
9284 2003-02-09  Martin Baulig  <martin@ximian.com>
9285
9286         * location.cs (SourceFile): New public sealed class.  This
9287         contains the name and an index which is used in the location's token.
9288         (Location): Reserve an appropriate number of bits in the token for
9289         the source file instead of walking over that list, this gives us a
9290         really huge performance improvement when compiling with debugging.
9291
9292         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
9293         `SourceFile' argument instead of a string.
9294         (Driver.ProcessFile): Add all the files via Location.AddFile(),
9295         but don't parse/tokenize here, we need to generate the list of all
9296         source files before we do that.
9297         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
9298         the files.
9299
9300         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
9301         instead of a string.
9302
9303         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
9304         of a string.
9305
9306 2003-02-09  Martin Baulig  <martin@ximian.com>
9307
9308         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
9309         filename on `#line default'.
9310
9311 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
9312
9313         * statement.cs: don't clear the pinned var when the fixed statement
9314         returns from the method (fixes bug#37752).
9315
9316 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
9317
9318         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
9319         to IsValueType.
9320
9321 2003-02-07  Martin Baulig  <martin@ximian.com>
9322
9323         * driver.cs: Removed the `--debug-args' command line argument.
9324
9325         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
9326         automatically by the AsssemblyBuilder.
9327         (CodeGen.InitializeSymbolWriter): We don't need to call any
9328         initialization function on the symbol writer anymore.  This method
9329         doesn't take any arguments.
9330
9331 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
9332
9333         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
9334         from referenced assemblies as well.
9335
9336 2003-02-02  Martin Baulig  <martin@ximian.com>
9337
9338         * class.cs (MethodData.Emit): Generate debugging info for external methods.
9339
9340 2003-02-02  Martin Baulig  <martin@ximian.com>
9341
9342         * class.cs (Constructor.Emit): Open the symbol writer before
9343         emitting the constructor initializer.
9344         (ConstructorInitializer.Emit): Call ec.Mark() to allow
9345         single-stepping through constructor initializers.
9346
9347 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
9348
9349         * class.cs: Handle error 549: do not allow virtual methods in
9350         sealed classes. 
9351
9352 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
9353
9354         * decl.cs: Check access levels when resolving types
9355
9356 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
9357
9358         * statement.cs: Add parameters and locals set in catch blocks that might 
9359         return to set vector
9360
9361 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
9362
9363         * class.cs (Operator): Set the SpecialName flags for operators.
9364
9365         * expression.cs (Invocation.DoResolve): Only block calls to
9366         accessors and operators on SpecialName methods.
9367
9368         (Cast.TryReduce): Handle conversions from char constants.
9369
9370
9371 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
9372
9373         * statement.cs: small memory and time optimization in FlowBranching.
9374
9375 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
9376
9377         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
9378         problem that the last fix but in the other sid (Set).
9379
9380         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
9381         access when there is no indexer in the hierarchy.
9382
9383 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
9384
9385         * class.cs: Combine some if statements.
9386
9387 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9388
9389         * driver.cs: fixed bug #37187.
9390
9391 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
9392
9393         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
9394         any indexer, it's needed to build a list with all the indexers in the
9395         hierarchy (AllGetters), else we have problems. Fixes #35653.
9396
9397 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
9398
9399         * class.cs (MethodData.Define): It is wrong for an interface
9400         implementation to be static in both cases: explicit and implicit.
9401         We were only handling this in one case.
9402
9403         Improve the if situation there to not have negations.
9404
9405         * class.cs (Field.Define): Turns out that we do not need to check
9406         the unsafe bit on field definition, only on usage.  Remove the test.
9407
9408 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9409
9410         * driver.cs: use assembly.Location instead of Codebase (the latest
9411         patch made mcs fail when using MS assemblies).
9412
9413 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
9414
9415         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
9416         get the path to *corlib.dll.
9417
9418 2003-01-21  Nick Drochak <ndrochak@gol.com>
9419
9420         * cs-tokenizer.cs:
9421         * pending.cs:
9422         * typemanager.cs: Remove compiler warnings
9423
9424 2003-01-20  Duncan Mak  <duncan@ximian.com>
9425
9426         * AssemblyInfo.cs: Bump the version number to 0.19.
9427
9428 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9429
9430         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
9431
9432 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
9433
9434         * class.cs (Constructor::Emit): Emit debugging info for constructors.
9435
9436 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
9437
9438         * cs-parser.jay: Small fix: we were not comparing the constructor
9439         name correctly.   Thanks to Zoltan for the initial pointer.
9440
9441 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
9442
9443         * cs-tokenizer.cs: Set file name when specified with #line
9444
9445 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
9446
9447         * cs-parser.jay: Only perform the constructor checks here if we
9448         are named like the class;  This will help provider a better
9449         error.  The constructor path is taken when a type definition is
9450         not found, but most likely the user forgot to add the type, so
9451         report that rather than the constructor error.
9452
9453 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
9454
9455         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
9456         allocations.
9457
9458 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
9459
9460         * cs-parser.jay: Add cleanup call.
9461
9462 2003-01-13  Duncan Mak  <duncan@ximian.com>
9463
9464         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
9465         consistent with other methods.
9466
9467 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
9468
9469         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
9470
9471 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
9472
9473         * attribute.cs: only set GuidAttr to true when we have a
9474         GuidAttribute.
9475
9476 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9477
9478         * ecore.cs:
9479         * expression.cs:
9480         * typemanager.cs: fixes to allow mcs compile corlib with the new
9481         Type.IsSubclassOf fix.
9482
9483 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
9484
9485         * expression.cs (LocalVariableReference.DoResolve): Classify a
9486         constant as a value, not as a variable.   Also, set the type for
9487         the variable.
9488
9489         * cs-parser.jay (fixed_statement): take a type instead of a
9490         pointer_type, so we can produce a better error message later.
9491
9492         * statement.cs (Fixed.Resolve): Flag types that are not pointers
9493         as an error.  
9494
9495         (For.DoEmit): Make inifinite loops have a
9496         non-conditional branch back.
9497
9498         (Fixed.DoEmit): First populate the pinned variables, then emit the
9499         statement, then clear the variables.  Before I was emitting the
9500         code once for each fixed piece.
9501
9502
9503 2003-01-08  Martin Baulig  <martin@ximian.com>
9504
9505         * statement.cs (FlowBranching.MergeChild): A break in a
9506         SWITCH_SECTION does not leave a loop.  Fixes #36155.
9507
9508 2003-01-08  Martin Baulig  <martin@ximian.com>
9509
9510         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
9511         lives in the same number space than `param_map'.  Fixes #36154.
9512
9513 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
9514
9515         * cs-parser.jay (constructor_declaration): Set the
9516         Constructor.ModFlags before probing for it.  This makes the
9517         compiler report 514, 515 and 132 (the code was there, but got
9518         broken). 
9519
9520         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
9521         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
9522         (GotoCase.Resolve): Set `Returns' to ALWAYS.
9523
9524 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
9525
9526         * enum.cs: create the enum static fields using the enum type.
9527
9528 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
9529
9530         * class.cs: don't try to create the ParamBuilder for the return
9531         type if it's not needed (and handle it breaking for the ms runtime
9532         anyway).
9533
9534 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
9535
9536         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
9537
9538 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
9539
9540         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
9541         the command.   This showed up while compiling the JANET source
9542         code, which used \r as its only newline separator.
9543
9544 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
9545
9546         * class.cs (Method.Define): If we are an operator (because it
9547         reuses our code), then set the SpecialName and HideBySig.  #36128
9548
9549 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
9550
9551         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
9552         exception, report error 120 `object reference required'.
9553
9554         * driver.cs: Add --pause option, used during to measure the size
9555         of the process as it goes with --timestamp.
9556
9557         * expression.cs (Invocation.DoResolve): Do not allow methods with
9558         SpecialName to be invoked.
9559
9560 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
9561
9562         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
9563         number before adding it.
9564
9565 2002-12-21  Ravi Pratap  <ravi@ximian.com>
9566
9567         * ecore.cs (StandardImplicitConversion): When in an unsafe
9568         context, we allow conversion between void * to any other pointer
9569         type. This fixes bug #35973.
9570
9571 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
9572
9573         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
9574         is not thrown when extensionless outputs are used 
9575
9576 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9577
9578         * rootcontext.cs: fixed compilation of corlib.
9579
9580 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
9581
9582         * attribute.cs (Attributes.Contains): Add new method.
9583
9584         * class.cs (MethodCore.LabelParameters): if the parameter is an
9585         `out' parameter, check that no attribute `[In]' has been passed.
9586
9587         * enum.cs: Handle the `value__' name in an enumeration.
9588
9589 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
9590
9591         * decl.cs: Added special case to allow overrides on "protected
9592         internal" methods
9593
9594 2002-12-18  Ravi Pratap  <ravi@ximian.com>
9595
9596         * attribute.cs (Attributes.AddAttributeSection): Rename to this
9597         since it makes much more sense.
9598
9599         (Attributes.ctor): Don't require a Location parameter.
9600
9601         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
9602
9603         * attribute.cs (ApplyAttributes): Remove extra Location parameters
9604         since we already have that information per attribute.
9605
9606         * everywhere : make appropriate changes.
9607
9608         * class.cs (LabelParameters): Write the code which actually
9609         applies attributes to the return type. We can't do this on the MS
9610         .NET runtime so we flag a warning in the case an exception is
9611         thrown.
9612
9613 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
9614
9615         * const.cs: Handle implicit null conversions here too.
9616
9617 2002-12-17  Ravi Pratap  <ravi@ximian.com>
9618
9619         * class.cs (MethodCore.LabelParameters): Remove the extra
9620         Type [] parameter since it is completely unnecessary. Instead
9621         pass in the method's attributes so that we can extract
9622         the "return" attribute.
9623
9624 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
9625
9626         * cs-parser.jay (parse): Use Report.Error to flag errors instead
9627         of ignoring it and letting the compile continue.
9628
9629         * typemanager.cs (ChangeType): use an extra argument to return an
9630         error condition instead of throwing an exception.
9631
9632 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
9633
9634         * expression.cs (Unary.TryReduce): mimic the code for the regular
9635         code path.  Perform an implicit cast in the cases where we can
9636         implicitly convert to one of the integral types, and then reduce
9637         based on that constant.   This fixes bug #35483.
9638
9639 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9640
9641         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
9642
9643 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9644
9645         * namespace.cs: fixed bug #35489.
9646
9647 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
9648
9649         * class.cs: Remove some dead code.
9650
9651         * cs-parser.jay: Estimate the number of methods needed
9652         (RootContext.MethodCount);
9653
9654         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
9655         numbers instead of StringBuilders.
9656
9657         * support.cs (PtrHashtable): Add constructor with initial size;
9658         We can now reduce reallocations of the method table.
9659
9660 2002-12-10  Ravi Pratap  <ravi@ximian.com>
9661
9662         * attribute.cs (ApplyAttributes): Keep track of the emitted
9663         attributes on a per-target basis. This fixes bug #35413.
9664
9665 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
9666
9667         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
9668         default to the Windows 1252 encoding.
9669
9670         (UnixParseOption): Support version, thanks to Alp for the missing
9671         pointer. 
9672
9673         * AssemblyInfo.cs: Add nice assembly information.
9674
9675         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
9676         (bug 35169).
9677
9678         * cs-parser.jay: Allow a trailing comma before the close bracked
9679         in the attribute_section production.
9680
9681         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
9682         address of the instance was being taken, I will take this out,
9683         because we take the address of the object immediately here.
9684
9685 2002-12-09  Ravi Pratap  <ravi@ximian.com>
9686
9687         * typemanager.cs (AreMultipleAllowed): Take care of the most
9688         obvious case where attribute type is not in the current assembly -
9689         stupid me ;-)
9690
9691 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
9692
9693         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
9694         definitions, instead of doing that afterwards.  
9695
9696         Also we use a nice little hack, depending on the constructor, we
9697         know if we are a "composed" name or a simple name.  Hence, we
9698         avoid the IndexOf test, and we avoid 
9699
9700         * codegen.cs: Add code to assist in a bug reporter to track down
9701         the source of a compiler crash. 
9702
9703 2002-12-07  Ravi Pratap  <ravi@ximian.com>
9704
9705         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
9706         types have been emitted for a given element and flag an error
9707         if something which does not have AllowMultiple set is used more
9708         than once.
9709
9710         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
9711         attribute types and their corresponding AllowMultiple properties
9712
9713         (AreMultipleAllowed): Check the property for a given type.
9714
9715         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
9716         property in the case we have a TypeContainer.
9717
9718         (Attributes.AddAttribute): Detect duplicates and just skip on
9719         adding them. This trivial fix catches a pretty gross error in our
9720         attribute emission - global attributes were being emitted twice!
9721
9722         Bugzilla bug #33187 is now fixed.
9723
9724 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
9725
9726         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
9727         instead of pp_and).
9728
9729         * expression.cs (Binary.ResolveOperator): I can only use the
9730         Concat (string, string, string) and Concat (string, string,
9731         string, string) if the child is actually a concatenation of
9732         strings. 
9733
9734 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
9735
9736         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
9737         context where we need a 2-character lookahead.
9738
9739         * pending.cs (PendingImplementation): Rework so we can keep track
9740         of interface types all the time, and flag those which were
9741         implemented by parents as optional.
9742
9743 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
9744
9745         * expression.cs (Binary.ResolveOperator): Use
9746         String.Concat(string,string,string) or
9747         String.Concat(string,string,string,string) when possible. 
9748
9749         * typemanager: More helper methods.
9750
9751
9752 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
9753
9754         * pending.cs: remove the bogus return from GetMissingInterfaces()
9755         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
9756
9757 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9758
9759         * namespace.cs: avoid duplicated 'using xxx' being added to
9760         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
9761         when we get more than one 'using' statement for the same namespace.
9762         Report a CS0105 warning for it.
9763
9764 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
9765
9766         * cs-tokenizer.cs (consume_identifier): use read directly, instead
9767         of calling getChar/putback, uses internal knowledge of it.    
9768
9769         (xtoken): Reorder tokenizer so most common patterns are checked
9770         first.  This reduces the compilation time in another 5% (from 8.11s
9771         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
9772
9773         The parsing time is 22% of the compilation in mcs, and from that
9774         64% is spent on the tokenization process.  
9775
9776         I tried using a binary search for keywords, but this is slower
9777         than the hashtable.  Another option would be to do a couple of
9778         things:
9779
9780                 * Not use a StringBuilder, instead use an array of chars,
9781                   with a set value.  Notice that this way we could catch
9782                   the 645 error without having to do it *afterwards*.
9783
9784                 * We could write a hand-parser to avoid the hashtable
9785                   compares altogether.
9786
9787         The identifier consumption process takes 37% of the tokenization
9788         time.  Another 15% is spent on is_number.  56% of the time spent
9789         on is_number is spent on Int64.Parse:
9790
9791                 * We could probably choose based on the string length to
9792                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
9793                   computations. 
9794
9795         Another 3% is spend on wrapping `xtoken' in the `token' function.
9796
9797         Handle 0xa0 as whitespace (#34752)
9798
9799 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
9800
9801         * typemanager.cs (IsCLRType): New routine to tell whether a type
9802         is one of the builtin types.  
9803
9804         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
9805         typecode in more places instead of doing pointer comparissions.
9806         We could leverage some knowledge about the way the typecodes are
9807         laid out.
9808
9809         New code to cache namespaces in assemblies, it is currently not
9810         invoked, to be used soon.
9811
9812         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
9813
9814         * expression.cs (Binary.ResolveOperator): specially handle
9815         strings, and do not perform user-defined operator overloading for
9816         built-in types.
9817
9818 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
9819
9820         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
9821         internalcall as it is a pretty simple operation;  Avoid whenever
9822         possible to call Char.IsLetter.
9823
9824         (consume_identifier): Cut by half the number of
9825         hashtable calls by merging the is_keyword and GetKeyword behavior.
9826
9827         Do not short-circuit, because if we do, we
9828         report errors (ie, #if false && true would produce an invalid
9829         directive error);
9830
9831
9832 2002-11-24  Martin Baulig  <martin@ximian.com>
9833
9834         * expression.cs (Cast.TryReduce): If we're in checked syntax,
9835         check constant ranges and report a CS0221.  Fixes #33186.
9836
9837 2002-11-24  Martin Baulig  <martin@ximian.com>
9838
9839         * cs-parser.jay: Make this work for uninitialized variable
9840         declarations in the `for' initializer.  Fixes #32416.
9841
9842 2002-11-24  Martin Baulig  <martin@ximian.com>
9843
9844         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
9845         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
9846
9847 2002-11-24  Martin Baulig  <martin@ximian.com>
9848
9849         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
9850         argument; if true, we also check for user-defined conversions.
9851         This is only needed if both arguments are of a user-defined type.
9852         Fixes #30443, added test-175.cs.
9853         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
9854
9855         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
9856
9857 2002-11-24  Martin Baulig  <martin@ximian.com>
9858
9859         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
9860         function to get the store opcode.
9861         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
9862         only emit the Ldelema if the store opcode is Stobj.  You must run
9863         both test-34 and test-167 to test this.  Fixes #34529.
9864
9865 2002-11-23  Martin Baulig  <martin@ximian.com>
9866
9867         * ecore.cs (Expression.MemberLookup): Added additional
9868         `qualifier_type' argument which is used when we're being called
9869         from MemberAccess.DoResolve() and null if we're called from a
9870         SimpleName lookup.
9871         (Expression.MemberLookupFailed): New method to report errors; this
9872         does the CS1540 check and reports the correct error message.
9873
9874         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
9875         argument for the CS1540 check and redone the way how we're dealing
9876         with private members.  See the comment in the source code for details.
9877         (FilterWithClosure): Reverted this back to revision 1.197; renamed
9878         `closure_start_type' to `closure_qualifier_type' and check whether
9879         it's not null.  It was not this filter being broken, it was just
9880         being called with the wrong arguments.
9881
9882         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
9883         and pass it the correct `qualifier_type'; this also does the error
9884         handling for us.
9885
9886 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
9887
9888         * expression.cs (Invocation.EmitParams): If the we are dealing
9889         with a non-built-in value type, load its address as well.
9890
9891         (ArrayCreation): Use a a pretty constant instead
9892         of the hardcoded value 2.   Use 6 instead of 2 for the number of
9893         static initializers.  
9894
9895         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
9896         because they are not really value types, just glorified integers. 
9897
9898         * driver.cs: Do not append .exe, the CSC compiler does not do it.
9899
9900         * ecore.cs: Remove redundant code for enumerations, make them use
9901         the same code path as everything else, fixes the casting issue
9902         with enumerations in Windows.Forms.
9903
9904         * attribute.cs: Do only cast to string if it is a string, the
9905         validation happens later.
9906
9907         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
9908         people upgrade their corlibs.
9909
9910         * ecore.cs: Oops, enumerations were not following the entire code path
9911
9912 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
9913
9914         * typemanager.cs (FilterWithClosure): Commented out the test for
9915         1540 in typemanager.cs, as it has problems when accessing
9916         protected methods from a parent class (see test-174.cs). 
9917
9918         * attribute.cs (Attribute.ValidateGuid): new method.
9919         (Attribute.Resolve): Use above.
9920
9921 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
9922
9923         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
9924
9925         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
9926         handling for enumerations, as we only needed the TypeContainer
9927         functionality to begin with (this is required for the fix below to
9928         work for enums that reference constants in a container class for
9929         example). 
9930
9931         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
9932
9933         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
9934         a valid TypeBuilder to perform lookups on.o
9935
9936         * class.cs (InheritableMemberSignatureCompare): Use true in the
9937         call to GetGetMethod and GetSetMethod, because we are comparing
9938         the signature, and we need to get the methods *even* if they are
9939         private. 
9940
9941         (PropertyBase.CheckBase): ditto.
9942
9943         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
9944         GotoCase.Resolve): Use Peel on EmpytCasts.
9945
9946         * ecore.cs (EmptyCast): drop child, add Peel method.
9947
9948 2002-11-17  Martin Baulig  <martin@ximian.com>
9949
9950         * ecore.cs (EmptyCast.Child): New public property.
9951
9952         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
9953         label resolved to an EmptyCast.  Fixes #34162.
9954         (GotoCase.Resolve): Likewise.
9955         (Block.EmitMeta): Likewise.
9956
9957 2002-11-17  Martin Baulig  <martin@ximian.com>
9958
9959         * expression.cs (Invocation.BetterConversion): Prefer int over
9960         uint; short over ushort; long over ulong for integer literals.
9961         Use ImplicitConversionExists instead of StandardConversionExists
9962         since we also need to check for user-defined implicit conversions.
9963         Fixes #34165.  Added test-173.cs.
9964
9965 2002-11-16  Martin Baulig  <martin@ximian.com>
9966
9967         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
9968         with the `true' and `false' literals.  Fixes #33151.
9969
9970 2002-11-16  Martin Baulig  <martin@ximian.com>
9971
9972         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
9973         October 22nd; don't do the cs1540 check for static members.
9974
9975         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
9976         now using our own filter here and doing the cs1540 check again.
9977
9978 2002-11-16  Martin Baulig  <martin@ximian.com>
9979
9980         * support.cs (InternalParameters): Don't crash if we don't have
9981         any fixed parameters.  Fixes #33532.
9982
9983 2002-11-16  Martin Baulig  <martin@ximian.com>
9984
9985         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
9986         when looking up static methods to make this work on Windows.
9987         Fixes #33773.
9988
9989 2002-11-16  Martin Baulig  <martin@ximian.com>
9990
9991         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
9992         a setter rather than using PropertyInfo.CanWrite.
9993
9994 2002-11-15  Nick Drochak  <ndrochak@gol.com>
9995
9996         * class.cs: Allow acces to block member by subclasses. Fixes build
9997         breaker.
9998
9999 2002-11-14  Martin Baulig  <martin@ximian.com>
10000
10001         * class.cs (Constructor.Emit): Added the extern/block check.
10002         Fixes bug #33678.
10003
10004 2002-11-14  Martin Baulig  <martin@ximian.com>
10005
10006         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
10007         iteration while looking for indexers, this is needed because the
10008         indexer may have a different name in our base classes.  Fixed the
10009         error reporting (no indexers at all, not get accessor, no
10010         overloaded match).  Fixes bug #33089.
10011         (IndexerAccess.DoResolveLValue): Likewise.
10012
10013 2002-11-14  Martin Baulig  <martin@ximian.com>
10014
10015         * class.cs (PropertyBase.CheckBase): Make this work for multiple
10016         indexers.  Fixes the first part of bug #33089.
10017         (MethodSignature.InheritableMemberSignatureCompare): Added support
10018         for properties.
10019
10020 2002-11-13  Ravi Pratap  <ravi@ximian.com>
10021
10022         * attribute.cs (Attribute.Resolve): Catch the
10023         NullReferenceException and report it since it isn't supposed to
10024         happen. 
10025
10026 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
10027
10028         * expression.cs (Binary.EmitBranchable): Also handle the cases for
10029         LogicalOr and LogicalAnd that can benefit from recursively
10030         handling EmitBranchable.  The code now should be nice for Paolo.
10031
10032 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
10033
10034         * typemanager.cs (LookupType): Added a negative-hit hashtable for
10035         the Type lookups, as we perform quite a number of lookups on
10036         non-Types.  This can be removed once we can deterministically tell
10037         whether we have a type or a namespace in advance.
10038
10039         But this might require special hacks from our corlib.
10040
10041         * TODO: updated.
10042
10043         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
10044         and double which avoids a conversion from an integer to a double.
10045
10046         * expression.cs: tiny optimization, avoid calling IsConstant,
10047         because it effectively performs the lookup twice.
10048
10049 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
10050
10051         But a bogus return here to keep the semantics of the old code
10052         until the Mono runtime is fixed.
10053
10054         * pending.cs (GetMissingInterfaces): New method used to remove all
10055         the interfaces that are already implemented by our parent
10056         classes from the list of pending methods. 
10057
10058         * interface.cs: Add checks for calls after ResolveTypeExpr.
10059
10060 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
10061
10062         * class.cs (Class.Emit): Report warning 67: event not used if the
10063         warning level is beyond 3.
10064
10065         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
10066         being a NullLiteral.
10067
10068         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
10069         specifiers. 
10070
10071         * class.cs (TypeContainer.GetClassBases): Cover a missing code
10072         path that might fail if a type can not be resolved.
10073
10074         * expression.cs (Binary.Emit): Emit unsigned versions of the
10075         operators. 
10076
10077         * driver.cs: use error 5.
10078
10079 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
10080
10081         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
10082
10083 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
10084
10085         * cs-parser.jay (switch_section): A beautiful patch from Martin
10086         Baulig that fixed 33094.
10087
10088 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
10089
10090         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
10091         Check whether the base is abstract and report an error if so.
10092
10093         * expression.cs (IndexerAccess.DoResolveLValue,
10094         IndexerAccess.DoResolve): ditto. 
10095
10096         (Invocation.DoResolve): ditto.
10097
10098         (Invocation.FullMethodDesc): Improve the report string.
10099
10100         * statement.cs (Block): Eliminate IsVariableDefined as it is
10101         basically just a wrapper for GetVariableInfo.
10102
10103         * ecore.cs (SimpleName): Use new 
10104
10105         * support.cs (ReflectionParamter.ParameterType): We unwrap the
10106         type, as we return the actual parameter ref/unref state on a
10107         different call.
10108
10109 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
10110
10111         * support.cs: Return proper flags REF/OUT fixing the previous
10112         commit.  
10113
10114         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
10115         not used to mean `ref' but `ref or out' in ParameterReference
10116
10117         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
10118         full type signature instead of calling TypeManger.CSharpName
10119         ourselves. 
10120
10121         * support.cs (InternalParameters.ParameterDesc): Do not compare
10122         directly to the modflags, because REF/OUT will actually be bitsets
10123         if set. 
10124
10125         * delegate.cs (VerifyMethod): Check also the modifiers.
10126
10127         * cs-tokenizer.cs: Fix bug where floating point values with an
10128         exponent where a sign was missing was ignored.
10129
10130         * driver.cs: Allow multiple assemblies to be specified in a single
10131         /r: argument
10132
10133 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
10134
10135         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
10136         because identifiers after a parenthesis would end up in this kind
10137         of production, and we needed to desamiguate it for having casts
10138         like:
10139
10140                 (UserDefinedType *) xxx
10141
10142 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
10143
10144         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
10145         we should set on the Bindingflags.NonPublic, but not turn on
10146         private_ok.  private_ok controls whether a Private member is
10147         returned (this is chekced on the filter routine), while the
10148         BindingFlags.NonPublic just controls whether private/protected
10149         will be allowed.   This fixes the problem part of the problem of
10150         private properties being allowed to be used in derived classes.
10151
10152         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
10153         so we can call the children DoResolveLValue method (this will
10154         properly signal errors on lvalue assignments to base properties)
10155
10156         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
10157         getter are null, and we have a property info, we know that this
10158         happened because the lookup failed, so we report an error 122 for
10159         protection level violation.
10160
10161         We also silently return if setter and getter are null in the
10162         resolve functions, this condition only happens if we have flagged
10163         the error before.  This is the other half of the problem. 
10164
10165         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
10166         not have accessibility information, that is why we were returning
10167         true in the filter function in typemanager.cs.
10168
10169         To properly report 122 (property is inaccessible because of its
10170         protection level) correctly, we report this error in ResolveAccess
10171         by failing if both the setter and the getter are lacking (ie, the
10172         lookup failed). 
10173
10174         DoResolve and DoLResolve have been modified to check for both
10175         setter/getter being null and returning silently, the reason being
10176         that I did not want to put the knowledge about this error in upper
10177         layers, like:
10178
10179         int old = Report.Errors;
10180         x = new PropertyExpr (...);
10181         if (old != Report.Errors)
10182                 return null;
10183         else
10184                 return x;
10185
10186         So the property expr is returned, but it is invalid, so the error
10187         will be flagged during the resolve process. 
10188
10189         * class.cs: Remove InheritablePropertySignatureCompare from the
10190         class, as we no longer depend on the property signature to compute
10191         whether it is possible to implement a method or not.
10192
10193         The reason is that calling PropertyInfo.GetGetMethod will return
10194         null (in .NET, in Mono it works, and we should change this), in
10195         cases where the Get Method does not exist in that particular
10196         class.
10197
10198         So this code:
10199
10200         class X { public virtual int A { get { return 1; } } }
10201         class Y : X { }
10202         class Z : Y { public override int A { get { return 2; } } }
10203
10204         Would fail in Z because the parent (Y) would not have the property
10205         defined.  So we avoid this completely now (because the alternative
10206         fix was ugly and slow), and we now depend exclusively on the
10207         method names.
10208
10209         (PropertyBase.CheckBase): Use a method-base mechanism to find our
10210         reference method, instead of using the property.
10211
10212         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
10213         routines are gone now.
10214
10215         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
10216         names, they were incorrectly named.
10217
10218         * cs-tokenizer.cs: Return are more gentle token on failure. 
10219
10220         * pending.cs (PendingImplementation.InterfaceMethod): This routine
10221         had an out-of-sync index variable, which caused it to remove from
10222         the list of pending methods the wrong method sometimes.
10223
10224 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
10225
10226         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
10227         CanWrite, because those refer to this particular instance of the
10228         property, and do not take into account the fact that we can
10229         override single members of a property.
10230
10231         Constructor requires an EmitContext.  The resolution process does
10232         not happen here, but we need to compute the accessors before,
10233         because the resolution does not always happen for properties.
10234
10235         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
10236         subclass, before we did not update this flag, but we did update
10237         bindingflags. 
10238
10239         (GetAccessors): Drop this routine, as it did not work in the
10240         presence of partially overwritten set/get methods. 
10241
10242         Notice that this broke the cs1540 detection, but that will require
10243         more thinking. 
10244
10245 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10246
10247         * class.cs:
10248         * codegen.cs:
10249         * driver.cs: issue a warning instead of an error if we don't support
10250         debugging for the platform. Also ignore a couple of errors that may
10251         arise when trying to write the symbols. Undo my previous patch.
10252
10253 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10254
10255         * driver.cs: ignore /debug switch except for Unix platforms.
10256
10257 2002-10-23  Nick Drochak  <ndrochak@gol.com>
10258
10259         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
10260
10261 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
10262
10263         * driver.cs: Do not make mcs-debug conditional, so we do not break
10264         builds that use it.
10265
10266         * statement.cs (UsageVector.MergeChildren): I would like Martin to
10267         review this patch.  But basically after all the children variables
10268         have been merged, the value of "Breaks" was not being set to
10269         new_breaks for Switch blocks.  I think that it should be set after
10270         it has executed.  Currently I set this to the value of new_breaks,
10271         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
10272         conservative, but I do not understand this code very well.
10273
10274         I did not break anything in the build, so that is good ;-)
10275
10276         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
10277
10278 2002-10-20  Mark Crichton  <crichton@gimp.org>
10279
10280         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
10281
10282 2002-10-20  Nick Drochak  <ndrochak@gol.com>
10283
10284         * cfold.cs: Fixed compile blocker.
10285
10286 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
10287
10288         * driver.cs: I was chekcing the key, not the file.
10289
10290 2002-10-19  Ravi Pratap  <ravi@ximian.com>
10291
10292         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
10293         message that we were generating - we just need to silently return
10294         a null.
10295
10296 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
10297
10298         * class.cs (Event.Define): Change my previous commit, as this
10299         breaks the debugger.  This is a temporary hack, as it seems like
10300         the compiler is generating events incorrectly to begin with.
10301
10302         * expression.cs (Binary.ResolveOperator): Added support for 
10303         "U operator - (E x, E y)"
10304
10305         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
10306         y)".
10307
10308         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
10309         init-only variables, but this path did not take into account that
10310         there might be also instance readonly variables.  Correct this
10311         problem. 
10312
10313         This fixes bug 32253
10314
10315         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
10316         delegates as well.
10317
10318         * driver.cs: Change the extension for modules to `netmodule'
10319
10320         * cs-parser.jay: Improved slightly the location tracking for
10321         the debugger symbols.
10322
10323         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
10324         modifiers that were specified instead of the hardcoded value
10325         (FamAndAssem).  This was basically ignoring the static modifier,
10326         and others.  Fixes 32429.
10327
10328         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
10329         fixed a bug in the process (32476)
10330
10331         * expression.cs (ArrayAccess.EmitAssign): Patch from
10332         hwang_rob@yahoo.ca that fixes bug 31834.3
10333
10334 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
10335
10336         * driver.cs: Make the module extension .netmodule.
10337
10338 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
10339
10340         * driver.cs: Report an error if the resource file is not found
10341         instead of crashing.
10342
10343         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
10344         false, like Emit does.
10345
10346 2002-10-16  Nick Drochak  <ndrochak@gol.com>
10347
10348         * typemanager.cs: Remove unused private member.  Also reported mcs
10349         bug to report this as a warning like csc.
10350
10351 2002-10-15  Martin Baulig  <martin@gnome.org>
10352
10353         * statement.cs (Statement.Emit): Made this a virtual method; emits
10354         the line number info and calls DoEmit().
10355         (Statement.DoEmit): New protected abstract method, formerly knows
10356         as Statement.Emit().
10357
10358         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
10359
10360 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
10361
10362         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
10363         have fixed a remaining problem: not every AddXXXX was adding a
10364         fully qualified name.  
10365
10366         Now everyone registers a fully qualified name in the DeclSpace as
10367         being defined instead of the partial name.  
10368
10369         Downsides: we are slower than we need to be due to the excess
10370         copies and the names being registered this way.  
10371
10372         The reason for this is that we currently depend (on the corlib
10373         bootstrap for instance) that types are fully qualified, because
10374         we dump all the types in the namespace, and we should really have
10375         types inserted into the proper namespace, so we can only store the
10376         basenames in the defined_names array.
10377
10378 2002-10-10  Martin Baulig  <martin@gnome.org>
10379
10380         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
10381         from bug #31834, see the bug report for a testcase which is
10382         miscompiled.
10383
10384 2002-10-10  Martin Baulig  <martin@gnome.org>
10385
10386         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
10387         flow analysis code for this.
10388
10389         * statement.cs (Do, While, For): Tell the flow analysis code about
10390         infinite loops.
10391         (FlowBranching.UsageVector): Added support for infinite loops.
10392         (Block.Resolve): Moved the dead code elimination here and use flow
10393         analysis to do it.
10394
10395 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
10396
10397         * class.cs (Field.Define): Catch cycles on struct type
10398         definitions. 
10399
10400         * typemanager.cs (IsUnmanagedtype): Do not recursively check
10401         fields if the fields are static.  We only need to check instance
10402         fields. 
10403
10404         * expression.cs (As.DoResolve): Test for reference type.
10405
10406         * statement.cs (Using.ResolveExpression): Use
10407         ConvertImplicitRequired, not ConvertImplicit which reports an
10408         error on failture
10409         (Using.ResolveLocalVariableDecls): ditto.
10410
10411         * expression.cs (Binary.ResolveOperator): Report errors in a few
10412         places where we had to.
10413
10414         * typemanager.cs (IsUnmanagedtype): Finish implementation.
10415
10416 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
10417
10418         * expression.cs: Use StoreFromPtr instead of extracting the type
10419         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
10420
10421         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
10422         an enumeration value to a System.Enum, but System.Enum is not a
10423         value type, but an class type, so we need to box.
10424
10425         (Expression.ConvertExplicit): One codepath could return
10426         errors but not flag them.  Fix this.  Fixes #31853
10427
10428         * parameter.cs (Resolve): Do not allow void as a parameter type.
10429
10430 2002-10-06  Martin Baulig  <martin@gnome.org>
10431
10432         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
10433         if it's a class type and not a struct.  Fixes #31815.
10434
10435 2002-10-06  Martin Baulig  <martin@gnome.org>
10436
10437         * statement.cs: Reworked the flow analysis code a bit to make it
10438         usable for dead code elimination.
10439
10440 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10441
10442         * cs-parser.jay: allow empty source files. Fixes bug #31781.
10443
10444 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
10445
10446         * expression.cs (ComposedCast.DoResolveType): A quick workaround
10447         to fix the test 165, will investigate deeper.
10448
10449 2002-10-04  Martin Baulig  <martin@gnome.org>
10450
10451         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
10452         finally blocks actually work.
10453         (Try.Resolve): We don't need to create a sibling for `finally' if
10454         there is no finally block.
10455
10456 2002-10-04  Martin Baulig  <martin@gnome.org>
10457
10458         * class.cs (Constructor.Define): The default accessibility for a
10459         non-default constructor is private, not public.
10460
10461 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
10462
10463         * class.cs (Constructor): Make AllowedModifiers public, add
10464         EXTERN.
10465
10466         * cs-parser.jay: Perform the modifiers test here, as the
10467         constructor for the Constructor class usually receives a zero
10468         because of the way we create it (first we create, later we
10469         customize, and we were never checking the modifiers).
10470
10471         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
10472         is a version of LookupTypeReflection that includes the type-name
10473         cache.  This can be used as a fast path for functions that know
10474         the fully qualified name and are only calling into *.GetType() to
10475         obtain a composed type.
10476
10477         This is also used by TypeManager.LookupType during its type
10478         composition.
10479
10480         (LookupType): We now also track the real type name, as sometimes
10481         we can get a quey for the real type name from things like
10482         ComposedCast.  This fixes bug 31422.
10483
10484         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
10485         complete type fullname, it does not have to go through the type
10486         resolution system to obtain the composed version of the type (for
10487         obtaining arrays or pointers).
10488
10489         (Conditional.Emit): Use the EmitBoolExpression to
10490         generate nicer code, as requested by Paolo.
10491
10492         (ArrayCreation.CheckIndices): Use the patch from
10493         hwang_rob@yahoo.ca to validate the array initializers. 
10494
10495 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
10496
10497         * class.cs (ConstructorInitializer.Emit): simplify code by using
10498         Invocation.EmitCall, and at the same time, fix the bugs in calling
10499         parent constructors that took variable arguments. 
10500
10501         * ecore.cs (Expression.ConvertNumericExplicit,
10502         Expression.ImplicitNumericConversion): Remove the code that
10503         manually wrapped decimal (InternalTypeConstructor call is now gone
10504         as well).
10505
10506         * expression.cs (Cast.TryReduce): Also handle decimal types when
10507         trying to perform a constant fold on the type.
10508
10509         * typemanager.cs (IsUnmanagedtype): Partially implemented.
10510
10511         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
10512         that only turned off an error report, and did nothing else. 
10513
10514 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
10515
10516         * driver.cs: Handle and ignore /fullpaths
10517
10518 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
10519
10520         * expression.cs (Binary.ResolveOperator): Catch the case where
10521         DoNumericPromotions returns true, 
10522
10523         (Binary.DoNumericPromotions): Simplify the code, and the tests.
10524
10525 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
10526
10527         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
10528         report error 70.
10529
10530 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
10531
10532         * ecore.cs (ConvertNumericExplicit): It is not enough that the
10533         conversion exists, but it is also required that the conversion be
10534         performed.  This manifested in "(Type64Enum) 2".  
10535
10536         * class.cs (TypeManager.AddMethod): The fix is not to change
10537         AddEnum, because that one was using a fully qualified name (every
10538         DeclSpace derivative does), but to change the AddMethod routine
10539         that was using an un-namespaced name.  This now correctly reports
10540         the duplicated name.
10541
10542         Revert patch until I can properly fix it.  The issue
10543         is that we have a shared Type space across all namespaces
10544         currently, which is wrong.
10545
10546         Options include making the Namespace a DeclSpace, and merge
10547         current_namespace/current_container in the parser.
10548
10549 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
10550
10551         * cs-parser.jay: Improve error reporting when we get a different
10552         kind of expression in local_variable_type and
10553         local_variable_pointer_type. 
10554
10555         Propagate this to avoid missleading errors being reported.
10556
10557         * ecore.cs (ImplicitReferenceConversion): treat
10558         TypeManager.value_type as a target just like object_type.   As
10559         code like this:
10560
10561         ValueType v = 1;
10562
10563         Is valid, and needs to result in the int 1 being boxed before it
10564         is assigned to the value type v.
10565
10566         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
10567         to validate the enumeration name.
10568
10569         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
10570         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
10571         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
10572
10573         * ecore.cs (TryImplicitIntConversion): When doing an
10574         implicit-enumeration-conversion, check if the type is 64-bits and
10575         perform a conversion before passing to EnumConstant.
10576
10577 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
10578
10579         * decl.cs (Error_AmbiguousTypeReference); New routine used to
10580         report ambiguous type references.  Unlike the MS version, we
10581         report what the ambiguity is.   Innovation at work ;-)
10582
10583         (DeclSpace.FindType): Require a location argument to
10584         display when we display an ambiguous error.
10585
10586         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
10587
10588         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
10589
10590         * expression.cs (EmitDynamicInitializers): Apply patch from
10591         hwang_rob@yahoo.ca that fixes the order in which we emit our
10592         initializers. 
10593
10594 2002-09-21  Martin Baulig  <martin@gnome.org>
10595
10596         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
10597         delegate takes no arguments.
10598
10599 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
10600
10601         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
10602         from integers.
10603
10604         * expression.cs: Extract the underlying type.
10605
10606         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
10607
10608         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
10609
10610 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
10611
10612         * class.cs (TypeContainer.DefineType): We can not use the nice
10613         PackingSize with the size set to 1 DefineType method, because it
10614         will not allow us to define the interfaces that the struct
10615         implements.
10616
10617         This completes the fixing of bug 27287
10618
10619         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
10620         means also structs.  This fixes part of the problem. 
10621         (Expresion.ImplicitReferenceConversionExists): ditto.
10622
10623         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
10624         error if there were no errors reported during the type lookup
10625         process, to avoid duplicates or redundant errors.  Without this
10626         you would get an ambiguous errors plus a type not found.  We have
10627         beaten the user enough with the first error.  
10628
10629         (DeclSparce.FindType): Emit a warning if we have an ambiguous
10630         reference. 
10631
10632         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
10633         during the resolution process, stop the lookup, this avoids
10634         repeated error reports (same error twice).
10635
10636         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
10637
10638         * typemanager.cs (LookupType): Redo the type lookup code to match
10639         the needs of System.Reflection.  
10640
10641         The issue is that System.Reflection requires references to nested
10642         types to begin with a "+" sign instead of a dot.  So toplevel
10643         types look like: "NameSpace.TopLevelClass", and nested ones look
10644         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
10645         levels. 
10646
10647 2002-09-19  Martin Baulig  <martin@gnome.org>
10648
10649         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
10650         says that a method always returns or always throws an exception,
10651         don't report the CS0161.
10652
10653         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
10654         set `Returns = new_returns'.
10655
10656 2002-09-19  Martin Baulig  <martin@gnome.org>
10657
10658         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
10659         to an enum constant, check for a CS0176.
10660
10661 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
10662
10663         * class.cs (TypeContainer.CheckPairedOperators): Now we check
10664         for operators that must be in pairs and report errors.
10665
10666         * ecore.cs (SimpleName.DoResolveType): During the initial type
10667         resolution process, when we define types recursively, we must
10668         check first for types in our current scope before we perform
10669         lookups in the enclosing scopes.
10670
10671         * expression.cs (MakeByteBlob): Handle Decimal blobs.
10672
10673         (Invocation.VerifyArgumentsCompat): Call
10674         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
10675         I thought we were supposed to always call this, but there are a
10676         few places in the code where we dont do it.
10677
10678 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
10679
10680         * driver.cs: Add support in -linkres and -resource to specify the
10681         name of the identifier.
10682
10683 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
10684
10685         * ecore.cs (StandardConversionExists): Sync with the conversion
10686         code: allow anything-* to void* conversions.
10687
10688         (FindMostSpecificSource): Use an Expression argument
10689         instead of a Type, because we might be handed over a Literal which
10690         gets a few more implicit conversions that plain types do not.  So
10691         this information was being lost.
10692
10693         Also, we drop the temporary type-holder expression when not
10694         required.
10695
10696 2002-09-17  Martin Baulig  <martin@gnome.org>
10697
10698         * class.cs (PropertyBase.CheckBase): Don't check the base class if
10699         this is an explicit interface implementation.
10700
10701 2002-09-17  Martin Baulig  <martin@gnome.org>
10702
10703         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
10704         different `IndexerName' attributes.
10705
10706         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
10707         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
10708         virtual CommonResolve().
10709
10710 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
10711
10712         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
10713         and convert that to the UnderlyingType.
10714
10715         * statement.cs (Foreach.Resolve): Indexers are just like variables
10716         or PropertyAccesses.
10717
10718         * cs-tokenizer.cs (consume_string): Track line numbers and columns
10719         inside quoted strings, we were not doing this before.
10720
10721 2002-09-16  Martin Baulig  <martin@gnome.org>
10722
10723         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
10724         resolve it.  This is needed for the definite assignment check of the
10725         instance expression, fixes bug #29846.
10726         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
10727
10728 2002-09-16  Nick Drochak  <ndrochak@gol.com>
10729
10730         * parameter.cs: Fix compile error.  Cannot reference static member
10731         from an instance object.  Is this an mcs bug?
10732
10733 2002-09-14  Martin Baulig  <martin@gnome.org>
10734
10735         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
10736         multiple times.  Fixes bug #30295, added test-166.cs.
10737
10738 2002-09-14  Martin Baulig  <martin@gnome.org>
10739
10740         * statement.cs (Block.Emit): Don't emit unreachable code.
10741         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
10742         `break' statements.
10743         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
10744
10745 2002-09-14  Martin Baulig  <martin@gnome.org>
10746
10747         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
10748         is set.
10749
10750 2002-09-14  Martin Baulig  <martin@gnome.org>
10751
10752         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
10753         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
10754         be false on the ms runtime.
10755
10756 2002-09-13  Martin Baulig  <martin@gnome.org>
10757
10758         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
10759         the CS0038 error message.
10760
10761 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
10762
10763         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
10764         constant inside, return it.
10765
10766 2002-09-12  Martin Baulig  <martin@gnome.org>
10767
10768         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
10769         implicit conversion can be done between enum types.
10770
10771         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
10772         check whether an implicit conversion to the current enum's UnderlyingType
10773         exists and report an error if not.
10774
10775         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
10776         without debugging support.
10777
10778         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
10779         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
10780
10781 2002-09-12  Martin Baulig  <martin@gnome.org>
10782
10783         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
10784
10785         * ecore.cs (IMemberExpr.DeclaringType): New property.
10786         (SimpleName.SimpleNameResolve): Check whether we're accessing a
10787         nonstatic member of an outer type (CS0038).
10788
10789 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
10790
10791         * driver.cs: Activate the using-error detector at warning level
10792         4 (at least for MS-compatible APIs).
10793
10794         * namespace.cs (VerifyUsing): Small buglett fix.
10795
10796         * pending.cs (PendingImplementation): pass the container pointer. 
10797
10798         * interface.cs (GetMethods): Allow for recursive definition.  Long
10799         term, I would like to move every type to support recursive
10800         definitions, not the current ordering mechanism that we have right
10801         now.
10802
10803         The situation is this: Attributes are handled before interfaces,
10804         so we can apply attributes to interfaces.  But some attributes
10805         implement interfaces, we will now handle the simple cases
10806         (recursive definitions will just get an error).  
10807
10808         * parameter.cs: Only invalidate types at the end if we fail to
10809         lookup all types.  
10810
10811 2002-09-09  Martin Baulig  <martin@gnome.org>
10812
10813         * ecore.cs (PropertyExpr.Emit): Also check for
10814         TypeManager.system_int_array_get_length so this'll also work when
10815         compiling corlib.  Fixes #30003.
10816
10817 2002-09-09  Martin Baulig  <martin@gnome.org>
10818
10819         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
10820         and throw an exception if we can't get the type's size.  Fixed #30040,
10821         added test-165.cs.
10822
10823 2002-09-09  Martin Baulig  <martin@gnome.org>
10824
10825         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
10826
10827         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
10828         context.  Fixes bug #30027.
10829
10830         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
10831         virtual functions.  Fixes bug #30043, added test-164.cs.
10832
10833 2002-09-08  Ravi Pratap  <ravi@ximian.com>
10834
10835         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
10836
10837 2002-09-08  Nick Drochak  <ndrochak@gol.com>
10838
10839         * driver.cs: Use an object to get the windows codepage since it's not a
10840         static property.
10841
10842 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
10843
10844         * statement.cs (For.Emit): for infinite loops (test == null)
10845         return whether there is a break inside, not always "true".
10846
10847         * namespace.cs (UsingEntry): New struct to hold the name of the
10848         using definition, the location where it is defined, and whether it
10849         has been used in a successful type lookup.
10850
10851         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
10852         strings.
10853
10854         * decl.cs: ditto.
10855
10856 2002-09-06  Ravi Pratap  <ravi@ximian.com>
10857
10858         * attribute.cs : Fix incorrect code which relied on catching
10859         a NullReferenceException to detect a null being passed in
10860         where an object was expected.
10861
10862 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
10863
10864         * statement.cs (Try): flag the catch variable as assigned
10865
10866         * expression.cs (Cast): Simplified by using ResolveType instead of
10867         manually resolving.
10868
10869         * statement.cs (Catch): Fix bug by using ResolveType.
10870
10871 2002-09-06  Ravi Pratap  <ravi@ximian.com>
10872
10873         * expression.cs (BetterConversion): Special case for when we have
10874         a NullLiteral as the argument and we have to choose between string
10875         and object types - we choose string the way csc does.
10876
10877         * attribute.cs (Attribute.Resolve): Catch the
10878         NullReferenceException and report error #182 since the Mono
10879         runtime no more has the bug and having this exception raised means
10880         we tried to select a constructor which takes an object and is
10881         passed a null.
10882
10883 2002-09-05  Ravi Pratap  <ravi@ximian.com>
10884
10885         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
10886         message (1502, 1503) when we can't locate a method after overload
10887         resolution. This is much more informative and closes the bug
10888         Miguel reported.
10889
10890         * interface.cs (PopulateMethod): Return if there are no argument
10891         types. Fixes a NullReferenceException bug.
10892
10893         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
10894         expressions too. Previously we were checking only in one place for
10895         positional arguments leaving out named arguments.
10896
10897         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
10898         type to the enum type is not allowed. Remove code corresponding to
10899         that.
10900
10901         (ConvertNumericExplicit): Allow explicit conversions from
10902         the underlying type to enum type. This precisely follows the spec
10903         and closes a bug filed by Gonzalo.
10904
10905 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10906
10907         * compiler.csproj:
10908         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
10909
10910 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
10911
10912         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
10913         it was important that we stored the right value after the
10914         reduction in `converted'.
10915
10916 2002-09-04  Martin Baulig  <martin@gnome.org>
10917
10918         * location.cs (Location.SymbolDocument): Use full pathnames for the
10919         source files.
10920
10921 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
10922
10923         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
10924         of the expression resolve mechanism, because that will catch the
10925         SimpleName error failures.
10926
10927         (Conditional): If we can not resolve the
10928         expression, return, do not crash.
10929
10930 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10931
10932         * cs-tokenizer.cs:
10933         (location): display token name instead of its number.
10934
10935 2002-08-28  Martin Baulig  <martin@gnome.org>
10936
10937         * expression.cs (Binary.ResolveOperator): Don't silently return
10938         but return an error if an operator cannot be applied between two
10939         enum types.
10940
10941 2002-08-28  Martin Baulig  <martin@gnome.org>
10942
10943         * class.cs (Constructor.Define): Set the permission attributes
10944         correctly instead of making all constructors public.
10945
10946 2002-08-28  Martin Baulig  <martin@gnome.org>
10947
10948         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
10949         for private members before reporting a CS0103; if we find anything,
10950         it's a CS0122.
10951
10952 2002-08-28  Martin Baulig  <martin@gnome.org>
10953
10954         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
10955         to check whether `closure_start_type == closure_invocation_type',
10956         we also need to check whether `m.DeclaringType == closure_invocation_type'
10957         before bypassing the permission checks.  We might be accessing
10958         protected/private members from the base class.
10959         (TypeManager.RealMemberLookup): Only set private_ok if private
10960         members were requested via BindingFlags.NonPublic.
10961
10962         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
10963
10964         * expression.cs (MemberAccess.ResolveMemberAccess): Set
10965         MethodGroupExpr.IsExplicitImpl if appropriate.
10966         (Invocation.DoResolve): Don't report the CS0120 for explicit
10967         interface implementations.
10968
10969 2002-08-27  Martin Baulig  <martin@gnome.org>
10970
10971         * expression.cs (Invocation.DoResolve): If this is a static
10972         method and we don't have an InstanceExpression, we must report
10973         a CS0120.
10974
10975 2002-08-25  Martin Baulig  <martin@gnome.org>
10976
10977         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
10978         `==' between a valuetype and an object.
10979
10980 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
10981
10982         * ecore.cs (TypeExpr): Provide a ToString method.
10983
10984 2002-08-24  Martin Baulig  <martin@gnome.org>
10985
10986         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
10987         now called proggie.dbg and it's a binary file.
10988
10989 2002-08-23  Martin Baulig  <martin@gnome.org>
10990
10991         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
10992
10993 2002-08-23  Martin Baulig  <martin@gnome.org>
10994
10995         * struct.cs (MyStructInfo.ctor): Make this work with empty
10996         structs; it's not allowed to use foreach() on null.
10997
10998 2002-08-23  Martin Baulig  <martin@gnome.org>
10999
11000         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
11001         writer the full pathname of the generated assembly.
11002
11003 2002-08-23  Martin Baulig  <martin@gnome.org>
11004
11005         * statements.cs (FlowBranching.UsageVector.MergeChildren):
11006         A `finally' block never returns or breaks; improved handling of
11007         unreachable code.
11008
11009 2002-08-23  Martin Baulig  <martin@gnome.org>
11010
11011         * statement.cs (Throw.Resolve): Allow `throw null'.
11012
11013 2002-08-23  Martin Baulig  <martin@gnome.org>
11014
11015         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
11016         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
11017         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
11018         MemberLookup would return a wrong event if this is an explicit
11019         interface implementation and the class has an event with the same
11020         name.
11021
11022 2002-08-23  Martin Baulig  <martin@gnome.org>
11023
11024         * statement.cs (Block.AddChildVariableNames): New public method.
11025         (Block.AddChildVariableName): Likewise.
11026         (Block.IsVariableNameUsedInChildBlock): Likewise.
11027         (Block.AddVariable): Check whether a variable name has already
11028         been used in a child block.
11029
11030         * cs-parser.jay (declare_local_variables): Mark all variable names
11031         from the current block as being used in a child block in the
11032         implicit block.
11033
11034 2002-08-23  Martin Baulig  <martin@gnome.org>
11035
11036         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
11037         find the symbol writer.
11038
11039         * driver.cs: csc also allows the arguments to /define being
11040         separated by commas, not only by semicolons.
11041
11042 2002-08-23  Martin Baulig  <martin@gnome.org>
11043
11044         * interface.cs (Interface.GetMembers): Added static check for events.
11045
11046 2002-08-15  Martin Baulig  <martin@gnome.org>
11047
11048         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
11049         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
11050
11051         * ecore.cs (Expression.MemberLookup): Added documentation and explained
11052         why the MethodData.EmitDestructor() change was necessary.
11053
11054 2002-08-20  Martin Baulig  <martin@gnome.org>
11055
11056         * class.cs (TypeContainer.FindMembers): Added static check for events.
11057
11058         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
11059
11060         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
11061         use Type.GetEvents(), not Type.FindMembers().
11062
11063 2002-08-20  Martin Baulig  <martin@gnome.org>
11064
11065         * decl.cs (MemberCache): Added a special method cache which will
11066         be used for method-only searched.  This ensures that a method
11067         search will return a MethodInfo with the correct ReflectedType for
11068         inherited methods.      
11069
11070 2002-08-20  Martin Baulig  <martin@gnome.org>
11071
11072         * decl.cs (DeclSpace.FindMembers): Made this public.
11073
11074 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11075
11076         * delegate.cs: fixed build on windows.
11077         [FIXME:  Filed as bug #29150: MCS must report these errors.]
11078
11079 2002-08-19  Ravi Pratap  <ravi@ximian.com>
11080
11081         * ecore.cs (StandardConversionExists): Return a false
11082         if we are trying to convert the void type to anything else
11083         since that is not allowed.
11084
11085         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
11086         we flag error 70 in the event an event is trying to be accessed
11087         directly from outside the declaring type.
11088
11089 2002-08-20  Martin Baulig  <martin@gnome.org>
11090
11091         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
11092         MemberCache from typemanager.cs to decl.cs.
11093
11094 2002-08-19  Martin Baulig  <martin@gnome.org>
11095
11096         * class.cs (TypeContainer): Implement IMemberContainer.
11097         (TypeContainer.DefineMembers): Create the MemberCache.
11098         (TypeContainer.FindMembers): Do better BindingFlags checking; only
11099         return public members if BindingFlags.Public was given, check
11100         whether members are static.
11101
11102 2002-08-16  Martin Baulig  <martin@gnome.org>
11103
11104         * decl.cs (DeclSpace.Define): Splitted this in Define and
11105         DefineMembers.  DefineMembers is called first and initializes the
11106         MemberCache.
11107
11108         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
11109         DefineMembers() on all our DeclSpaces.
11110
11111         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
11112         but call DefineMembers() on all nested interfaces.  We call their
11113         Define() in our new Define() function.
11114
11115         * interface.cs (Interface): Implement IMemberContainer.
11116         (Interface.Define): Moved all code except the attribute stuf to
11117         DefineMembers().
11118         (Interface.DefineMembers): Initialize the member cache.
11119
11120         * typemanager.cs (IMemberFinder): Removed this interface, we don't
11121         need this anymore since we can use MemberCache.FindMembers directly.
11122
11123 2002-08-19  Martin Baulig  <martin@gnome.org>
11124
11125         * typemanager.cs (MemberCache): When creating the cache for an
11126         interface type, add all inherited members.
11127         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
11128         to `out bool used_cache' and documented it.
11129         (TypeManager.MemberLookup): If we already used the cache in the first
11130         iteration, we don't need to do the interfaces check.
11131
11132 2002-08-19  Martin Baulig  <martin@gnome.org>
11133
11134         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
11135         here from IMemberFinder and don't implement this interface anymore.
11136         (DeclSpace.MemberCache): Moved here from IMemberFinder.
11137
11138         * typemanager.cs (IMemberFinder): This interface is now only used by
11139         classes which actually support the member cache.
11140         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
11141         since we only put DeclSpaces into this Hashtable.
11142         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
11143         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
11144
11145 2002-08-16  Martin Baulig  <martin@gnome.org>
11146
11147         * typemanager.cs (ICachingMemberFinder): Removed.
11148         (IMemberFinder.MemberCache): New property.
11149         (TypeManager.FindMembers): Merged this with RealFindMembers().
11150         This function will never be called from TypeManager.MemberLookup()
11151         so we can't use the cache here, just the IMemberFinder.
11152         (TypeManager.MemberLookup_FindMembers): Check whether the
11153         IMemberFinder has a MemberCache and call the cache's FindMembers
11154         function.
11155         (MemberCache): Rewrote larger parts of this yet another time and
11156         cleaned it up a bit.
11157
11158 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
11159
11160         * driver.cs (LoadArgs): Support quoting.
11161
11162         (Usage): Show the CSC-like command line arguments.
11163
11164         Improved a few error messages.
11165
11166 2002-08-15  Martin Baulig  <martin@gnome.org>
11167
11168         * typemanager.cs (IMemberContainer.Type): New property.
11169         (IMemberContainer.IsInterface): New property.
11170
11171         The following changes are conditional to BROKEN_RUNTIME, which is
11172         defined at the top of the file.
11173
11174         * typemanager.cs (MemberCache.MemberCache): Don't add the base
11175         class'es members, but add all members from TypeHandle.ObjectType
11176         if we're an interface.
11177         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
11178         is the current type.
11179         (MemberCache.CacheEntry.Container): Removed this field.
11180         (TypeHandle.GetMembers): Include inherited members.
11181
11182 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11183
11184         * typemanager.cs: fixed compilation and added a comment on a field that
11185         is never used.
11186
11187 2002-08-15  Martin Baulig  <martin@gnome.org>
11188
11189         * class.cs (ConstructorInitializer.Resolve): In the
11190         Expression.MemberLookup call, use the queried_type as
11191         invocation_type.
11192
11193         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
11194         declared' attribute, it's always true.
11195         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
11196         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
11197         temporary wrapper for FindMembers which tells MemberLookup whether
11198         members from the base classes are included in the return value.
11199         This will go away soon.
11200         (TypeManager.MemberLookup): Use this temporary hack here; once the
11201         new MemberCache is completed, we don't need to do the DeclaredOnly
11202         looping here anymore since the MemberCache will take care of this.
11203         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
11204         (MemberCache): When creating the MemberCache for a class, get
11205         members from the current class and all its base classes.
11206         (MemberCache.CacheEntry.Container): New field.  This is a
11207         temporary hack until the Mono runtime is fixed to distinguish
11208         between ReflectedType and DeclaringType.  It allows us to use MCS
11209         with both the MS runtime and the unfixed Mono runtime without
11210         problems and without accecting performance.
11211         (MemberCache.SearchMembers): The DeclaredOnly looping from
11212         TypeManager.MemberLookup is now done here.      
11213
11214 2002-08-14  Martin Baulig  <martin@gnome.org>
11215
11216         * statement.cs (MyStructInfo.MyStructInfo): Don't call
11217         Type.GetFields on dynamic types but get the fields from the
11218         corresponding TypeContainer.
11219         (MyStructInfo.GetStructInfo): Added check for enum types.
11220
11221         * typemanager.cs (MemberList.IsSynchronized): Implemented.
11222         (MemberList.SyncRoot): Implemented.
11223         (TypeManager.FilterWithClosure): No need to check permissions if
11224         closure_start_type == closure_invocation_type, don't crash if
11225         closure_invocation_type is null.
11226
11227 2002-08-13  Martin Baulig  <martin@gnome.org>
11228
11229         Rewrote TypeContainer.FindMembers to use a member cache.  This
11230         gives us a speed increase of about 35% for the self-hosting MCS
11231         build and of about 15-20% for the class libs (both on GNU/Linux).
11232
11233         * report.cs (Timer): New class to get enhanced profiling.  This
11234         whole class is "TIMER" conditional since it remarkably slows down
11235         compilation speed.
11236
11237         * class.cs (MemberList): New class.  This is an IList wrapper
11238         which we're now using instead of passing MemberInfo[]'s around to
11239         avoid copying this array unnecessarily.
11240         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
11241         (ICachingMemberFinder, IMemberContainer): New interface.
11242         (TypeManager.FilterWithClosure): If `criteria' is null, the name
11243         has already been checked, otherwise use it for the name comparision.
11244         (TypeManager.FindMembers): Renamed to RealMemberFinder and
11245         provided wrapper which tries to use ICachingMemberFinder.FindMembers
11246         if possible.  Returns a MemberList, not a MemberInfo [].
11247         (TypeHandle): New class, implements IMemberContainer.  We create
11248         one instance of this class per type, it contains a MemberCache
11249         which is used to do the member lookups.
11250         (MemberCache): New class.  Each instance of this class contains
11251         all members of a type and a name-based hash table.
11252         (MemberCache.FindMembers): This is our new member lookup
11253         function.  First, it looks up all members of the requested name in
11254         the hash table.  Then, it walks this list and sorts out all
11255         applicable members and returns them.
11256
11257 2002-08-13  Martin Baulig  <martin@gnome.org>
11258
11259         In addition to a nice code cleanup, this gives us a performance
11260         increase of about 1.4% on GNU/Linux - not much, but it's already
11261         half a second for the self-hosting MCS compilation.
11262
11263         * typemanager.cs (IMemberFinder): New interface.  It is used by
11264         TypeManager.FindMembers to call FindMembers on a TypeContainer,
11265         Enum, Delegate or Interface.
11266         (TypeManager.finder_to_member_finder): New PtrHashtable.
11267         (TypeManager.finder_to_container): Removed.
11268         (TypeManager.finder_to_delegate): Removed.
11269         (TypeManager.finder_to_interface): Removed.
11270         (TypeManager.finder_to_enum): Removed.
11271
11272         * interface.cs (Interface): Implement IMemberFinder.
11273
11274         * delegate.cs (Delegate): Implement IMemberFinder.
11275
11276         * enum.cs (Enum): Implement IMemberFinder.
11277
11278         * class.cs (TypeContainer): Implement IMemberFinder.
11279
11280 2002-08-12  Martin Baulig  <martin@gnome.org>
11281
11282         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
11283
11284 2002-08-12  Martin Baulig  <martin@gnome.org>
11285
11286         * ecore.cs (ITypeExpression): New interface for expressions which
11287         resolve to a type.
11288         (TypeExpression): Renamed to TypeLookupExpression.
11289         (Expression.DoResolve): If we're doing a types-only lookup, the
11290         expression must implement the ITypeExpression interface and we
11291         call DoResolveType() on it.
11292         (SimpleName): Implement the new ITypeExpression interface.
11293         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
11294         hack, the situation that we're only looking up types can't happen
11295         anymore when this method is called.  Moved the type lookup code to
11296         DoResolveType() and call it.
11297         (SimpleName.DoResolveType): This ITypeExpression interface method
11298         is now doing the types-only lookup.
11299         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
11300         (ResolveFlags): Added MaskExprClass.
11301
11302         * expression.cs (MemberAccess): Implement the ITypeExpression
11303         interface.
11304         (MemberAccess.DoResolve): Added support for a types-only lookup
11305         when we're called via ITypeExpression.DoResolveType().
11306         (ComposedCast): Implement the ITypeExpression interface.
11307
11308         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
11309         Expression.Resolve() with ResolveFlags.Type instead.
11310
11311 2002-08-12  Martin Baulig  <martin@gnome.org>
11312
11313         * interface.cs (Interface.Define): Apply attributes.
11314
11315         * attribute.cs (Attribute.ApplyAttributes): Added support for
11316         interface attributes.
11317
11318 2002-08-11  Martin Baulig  <martin@gnome.org>
11319
11320         * statement.cs (Block.Emit): Only check the "this" variable if we
11321         do not always throw an exception.
11322
11323         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
11324         whether the property has a set accessor.
11325
11326 2002-08-11  Martin Baulig  <martin@gnome.org>
11327
11328         Added control flow analysis support for structs.
11329
11330         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
11331         with control flow analysis turned off.
11332         (IVariable): New interface.
11333         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
11334         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
11335         (FieldExpr.DoResolve): Resolve the instance expression with flow
11336         analysis turned off and do the definite assignment check after the
11337         resolving when we know what the expression will resolve to.
11338
11339         * expression.cs (LocalVariableReference, ParameterReference):
11340         Implement the new IVariable interface, only call the flow analysis
11341         code if ec.DoFlowAnalysis is true.
11342         (This): Added constructor which takes a Block argument.  Implement
11343         the new IVariable interface.
11344         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
11345         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
11346         This does the definite assignment checks for struct members.
11347
11348         * class.cs (Constructor.Emit): If this is a non-static `struct'
11349         constructor which doesn't have any initializer, call
11350         Block.AddThisVariable() to tell the flow analysis code that all
11351         struct elements must be initialized before control returns from
11352         the constructor.
11353
11354         * statement.cs (MyStructInfo): New public class.
11355         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
11356         argument to this indexer.  If non-zero, check an individual struct
11357         member, not the whole struct.
11358         (FlowBranching.CheckOutParameters): Check struct members.
11359         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
11360         overloaded versions of these methods which take an additional
11361         `int field_idx' argument to check struct members.
11362         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
11363         overloaded versions of these methods which take an additional
11364         `string field_name' argument to check struct member.s
11365         (VariableInfo): Implement the IVariable interface.
11366         (VariableInfo.StructInfo): New public property.  Returns the
11367         MyStructInfo instance of the variable if it's a struct or null.
11368         (Block.AddThisVariable): New public method.  This is called from
11369         Constructor.Emit() for non-static `struct' constructor which do
11370         not have any initializer.  It creates a special variable for the
11371         "this" instance variable which will be checked by the flow
11372         analysis code to ensure that all of the struct's fields are
11373         initialized before control returns from the constructor.
11374         (UsageVector): Added support for struct members.  If a
11375         variable/parameter is a struct with N members, we reserve a slot
11376         in the usage vector for each member.  A struct is considered fully
11377         initialized if either the struct itself (slot 0) or all its
11378         members are initialized.
11379
11380 2002-08-08  Martin Baulig  <martin@gnome.org>
11381
11382         * driver.cs (Driver.MainDriver): Only report an error CS5001
11383         if there were no compilation errors.
11384
11385         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
11386         `UnsafeContext' property to determine whether the parent is in
11387         unsafe context rather than checking the parent's ModFlags:
11388         classes nested in an unsafe class are unsafe as well.
11389
11390 2002-08-08  Martin Baulig  <martin@gnome.org>
11391
11392         * statement.cs (UsageVector.MergeChildren): Distinguish between
11393         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
11394         we return.  Added test17() and test18() to test-154.cs.
11395
11396 2002-08-08  Martin Baulig  <martin@gnome.org>
11397
11398         * typemanager.cs (TypeManager.FilterWithClosure): If we have
11399         Family access, make sure the invoking type isn't a subclass of the
11400         queried type (that'd be a CS1540).
11401
11402         * ecore.cs (Expression.MemberLookup): Added overloaded version of
11403         this method which takes an additional `Type invocation_type'.
11404
11405         * expression.cs (BaseAccess.DoResolve): Use the base type as
11406         invocation and query type.
11407         (MemberAccess.DoResolve): If the lookup failed and we're about to
11408         report a CS0122, try a lookup with the ec.ContainerType - if this
11409         succeeds, we must report a CS1540.
11410
11411 2002-08-08  Martin Baulig  <martin@gnome.org>
11412
11413         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
11414         (MethodGroupExpr): Implement the IMemberExpr interface.
11415
11416         * expression (MemberAccess.ResolveMemberAccess): No need to have
11417         any special code for MethodGroupExprs anymore, they're now
11418         IMemberExprs.   
11419
11420 2002-08-08  Martin Baulig  <martin@gnome.org>
11421
11422         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
11423         Family, FamANDAssem and FamORAssem permissions.
11424         (TypeManager.IsSubclassOrNestedChildOf): New public method.
11425
11426 2002-08-08  Martin Baulig  <martin@gnome.org>
11427
11428         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
11429         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
11430         or loop block.
11431
11432 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
11433
11434         * driver.cs: implemented /resource option to embed managed resources.
11435
11436 2002-08-07  Martin Baulig  <martin@gnome.org>
11437
11438         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
11439         (FieldBase.HasFieldInitializer): New public property.
11440         (FieldBase.GetInitializerExpression): New public method.  Resolves and
11441         returns the field initializer and makes sure it is only resolved once.
11442         (TypeContainer.EmitFieldInitializers): Call
11443         FieldBase.GetInitializerExpression to get the initializer, this ensures
11444         that it isn't resolved multiple times.
11445
11446         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
11447         the resolving process (SimpleName/MemberLookup) that we're currently
11448         emitting a field initializer (which must not access any instance members,
11449         this is an error CS0236).
11450
11451         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
11452         argument, if the `IsFieldInitializer' flag is set, we must report and
11453         error CS0236 and not an error CS0120.   
11454
11455 2002-08-07  Martin Baulig  <martin@gnome.org>
11456
11457         * ecore.cs (IMemberExpr): New public interface.
11458         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
11459         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
11460         if the expression is an IMemberExpr.
11461
11462         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
11463         to be null, implicitly default to `this' if we're non-static in
11464         this case.  Simplified the code a lot by using the new IMemberExpr
11465         interface.  Also fixed bug #28176 here.
11466
11467 2002-08-06  Martin Baulig  <martin@gnome.org>
11468
11469         * cs-parser.jay (SimpleLookup): Removed.  We need to create
11470         ParameterReferences during semantic analysis so that we can do a
11471         type-only search when resolving Cast, TypeOf and SizeOf.
11472         (block): Pass the `current_local_parameters' to the Block's
11473         constructor.
11474
11475         * class.cs (ConstructorInitializer): Added `Parameters parameters'
11476         argument to the constructor.
11477         (ConstructorInitializer.Resolve): Create a temporary implicit
11478         block with the parameters.
11479
11480         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
11481         references here if we aren't doing a type-only search.
11482
11483         * statement.cs (Block): Added constructor which takes a
11484         `Parameters parameters' argument.
11485         (Block.Parameters): New public property.
11486
11487         * support.cs (InternalParameters.Parameters): Renamed `parameters'
11488         to `Parameters' and made it public readonly.
11489
11490 2002-08-06  Martin Baulig  <martin@gnome.org>
11491
11492         * ecore.cs (Expression.Warning): Made this public as well.
11493
11494         * report.cs (Report.Debug): Print the contents of collections.
11495
11496 2002-08-06  Martin Baulig  <martin@gnome.org>
11497
11498         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
11499         used to tell Resolve() which kinds of expressions it may return.
11500         (Expression.Resolve): Added overloaded version of this method which
11501         takes a `ResolveFlags flags' argument.  This can be used to tell
11502         Resolve() which kinds of expressions it may return.  Reports a
11503         CS0118 on error.
11504         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
11505         ResolveFlags.SimpleName.
11506         (Expression.Error118): Added overloaded version of this method which
11507         takes a `ResolveFlags flags' argument.  It uses the flags to determine
11508         which kinds of expressions are allowed.
11509
11510         * expression.cs (Argument.ResolveMethodGroup): New public method.
11511         Resolves an argument, but allows a MethodGroup to be returned.
11512         This is used when invoking a delegate.
11513
11514         * TODO: Updated a bit.
11515
11516 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11517
11518         Fixed compilation with csc.
11519
11520         * ecore.cs: Expression.Error made public. Is this correct? Should
11521         Warning be made public too?
11522
11523         * expression.cs: use ea.Location instead of ea.loc.
11524         [FIXME:  Filed as bug #28607: MCS must report these errors.]
11525
11526 2002-08-06  Martin Baulig  <martin@gnome.org>
11527
11528         * ecore.cs (Expression.loc): Moved the location here instead of
11529         duplicating it in all derived classes.
11530         (Expression.Location): New public property.
11531         (Expression.Error, Expression.Warning): Made them non-static and
11532         removed the location argument.
11533         (Expression.Warning): Added overloaded version which takes an
11534         `int level' argument.
11535         (Expression.Error118): Make this non-static and removed the
11536         expression and location arguments.
11537         (TypeExpr): Added location argument to the constructor.
11538
11539         * expression.cs (StaticCallExpr): Added location argument to
11540         the constructor.
11541         (Indirection, PointerArithmetic): Likewise.
11542         (CheckedExpr, UnCheckedExpr): Likewise.
11543         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
11544         (StringPtr): Likewise.
11545
11546
11547 2002-08-05  Martin Baulig  <martin@gnome.org>
11548
11549         * expression.cs (BaseAccess.DoResolve): Actually report errors.
11550
11551         * assign.cs (Assign.DoResolve): Check whether the source
11552         expression is a value or variable.
11553
11554         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
11555         while resolving the corresponding blocks.
11556
11557         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
11558         an error, don't silently return null.
11559
11560         * statement.cs (Block.AddVariable): Do the error reporting here
11561         and distinguish between CS0128 and CS0136.
11562         (Block.DoResolve): Report all unused labels (warning CS0164).
11563         (LabeledStatement): Pass the location to the constructor.
11564         (LabeledStatement.HasBeenReferenced): New property.
11565         (LabeledStatement.Resolve): Set it to true here.
11566
11567         * statement.cs (Return.Emit): Return success even after reporting
11568         a type mismatch error (CS0126 or CS0127), this is what csc does and
11569         it avoids confusing the users with any consecutive errors.
11570
11571 2002-08-05  Martin Baulig  <martin@gnome.org>
11572
11573         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
11574
11575         * const.cs (Const.LookupConstantValue): Catch circular definitions.
11576
11577         * expression.cs (MemberAccess.DoResolve): Silently return if an
11578         error has already been reported.
11579
11580         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
11581         error has already been reported.
11582
11583 2002-08-05  Martin Baulig  <martin@gnome.org>
11584
11585         * statement.cs (UsageVector): Only initialize the `parameters'
11586         vector if we actually have any "out" parameters.
11587
11588 2002-08-05  Martin Baulig  <martin@gnome.org>
11589
11590         * expression.cs (Binary.ResolveOperator): When combining delegates,
11591         they must have the same type.
11592
11593 2002-08-05  Martin Baulig  <martin@gnome.org>
11594
11595         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
11596         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
11597         work with the ms runtime and we also don't need it: if we're a
11598         PropertyBuilder and not in the `indexer_arguments' hash, then we
11599         are a property and not an indexer.
11600
11601         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
11602         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
11603         since the latter one doesn't work with the ms runtime.
11604
11605 2002-08-03  Martin Baulig  <martin@gnome.org>
11606
11607         Fixed bugs #27998 and #22735.
11608
11609         * class.cs (Method.IsOperator): New public field.
11610         (Method.CheckBase): Report CS0111 if there's already a method
11611         with the same parameters in the current class.  Report CS0508 when
11612         attempting to change the return type of an inherited method.
11613         (MethodData.Emit): Report CS0179 if a method doesn't have a body
11614         and it's not marked abstract or extern.
11615         (PropertyBase): New abstract base class for Property and Indexer.
11616         (PropertyBase.CheckBase): Moved here from Property and made it work
11617         for indexers.
11618         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
11619         the same so we can reuse it there.
11620         (Property, Indexer): Derive from PropertyBase.
11621         (MethodSignature.inheritable_property_signature_filter): New delegate
11622         to find properties and indexers.
11623
11624         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
11625         argument and improved error reporting.
11626
11627         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
11628         EmptyReadOnlyParameters and made it a property.
11629
11630         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
11631         version of this method which takes a `PropertyInfo indexer'.
11632         (TypeManager.RegisterIndexer): New method.
11633
11634         * class.cs: Added myself as author of this file :-)
11635
11636 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11637
11638         * class.cs: fixed compilation on windoze.
11639
11640 2002-08-03  Martin Baulig  <martin@gnome.org>
11641
11642         * interface.cs (Interface.GetInterfaceBases): Check whether all
11643         base interfaces are at least as accessible than the current one.
11644
11645         * class.cs (TypeContainer.GetClassBases): Check whether base types
11646         are at least as accessible than the current type.
11647         (TypeContainer.AsAccessible): Implemented and made non-static.
11648         (MemberBase.CheckParameters): Report errors if the accessibility
11649         checks fail.
11650
11651         * delegate.cs (Delegate.Delegate): The default visibility is
11652         internal for top-level types and private for nested types.
11653         (Delegate.Define): Report errors if the accessibility checks fail.
11654
11655         * enum.cs (Enum.Enum): The default visibility is internal for
11656         top-level types and private for nested types.
11657         (Enum.DefineType): Compute the correct visibility.
11658
11659         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
11660         function which takes a `bool is_toplevel' instead of a TypeContainer.
11661
11662         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
11663         builtin type.
11664
11665 2002-08-02  Martin Baulig  <martin@gnome.org>
11666
11667         * expression.cs (LocalVariableReferenc): Added constructor which
11668         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
11669         (LocalVariableReference.IsReadOnly): New property.
11670         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
11671         variable is readonly, use our own readonly flag to do this; you can
11672         use the new constructor to get a writable reference to a read-only
11673         variable.
11674
11675         * cs-parser.jay (foreach_statement, using_statement): Get a writable
11676         reference to the local variable.
11677
11678 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
11679
11680         * rootcontext.cs (ResolveCore): Also include System.Exception
11681
11682         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
11683         we reach an EmptyStatement.
11684
11685         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
11686         is also fine.
11687
11688         * expression.cs (Binary.ResolveOperator): Check error result in
11689         two places.
11690
11691         use brtrue/brfalse directly and avoid compares to null.
11692
11693 2002-08-02  Martin Baulig  <martin@gnome.org>
11694
11695         * class.cs (TypeContainer.Define): Define all nested interfaces here.
11696         Fixes bug #28407, added test-155.cs.
11697
11698 2002-08-01  Martin Baulig  <martin@gnome.org>
11699
11700         * class.cs (Event.EmitDefaultMethod): Make this work with static
11701         events.  Fixes #28311, added verify-3.cs.
11702
11703 2002-08-01  Martin Baulig  <martin@gnome.org>
11704
11705         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
11706         `is_disposable' fields.
11707         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
11708         `hm.is_disposable' if we're using the collection pattern.
11709         (Foreach.EmitCollectionForeach): Use the correct type for the
11710         enumerator's local variable, only emit the try/finally block if
11711         necessary (fixes #27713).
11712
11713 2002-08-01  Martin Baulig  <martin@gnome.org>
11714
11715         * ecore.cs (Expression.report118): Renamed to Error118 and made
11716         it public static.
11717
11718         * statement.cs (Throw.Resolve): Check whether the expression is of
11719         the correct type (CS0118) and whether the type derives from
11720         System.Exception (CS0155).
11721         (Catch.Resolve): New method.  Do the type lookup here and check
11722         whether it derives from System.Exception (CS0155).
11723         (Catch.CatchType, Catch.IsGeneral): New public properties.
11724
11725         * typemanager.cs (TypeManager.exception_type): Added.
11726
11727 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
11728
11729         * driver.cs: Updated About function.
11730
11731 2002-07-31  Martin Baulig  <martin@gnome.org>
11732
11733         Implemented Control Flow Analysis.
11734
11735         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
11736         (EmitContext.CurrentBranching): Added.
11737         (EmitContext.StartFlowBranching): Added.
11738         (EmitContext.EndFlowBranching): Added.
11739         (EmitContext.KillFlowBranching): Added.
11740         (EmitContext.IsVariableAssigned): Added.
11741         (EmitContext.SetVariableAssigned): Added.
11742         (EmitContext.IsParameterAssigned): Added.
11743         (EmitContext.SetParameterAssigned): Added.
11744         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
11745         Added control flow analysis stuff here.
11746
11747         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
11748         resolve the expression as lvalue.
11749         (LocalVariableReference.DoResolve): Check whether the variable has
11750         already been assigned.
11751         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
11752         the parameter as assigned here.
11753         (ParameterReference.DoResolve): Check whether the parameter has already
11754         been assigned.
11755         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
11756         expression as lvalue.
11757
11758         * statement.cs (FlowBranching): New class for the flow analysis code.
11759         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
11760         (LabeledStatement.IsDefined): New public property.
11761         (LabeledStatement.AddUsageVector): New public method to tell flow
11762         analyis that the label may be reached via a forward jump.
11763         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
11764         flow analysis.
11765         (VariableInfo.Number): New public field.  This is used by flow analysis
11766         to number all locals of a block.
11767         (Block.CountVariables): New public property.  This is the number of
11768         local variables in this block (including the locals from all parent
11769         blocks).
11770         (Block.EmitMeta): Number all the variables.
11771
11772         * statement.cs: Added flow analysis support to all classes.
11773
11774 2002-07-31  Martin Baulig  <martin@gnome.org>
11775
11776         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
11777         To get debugging messages, compile mcs with /define:MCS_DEBUG and
11778         then use this argument.
11779
11780         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
11781
11782         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
11783         use this to specify /define options.
11784
11785 2002-07-29  Martin Baulig  <martin@gnome.org>
11786
11787         * statement.cs (Fixed): Moved all code that does variable lookups
11788         and resolvings from Emit to Resolve.
11789
11790         * statement.cs (For): Moved all code that does variable lookups
11791         and resolvings from Emit to Resolve.
11792
11793         * statement.cs (Using): Moved all code that does variable lookups
11794         and resolvings from Emit to Resolve.
11795
11796 2002-07-29  Martin Baulig  <martin@gnome.org>
11797
11798         * attribute.cs (Attribute.Resolve): Explicitly catch a
11799         System.NullReferenceException when creating the
11800         CustromAttributeBuilder and report a different warning message.
11801
11802 2002-07-29  Martin Baulig  <martin@gnome.org>
11803
11804         * support.cs (ParameterData.ParameterName): Added method to
11805         get the name of a parameter.
11806
11807         * typemanager.cs (TypeManager.IsValueType): New public method.
11808
11809 2002-07-29  Martin Baulig  <martin@gnome.org>
11810
11811         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
11812         is a flag which specifies that it's either ref or out.
11813         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
11814         the out parameter to `out Parameter.Modifier mod', also set the
11815         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
11816
11817         * support.cs (InternalParameters.ParameterModifier): Distinguish
11818         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
11819         Parameter.Modifier.ISBYREF flag if it's either ref or out.
11820
11821         * expression.cs (Argument.GetParameterModifier): Distinguish
11822         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
11823         Parameter.Modifier.ISBYREF flag if it's either ref or out.
11824
11825 2002-07-29  Martin Baulig  <martin@gnome.org>
11826
11827         * expression.cs (ParameterReference.ParameterReference): Added
11828         `Location loc' argument to the constructor.
11829
11830         * cs-parser.jay: Pass location to ParameterReference.
11831
11832 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
11833
11834         * statement.cs (Try): Initialize the location.
11835
11836         * cs-parser.jay: pass location to Try.
11837
11838         * expression.cs (Unary.Reduce): Change the prototype to return
11839         whether a constant fold could be performed or not.  The result is
11840         returned in an out parameters.  In the case of Indirection and
11841         AddressOf, we want to perform the full tests.
11842
11843 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
11844
11845         * statement.cs (Statement.Emit): Flag dead code.
11846
11847 2002-07-27  Andrew Birkett  <andy@nobugs.org>
11848
11849         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
11850
11851 2002-07-27  Martin Baulig  <martin@gnome.org>
11852
11853         * class.cs (MethodData.Define): Put back call to
11854         TypeManager.AddMethod(), accidentally commented this out.
11855
11856         * report.cs (Debug): New public method to print debugging information,
11857         this is `[Conditional ("DEBUG")]'.
11858
11859 2002-07-26  Martin Baulig  <martin@gnome.org>
11860
11861         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
11862         (switch_statement): Push the current_block to the switch_stack and
11863         pop it again when we're done with the switch.
11864         (switch_section): The new block is a child of the current_block.
11865         Fixes bug #24007, added test-152.cs.
11866
11867 2002-07-27  Martin Baulig  <martin@gnome.org>
11868
11869         * expression.cs (Invocation.EmitArguments): When calling a varargs
11870         function with only its fixed arguments, we need to pass an empty
11871         array.
11872
11873 2002-07-27  Martin Baulig  <martin@gnome.org>
11874
11875         Mono 0.13 has been released.
11876
11877 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
11878
11879         * driver.cs: Rename --resource to --linkres, because that is what
11880         we do currently, we dont support --resource yet.
11881
11882         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
11883
11884 2002-07-25  Martin Baulig  <martin@gnome.org>
11885
11886         * class.cs (MethodData): New public class.  This is a `method builder'
11887         class for a method or one accessor of a Property/Indexer/Event.
11888         (MethodData.GetMethodFlags): Moved here from MemberBase.
11889         (MethodData.ApplyAttributes): Likewise.
11890         (MethodData.ApplyObsoleteAttribute): Likewise.
11891         (MethodData.ApplyConditionalAttribute): Likewise.
11892         (MethodData.ApplyDllImportAttribute): Likewise.
11893         (MethodData.CheckAbstractAndExternal): Likewise.
11894         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
11895         (MethodData.Emit): Formerly known as Method.Emit().
11896         (MemberBase): Moved everything which was specific to a single
11897         accessor/method to MethodData.
11898         (Method): Create a new MethodData and call Define() and Emit() on it.
11899         (Property, Indexer, Event): Create a new MethodData objects for each
11900         accessor and call Define() and Emit() on them.
11901
11902 2002-07-25  Martin Baulig  <martin@gnome.org>
11903
11904         Made MethodCore derive from MemberBase to reuse the code from there.
11905         MemberBase now also checks for attributes.
11906
11907         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
11908         (MemberBase.GetMethodFlags): Moved here from class Method and marked
11909         as virtual.
11910         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
11911         `CallingConventions cc' and `Attributes opt_attrs' arguments.
11912         (MemberBase.ApplyAttributes): New virtual method; applies the
11913         attributes to a method or accessor.
11914         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
11915         (MemberBase.ApplyConditionalAttribute): Likewise.
11916         (MemberBase.ApplyDllImportAttribute): Likewise.
11917         (MemberBase.CheckAbstractAndExternal): Likewise.
11918         (MethodCore.ParameterTypes): This is now a property instead of a
11919         method, it's initialized from DoDefineParameters().
11920         (MethodCore.ParameterInfo): Removed the set accessor.
11921         (MethodCore.DoDefineParameters): New protected virtual method to
11922         initialize ParameterTypes and ParameterInfo.
11923         (Method.GetReturnType): We can now simply return the MemberType.
11924         (Method.GetMethodFlags): Override the MemberBase version and add
11925         the conditional flags.
11926         (Method.CheckBase): Moved some code from Define() here, call
11927         DoDefineParameters() here.
11928         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
11929         here to avoid some larger code duplication.
11930         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
11931         ensure that abstract and external accessors don't declare a body.
11932
11933         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
11934         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
11935         lookup in the attribute's parent classes, so we need to abort as soon
11936         as we found the first match.
11937         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
11938         the attribute has no arguments.
11939
11940         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
11941         of a Method.
11942
11943 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11944
11945         * cs-parser.jay: reverted previous patch.
11946
11947 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11948
11949         * cs-parser.jay: fixed bug #22119.
11950
11951 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11952
11953         * attribute.cs: fixed compilation. The error was:
11954         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
11955         be assigned to before control leaves the current method."
11956         [FIXME:  Filed as bug #28186: MCS must report this error.]
11957
11958 2002-07-25  Martin Baulig  <martin@gnome.org>
11959
11960         * attribute.cs (Attribute.Conditional_GetConditionName): New static
11961         method to pull the condition name ouf of a Conditional attribute.
11962         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
11963         the obsolete message and error flag out of an Obsolete attribute.
11964
11965         * class.cs (Method.GetMethodFlags): New public method to get the
11966         TypeManager.MethodFlags for this method.
11967         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
11968         private methods.
11969         (Method.Define): Get and apply the Obsolete and Conditional attributes;
11970         if we're overriding a virtual function, set the new private variable
11971         `parent_method'; call the new TypeManager.AddMethod().
11972
11973         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
11974         the MethodBuilder and the Method in a PtrHashtable.
11975         (TypeManager.builder_to_method): Added for this purpose.
11976         (TypeManager.MethodFlags): Added IsObsoleteError.
11977         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
11978         Obsolete and Conditional arguments in MethodBuilders.  If we discover
11979         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
11980         the message from the attribute.
11981
11982 2002-07-24  Martin Baulig  <martin@gnome.org>
11983
11984         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
11985         preprocessor directives, ensure that the argument to #define/#undef is
11986         exactly one identifier and that it's actually an identifier.
11987
11988         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
11989         did not work ....
11990
11991 2002-07-24  Martin Baulig  <martin@gnome.org>
11992
11993         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
11994         initialize it to TypeManager.object_type in the constructor.
11995         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
11996         of the `hm.get_current' method if we're using the collection pattern.
11997         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
11998         for the explicit conversion to make it work when we're using the collection
11999         pattern and the `Current' property has a different return type than `object'.
12000         Fixes #27713.
12001
12002 2002-07-24  Martin Baulig  <martin@gnome.org>
12003
12004         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
12005         does not match, but don't report any errors.  This method is called in
12006         order for all methods in a MethodGroupExpr until a matching method is
12007         found, so we don't want to bail out if the first method doesn't match.
12008         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
12009         matches, report the 123.  Fixes #28070.
12010
12011 2002-07-24  Martin Baulig  <martin@gnome.org>
12012
12013         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
12014         TypeManager.TypeToCoreType() to the top of the method so the
12015         following equality checks will work.  Fixes #28107.
12016
12017 2002-07-24  Martin Baulig  <martin@gnome.org>
12018
12019         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
12020         operand is of type uint, and the other operand is of type sbyte,
12021         short or int, the operands are converted to type long." -
12022         Actually do what this comment already told us.  Fixes bug #28106,
12023         added test-150.cs.
12024
12025 2002-07-24  Martin Baulig  <martin@gnome.org>
12026
12027         * class.cs (MethodBase): New abstract class.  This is now a base
12028         class for Property, Indexer and Event to avoid some code duplication
12029         in their Define() and DefineMethods() methods.
12030         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
12031         generic methods for Define() and DefineMethods().
12032         (FieldBase): Derive from MemberBase, not MemberCore.
12033         (Property): Derive from MemberBase, not MemberCore.
12034         (Property.DefineMethod): Moved all the code from this method to the
12035         new MethodBase.DefineAccessor(), just call it with appropriate
12036         argumetnts.
12037         (Property.Define): Call the new Property.DoDefine(), this does some
12038         sanity checks and we don't need to duplicate the code everywhere.
12039         (Event): Derive from MemberBase, not MemberCore.
12040         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
12041         accessors, this will also make them work with interface events.
12042         (Indexer): Derive from MemberBase, not MemberCore.
12043         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
12044         (Indexer.Define): Use the new MethodBase functions.
12045
12046         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
12047         argument to the constructor.
12048         (Interface.FindMembers): Added support for interface events.
12049         (Interface.PopluateEvent): Implemented.
12050
12051         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
12052
12053 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
12054
12055         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
12056         but this is required to check for a method name being the same as
12057         the containing class.  
12058
12059         Handle this now.
12060
12061 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12062
12063         * interface.cs: initialize variable.
12064
12065 2002-07-23  Martin Baulig  <martin@gnome.org>
12066
12067         Implemented the IndexerName attribute in interfaces.
12068
12069         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
12070         name if this is an explicit interface implementation.
12071         (Indexer.InterfaceIndexerName): New public variable.  If we're
12072         implementing an interface indexer, this is the IndexerName in that
12073         interface.  Otherwise, it's the IndexerName.
12074         (Indexer.DefineMethod): If we're implementing interface indexer,
12075         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
12076         and Pending.ImplementIndexer methods.
12077         (Indexer.Define): Also define the PropertyBuilder if we're
12078         implementing an interface indexer and this is neither an explicit
12079         interface implementation nor do the IndexerName match the one in
12080         the interface.
12081
12082         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
12083         If a method is defined here, then we always need to create a proxy
12084         for it.  This is used when implementing interface indexers.
12085         (Pending.IsInterfaceIndexer): New public method.
12086         (Pending.ImplementIndexer): New public method.
12087         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
12088         This is used when implementing interface indexers to define a proxy
12089         if necessary.
12090         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
12091         define a proxy if necessary.
12092
12093         * interface.cs (Interface.IndexerName): New public variable.
12094         (Interface.PopulateIndexer): Set the IndexerName.
12095         (Interface.DefineIndexers): New private method.  Populate all the
12096         indexers and make sure their IndexerNames match.
12097
12098         * typemanager.cs (IndexerPropertyName): Added support for interface
12099         indexers.
12100
12101 2002-07-22  Martin Baulig  <martin@gnome.org>
12102
12103         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
12104         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
12105         ret if HasReturnLabel.
12106         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
12107         variables.
12108
12109         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
12110         and set the ec.LoopBeginTryCatchLevel.
12111         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
12112         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
12113         the current ec.TryCatchLevel, the branch goes out of an exception
12114         block.  In this case, we need to use Leave and not Br.
12115
12116 2002-07-22  Martin Baulig  <martin@gnome.org>
12117
12118         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
12119         block unless the block does not always return or it is contained in
12120         another try { ... } catch { ... } block.  Fixes bug #26506.
12121         Added verify-1.cs to the test suite.
12122
12123 2002-07-22  Martin Baulig  <martin@gnome.org>
12124
12125         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
12126         then we do not always return.  Fixes bug #24985.
12127
12128 2002-07-22  Martin Baulig  <martin@gnome.org>
12129
12130         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
12131         lookup on a per-class level; ie. walk up the class hierarchy until we
12132         found at least one applicable method, then choose the best among them.
12133         Fixes bug #24463 and test-29.cs.
12134
12135 2002-07-22  Martin Baulig  <martin@gnome.org>
12136
12137         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
12138         return types of the methods.  The return type is not part of the
12139         signature and we must not check it to make the `new' modifier work.
12140         Fixes bug #27999, also added test-147.cs.
12141         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
12142
12143         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
12144         on the method's return type.
12145
12146 2002-07-21  Martin Baulig  <martin@gnome.org>
12147
12148         * assign.cs: Make this work if the rightmost source is a constant and
12149         we need to do an implicit type conversion.  Also adding a few more tests
12150         to test-38.cs which should have caught this.
12151
12152         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
12153         target in the makefile for this.  The makefile.gnu is primarily intended
12154         for end-users who don't want to debug the compiler.
12155
12156 2002-07-21  Martin Baulig  <martin@gnome.org>
12157
12158         * assign.cs: Improved the Assign class so it can now handle embedded
12159         assignments (X = Y = Z = something).  As a side-effect this'll now also
12160         consume less local variables.  test-38.cs now passes with MCS, added
12161         a few new test cases to that test.
12162
12163 2002-07-20  Martin Baulig  <martin@gnome.org>
12164
12165         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
12166         instructions.  Fixes bug #27977, also added test-146.cs.
12167
12168 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12169
12170         * cs-tokenizer.cs: fixed getHex ().
12171
12172 2002-07-19  Martin Baulig  <martin@gnome.org>
12173
12174         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
12175         not Type.GetType() to lookup the array type.  This is needed when
12176         we're constructing an array of a user-defined type.
12177         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
12178         single-dimensional arrays, but also for single-dimensial arrays of
12179         type decimal.
12180
12181 2002-07-19  Martin Baulig  <martin@gnome.org>
12182
12183         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
12184         this function is called, it's not allowed to share LocalBuilders
12185         among ILGenerators.
12186
12187 2002-07-19  Martin Baulig  <martin@gnome.org>
12188
12189         * expression.cs (Argument.Resolve): Report an error 118 when trying
12190         to pass a type as argument.
12191
12192 2002-07-18  Martin Baulig  <martin@gnome.org>
12193
12194         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
12195         Conv_R_Un for the signed `long' type.
12196
12197 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
12198
12199         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
12200         `expr' for the temporary result, as that will fail if we do
12201         multiple resolves on the same expression.
12202
12203 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
12204
12205         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
12206         ec.TypeContainer for looking up aliases. 
12207
12208         * class.cs (TypeContainer): Remove LookupAlias from here.
12209
12210         * decl.cs (DeclSpace); Move here.
12211
12212 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
12213
12214         * class.cs (FindMembers): Only call filter if the constructor
12215         bulider is not null.
12216
12217         Also handle delegates in `NestedTypes' now.  Now we will perform
12218         type lookups using the standard resolution process.  This also
12219         fixes a bug.
12220
12221         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
12222         This uses Expressions (the limited kind that can be parsed by the
12223         tree) instead of strings.
12224
12225         * expression.cs (ComposedCast.ToString): Implement, used to flag
12226         errors since now we have to render expressions.
12227
12228         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
12229         FormArrayType. 
12230
12231         * ecore.cs (SimpleName.ToString): ditto.
12232
12233         * cs-parser.jay: Instead of using strings to assemble types, use
12234         Expressions to assemble the type (using SimpleName, ComposedCast,
12235         MemberAccess).  This should fix the type lookups in declarations,
12236         because we were using a different code path for this.
12237
12238         * statement.cs (Block.Resolve): Continue processing statements
12239         even when there is an error.
12240
12241 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
12242
12243         * class.cs (Event.Define): Also remove the `remove' method from
12244         the list of pending items.
12245
12246         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
12247         generate more compact code. 
12248
12249 2002-07-17  Martin Baulig  <martin@gnome.org>
12250
12251         * const.cs (Const.LookupConstantValue): Add support for constant
12252         `unchecked' and `checked' expressions.
12253         Also adding test case test-140.cs for this.
12254
12255 2002-07-17  Martin Baulig  <martin@gnome.org>
12256
12257         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
12258         check whether mi.ReturnType implements the IEnumerator interface; the
12259         `==' and the IsAssignableFrom() will fail in this situation.
12260
12261 2002-07-16  Ravi Pratap  <ravi@ximian.com>
12262
12263         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
12264         here too.
12265
12266 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12267
12268         * expression.cs: fixed bug #27811.
12269
12270 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
12271
12272         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
12273         Molaro: when we are a ref, the value already contains a pointer
12274         value, do not take the address of it.
12275
12276 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
12277         * removed mb-parser.jay and mb-tokenizer.cs
12278
12279 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
12280
12281         * expression.cs: check against the building corlib void type.
12282
12283 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
12284
12285         * ecore.cs: fix for valuetype static readonly fields: when 
12286         initializing them, we need their address, not the address of a copy.
12287
12288 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
12289
12290         * typemanager.cs: register also enum_type in corlib.
12291
12292 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
12293
12294         * class.cs: allow calling this (but not base) initializers in structs.
12295
12296 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
12297
12298         * ecore.cs: make sure we compare against the building base types
12299         in GetTypeSize ().
12300
12301 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
12302
12303         * typemanager.cs: fix TypeToCoreType() to handle void and object
12304         (corlib gets no more typerefs after this change).
12305
12306 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
12307
12308         * expression.cs (ArrayCreation.EmitArrayArguments): use
12309         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
12310
12311         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
12312         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
12313         array indexes, the runtime actually forbids them.
12314
12315         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
12316         for array arguments here.
12317
12318         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
12319         instead of the default for ValueTypes.
12320
12321         (New.DoEmit): Use IsValueType instead of
12322         IsSubclassOf (value_type)
12323         (New.DoResolve): ditto.
12324         (Invocation.EmitCall): ditto.
12325
12326         * assign.cs (Assign): ditto.
12327
12328         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
12329         Statements *are* currently doing part of their resolution during
12330         Emit.  
12331
12332         Expressions do always resolve during resolve, but statements are
12333         only required to propagate resolution to their children.
12334
12335 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
12336
12337         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
12338
12339         (LoadAssembly): Do not add the dll if it is already specified
12340
12341         (MainDriver): Add the System directory to the link path at the end,
12342         after all the other -L arguments. 
12343
12344         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
12345         wrong opcode for loading bytes and bools (ldelem.i1 instead of
12346         ldelem.u1) and using the opposite for sbytes.
12347
12348         This fixes Digger, and we can finally run it.
12349
12350         * driver.cs (UnixParseOption): Move the option parsing here.  
12351         (CSCParseOption): Implement CSC-like parsing of options.
12352
12353         We now support both modes of operation, the old Unix way, and the
12354         new CSC-like way.  This should help those who wanted to make cross
12355         platform makefiles.
12356
12357         The only thing broken is that /r:, /reference: and /lib: are not
12358         implemented, because I want to make those have the same semantics
12359         as the CSC compiler has, and kill once and for all the confussion
12360         around this.   Will be doing this tomorrow.
12361
12362         * statement.cs (Unsafe.Resolve): The state is checked during
12363         resolve, not emit, so we have to set the flags for IsUnsfe here.
12364
12365 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
12366
12367         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
12368         not catch the Error_ObjectRefRequired in SimpleName (as it is
12369         possible to have a class/instance variable name that later gets
12370         deambiguated), we have to check this here.      
12371
12372 2002-07-10  Ravi Pratap  <ravi@ximian.com>
12373
12374         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
12375         make static and put into Expression.
12376
12377         (Event.Define): Register the private field of the event with the 
12378         TypeManager so that GetFieldFromEvent can get at it.
12379
12380         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
12381         keep track of the private field associated with an event which
12382         has no accessors.
12383
12384         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
12385         private field.
12386
12387         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
12388
12389 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
12390
12391         * expression.cs (Binary.EmitBranchable): this routine emits the
12392         Binary expression in a branchable context.  This basically means:
12393         we need to branch somewhere, not just get the value on the stack.
12394
12395         This works together with Statement.EmitBoolExpression.
12396
12397         * statement.cs (Statement.EmitBoolExpression): Use
12398         EmitBranchable. 
12399
12400 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
12401
12402         * statement.cs (For): Reduce the number of jumps in loops.
12403
12404         (For): Implement loop inversion for the For statement.
12405
12406         (Break): We can be breaking out of a Try/Catch controlled section
12407         (foreach might have an implicit try/catch clause), so we need to
12408         use Leave instead of Br.
12409
12410         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
12411         now).  If the instace expression supports IMemoryLocation, we use
12412         the AddressOf method from the IMemoryLocation to extract the
12413         address instead of emitting the instance.
12414
12415         This showed up with `This', as we were emitting the instance
12416         always (Emit) instead of the Address of This.  Particularly
12417         interesting when This is a value type, as we dont want the Emit
12418         effect (which was to load the object).
12419
12420 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
12421
12422         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
12423
12424         * statement.cs (Checked): Set the CheckedState during the resolve
12425         process too, as the ConvCast operations track the checked state on
12426         the resolve process, and not emit.
12427
12428         * cs-parser.jay (namespace_member_declaration): Flag that we have
12429         found a declaration when we do.  This is used to flag error 1529
12430
12431         * driver.cs: Report ok when we display the help only.
12432
12433 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
12434
12435         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
12436
12437 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
12438
12439         * cs-tokenizer.cs (define): We also have to track locally the
12440         defines.  AllDefines is just used for the Conditional Attribute,
12441         but we also need the local defines for the current source code. 
12442
12443 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
12444
12445         * statement.cs (While, For, Do): These loops can exit through a
12446         Break statement, use this information to tell whether the
12447         statement is the last piece of code.
12448
12449         (Break): Flag that we break.
12450
12451         * codegen.cs (EmitContexts): New `Breaks' state variable.
12452
12453 2002-07-03  Martin Baulig  <martin@gnome.org>
12454
12455         * class.cs (TypeContainer.MethodModifiersValid): Allow override
12456         modifiers in method declarations in structs.  Otherwise, you won't
12457         be able to override things like Object.Equals().
12458
12459 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
12460
12461         * class.cs (Method, Property, Indexer): Do not allow the public
12462         modifier to be used in explicit interface implementations.
12463
12464         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
12465         override modifiers in method declarations in structs
12466
12467 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
12468
12469         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
12470         integer or real overflow, report an error
12471
12472 2002-07-02  Martin Baulig  <martin@gnome.org>
12473
12474         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
12475         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
12476         to tell the runtime about our newly created System.Object and
12477         System.ValueType types.
12478
12479 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
12480
12481         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
12482         struct instead of Ldarg/Starg.
12483
12484 2002-07-02  Martin Baulig  <martin@gnome.org>
12485
12486         * expression.cs (Indirection.Indirection): Call
12487         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
12488
12489 2002-07-02  Martin Baulig  <martin@gnome.org>
12490
12491         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
12492         ValueType, call TypeManager.TypeToCoreType() on it.
12493         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
12494         the OpCodes.Newarr argument.
12495
12496 2002-07-02  Martin Baulig  <martin@gnome.org>
12497
12498         * expression.cs (Invocation.EmitCall): When compiling corlib,
12499         replace all calls to the system's System.Array type to calls to
12500         the newly created one.
12501
12502         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
12503         System.Array methods.
12504         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
12505         from the system's System.Array type which must be replaced.
12506
12507 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
12508
12509         * typemanager.cs: load unverifiable_code_ctor so we can build
12510         corlib using the correct type. Avoid using GetTypeCode() with
12511         TypeBuilders.
12512         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
12513         TypeManager.object_type to allow building corlib.
12514
12515 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
12516
12517         * ecore.cs: handle System.Enum separately in LoadFromPtr().
12518
12519 2002-07-01  Martin Baulig  <martin@gnome.org>
12520
12521         * class.cs: Make the last change actually work, we need to check
12522         whether `ifaces != null' to avoid a crash.
12523
12524 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
12525
12526         * class.cs: when we build structs without fields that implement
12527         interfaces, we need to add the interfaces separately, since there is
12528         no API to both set the size and add the interfaces at type creation
12529         time.
12530
12531 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
12532
12533         * expression.cs: the dimension arguments to the array constructors
12534         need to be converted if they are a long.
12535
12536 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
12537
12538         * class.cs: don't emit ldarg.0 if there is no parent constructor
12539         (fixes showstopper for corlib).
12540
12541 2002-06-29  Martin Baulig  <martin@gnome.org>
12542
12543         MCS now compiles corlib on GNU/Linux :-)
12544
12545         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
12546         ie. check for MethodImplOptions.InternalCall.
12547
12548         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
12549         and TypeManager.attribute_type are null, so we must explicitly check
12550         whether parent is not null to find out whether it's an attribute type.
12551         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
12552         and SetBuilder, not only if the property is neither abstract nor external.
12553         This is necessary to set the MethodImplOptions on the accessor methods.
12554         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
12555         SetBuilder, see Property.Emit().
12556
12557         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
12558         populate "System.Object", "System.ValueType" and "System.Attribute" since
12559         they've already been populated from BootCorlib_PopulateCoreTypes().
12560
12561 2002-06-29  Martin Baulig  <martin@gnome.org>
12562
12563         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
12564         is the NullLiteral, we also need to make sure that target_type is not
12565         an enum type.   
12566
12567 2002-06-29  Martin Baulig  <martin@gnome.org>
12568
12569         * rootcontext.cs (RootContext.ResolveCore): We must initialize
12570         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
12571         before calling BootstrapCorlib_ResolveDelegate ().
12572
12573 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12574
12575         * statement.cs: fixed build-breaker. All tests passed ok.
12576
12577 2002-06-27  Martin Baulig  <martin@gnome.org>
12578
12579         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
12580         for System.Decimal when compiling corlib.
12581
12582 2002-06-27  Martin Baulig  <martin@gnome.org>
12583
12584         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
12585         switch blocks which contain nothing but a default clause.
12586
12587 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
12588
12589        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
12590
12591 2002-06-27  Martin Baulig  <martin@gnome.org>
12592
12593         * ecore.cs (PropertyExpr.PropertyExpr): Call
12594         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
12595
12596         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
12597         is already a TypeBuilder.
12598
12599 2002-06-27  Martin Baulig  <martin@gnome.org>
12600
12601         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
12602         `target_type == TypeManager.array_type', not IsAssignableFrom() in
12603         the "from an array-type to System.Array" case.  This makes it work
12604         when compiling corlib.
12605
12606 2002-06-27  Martin Baulig  <martin@gnome.org>
12607
12608         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
12609         non-static PropertyExpr, set its InstanceExpression.  This makes
12610         the `ICollection.Count' property work in System/Array.cs.
12611
12612 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
12613
12614         * driver.cs: Made error handling more consistent.  Errors now
12615         tracked by Report class, so many methods which used to return int
12616         now return void.  Main() now prints success/failure and 
12617         errors/warnings message.
12618
12619         Renamed '--probe' compiler argument to '--expect-error'.  Removed
12620         the magic number return values (123 and 124).  Now, if the
12621         expected error occurs, the compiler exits with success (exit value
12622         0).  If the compilation completes without seeing that particular
12623         error, the compiler exits with failure (exit value 1).  The
12624         makefile in mcs/errors has been changed to handle the new behaviour.
12625
12626         * report.cs: Made 'expected error' number a property and renamed
12627         it from 'Probe' to 'ExpectedError'.
12628
12629         * genericparser.cs: Removed error handling support, since it is
12630         now all done by Report class.
12631
12632         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
12633         class, so parse() no longer returns an int.
12634
12635         * namespace.cs: Use Report.Error instead of GenericParser.error
12636
12637 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
12638
12639         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
12640         TypeContainer.AddOperator): At the front of the list put the
12641         explicit implementations, so they get resolved/defined first. 
12642
12643 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
12644
12645         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
12646         interface type is implemented by this TypeContainer.  Used during
12647         explicit interface implementation.
12648
12649         (Property.Define, Indexer.Define, Method.Define): Validate that
12650         the given interface in the explicit implementation is one of the
12651         base classes for the containing type.
12652
12653         Also if we are explicitly implementing an interface, but there is
12654         no match in the pending implementation table, report an error.
12655
12656         (Property.Define): Only define the property if we are
12657         not explicitly implementing a property from an interface.  Use the
12658         correct name also for those properties (the same CSC uses,
12659         although that is really not needed).
12660
12661         (Property.Emit): Do not emit attributes for explicitly implemented
12662         properties, as there is no TypeBuilder.
12663
12664         (Indexer.Emit): ditto.
12665
12666         Hiding then means that we do not really *implement* a pending
12667         implementation, which makes code fail.
12668
12669 2002-06-22  Martin Baulig  <martin@gnome.org>
12670
12671         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
12672         the return value of Object.GetType().  [FIXME: we need to do this whenever
12673         we get a type back from the reflection library].
12674
12675 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
12676
12677         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
12678
12679 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
12680
12681         * attribute.cs: Return null if we can not look up the type.
12682
12683         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
12684         the interface types found.
12685
12686         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
12687         interface types found.
12688
12689         * typemanager.cs (GetInterfaces): Make this routine returns alll
12690         the interfaces and work around the lame differences between
12691         System.Type and System.Reflection.Emit.TypeBuilder in the results
12692         result for GetInterfaces.
12693
12694         (ExpandInterfaces): Given an array of interface types, expand and
12695         eliminate repeated ocurrences of an interface.  This expands in
12696         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
12697         be IA, IB, IC.
12698
12699 2002-06-21  Martin Baulig  <martin@gnome.org>
12700
12701         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
12702         on System.Enum.
12703
12704 2002-06-21  Martin Baulig  <martin@gnome.org>
12705
12706         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
12707         and called with one of the core types, return the corresponding typebuilder for
12708         that type.
12709
12710         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
12711         element type.
12712
12713 2002-06-21  Martin Baulig  <martin@gnome.org>
12714
12715         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
12716         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
12717         (Expression.ConvertReferenceExplicit): Likewise.
12718
12719         * expression.cs (ElementAccess.DoResolve): Likewise.
12720         (ElementAccess.DoResolveLValue): Likewise.
12721
12722 2002-06-10  Martin Baulig  <martin@gnome.org>
12723
12724         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
12725         add the "value" parameter to the parameter list.
12726
12727         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
12728         to our caller.
12729
12730 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
12731
12732         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
12733         the argument to an int, uint, long or ulong, per the spec.  Also
12734         catch negative constants in array creation.
12735
12736 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
12737
12738         * class.cs: do not allow the same interface to appear twice in
12739         the definition list.
12740
12741 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
12742
12743         * ecore.cs: don't use ldlen with System.Array.
12744
12745 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
12746
12747         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
12748
12749 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
12750
12751         * modifiers.cs: produce correct field attributes for protected
12752         internal. Easy fix so miguel can work on ther harder stuff:-)
12753
12754 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
12755
12756         * pending.cs: New file.  Move the code from class.cs here.
12757         Support clearning the pending flag for all methods (when not doing
12758         explicit interface implementation).
12759
12760 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
12761
12762         * rootcontext.cs: added a couple more types needed to bootstrap.
12763
12764 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
12765
12766         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
12767         constructor in the type, instead of any constructor in the type
12768         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
12769         a bug in the Mono runtime when applying the params attribute). 
12770
12771 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
12772         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
12773
12774 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
12775
12776         * expression.cs (Unary.ResolveOperator): Use TypeManager
12777         to resolve the type.
12778
12779 2002-06-13  Ravi Pratap  <ravi@ximian.com>
12780
12781         * cs-parser.jay (enum_member_declaration): Pass in the attributes
12782         attached.
12783
12784         * enum.cs (AddEnumMember): Add support to store the attributes associated 
12785         with each member too.
12786
12787         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
12788         field builders too - this takes care of the enum member case.
12789
12790 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
12791
12792         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
12793         address-of operator on both value types and pointers.
12794
12795 2002-06-10  Martin Baulig  <martin@gnome.org>
12796
12797         * interface.cs (Interface.PopulateIndexer): Add the indexer's
12798         PropertyBuilder to the `property_builders' list.
12799
12800         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
12801         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
12802         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
12803         find any indexers which are inherited from an interface.
12804
12805 2002-06-09  Martin Baulig  <martin@gnome.org>
12806
12807         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
12808         the same type as the constant if necessary.  There's also a test-130.cs
12809         for this.
12810
12811         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
12812
12813         * typemanager.cs (TypeManager.ChangeType): Previously known as
12814         Enum.ChangeEnumType().
12815
12816 2002-06-09  Martin Baulig  <martin@gnome.org>
12817
12818         * expression.cs (Cast.TryReduce): Added support for consts.
12819
12820 2002-06-08  Ravi Pratap  <ravi@ximian.com>
12821
12822         * class.cs (Accessor): Hold attributes information so we can pass
12823         it along.
12824
12825         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
12826         Modify to pass in attributes attached to the methods.
12827
12828         (add_accessor_declaration, remove_accessor_declaration): Ditto.
12829
12830         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
12831         to handle the Accessor kind :-)
12832
12833         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
12834
12835 2002-06-08  Martin Baulig  <martin@gnome.org>
12836
12837         * expression.cs (Unary.TryReduceNegative): Added support for
12838         ULongConstants.
12839
12840 2002-06-08  Martin Baulig  <martin@gnome.org>
12841
12842         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
12843         name can't be found in the `defined_names' - the caller will do a
12844         MemberLookup in this case and thus find methods in System.Enum
12845         such as Enum.IsDefined().
12846
12847 2002-06-08  Martin Baulig  <martin@gnome.org>
12848
12849         * enum.cs (Enum.ChangeEnumType): This is a custom version of
12850         Convert.ChangeType() which works with TypeBuilder created types.
12851         (Enum.LookupEnumValue, Enum.Define): Use it here.
12852
12853         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
12854         `TypeBuilder.BaseType != null' check.
12855         (TypeContainer.FindMembers): Only lookup parent members if we
12856         actually have a parent.
12857         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
12858         (ConstructorInitializer.Resolve): Likewise.
12859
12860         * interface.cs (Interface.FindMembers): Added
12861         `TypeBuilder.BaseType != null' check.
12862
12863         * rootcontext.cs (RootContext.ResolveCore): Added
12864         "System.Runtime.CompilerServices.IndexerNameAttribute" to
12865         classes_second_stage.
12866
12867         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
12868         debug_type and trace_type when compiling with --nostdlib.       
12869
12870 2002-06-07  Martin Baulig  <martin@gnome.org>
12871
12872         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
12873         (AddField): Set it to true when adding a non-static field.
12874         (DefineType): Use `have_nonstatic_fields' to find out whether we
12875         have non-static fields, not `Fields != null'.
12876
12877 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
12878
12879         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
12880         dereferencing a null on the static-field code path)
12881
12882 2002-05-30  Martin Baulig  <martin@gnome.org>
12883
12884         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
12885         to take command line arguments.  Use reflection to call the new
12886         custom `Initialize' function on the symbol writer and pass it the
12887         command line arguments.
12888
12889         * driver.cs (--debug-args): New command line argument to pass command
12890         line arguments to the symbol writer.
12891
12892 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
12893
12894         * assign.cs (DoResolve): Forgot to do the implicit conversion to
12895         the target type for indexers and properties.  Thanks to Joe for
12896         catching this.
12897
12898 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
12899
12900         * typemanager.cs (MethodFlags): returns the method flags
12901         (Obsolete/ShouldIgnore) that control warning emission and whether
12902         the invocation should be made, or ignored. 
12903
12904         * expression.cs (Invocation.Emit): Remove previous hack, we should
12905         not do this on matching a base type, we should do this based on an attribute
12906
12907         Only emit calls to System.Diagnostics.Debug and
12908         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
12909         on the command line.
12910
12911         * rootcontext.cs: Global settings for tracing and debugging.
12912
12913         * cs-tokenizer.cs (define): New utility function to track
12914         defines.   Set the global settings for TRACE and DEBUG if found.
12915
12916 2002-05-25  Ravi Pratap  <ravi@ximian.com>
12917
12918         * interface.cs (Populate*): Pass in the TypeContainer as well as
12919         the DeclSpace as parameters so that we can create EmitContexts and
12920         then use that to apply attributes etc.
12921
12922         (PopulateMethod, PopulateEvent, PopulateProperty)
12923         (PopulateIndexer): Apply attributes everywhere.
12924
12925         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
12926         etc.
12927
12928         (ApplyAttributes): Update accordingly.
12929
12930         We now apply interface attributes for all members too.
12931
12932 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
12933
12934         * class.cs (Indexer.Define); Correctly check if we are explicit
12935         implementation (instead of checking the Name for a ".", we
12936         directly look up if the InterfaceType was specified).
12937
12938         Delay the creation of the PropertyBuilder.
12939
12940         Only create the PropertyBuilder if we are not an explicit
12941         interface implementation.   This means that explicit interface
12942         implementation members do not participate in regular function
12943         lookups, and hence fixes another major ambiguity problem in
12944         overload resolution (that was the visible effect).
12945
12946         (DefineMethod): Return whether we are doing an interface
12947         implementation. 
12948
12949         * typemanager.cs: Temporary hack until we get attributes in
12950         interfaces (Ravi is working on that) and we get IndexerName
12951         support in interfaces.
12952
12953         * interface.cs: Register the indexers as properties.
12954
12955         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
12956         warning, I have verified that this is a bug in the .NET runtime
12957         (JavaScript suffers of the same problem).
12958
12959         * typemanager.cs (MemberLookup): When looking up members for
12960         interfaces, the parent of an interface is the implicit
12961         System.Object (so we succeed in searches of Object methods in an
12962         interface method invocation.  Example:  IEnumerable x;  x.ToString
12963         ()) 
12964
12965 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
12966
12967         * class.cs (Event): Events should also register if they do
12968         implement the methods that an interface requires.
12969
12970         * typemanager.cs (MemberLookup); use the new GetInterfaces
12971         method. 
12972
12973         (GetInterfaces): The code used to lookup interfaces for a type is
12974         used in more than one place, factor it here. 
12975
12976         * driver.cs: Track the errors at the bottom of the file, we kept
12977         on going.
12978
12979         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
12980         instance if the method we are calling is static!
12981
12982 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
12983
12984         * attribute.cs (ApplyAttributes): Make this function filter out
12985         the IndexerName attribute (as that attribute in reality is never
12986         applied) and return the string constant for the IndexerName
12987         attribute. 
12988
12989         * class.cs (TypeContainer.Emit): Validate that all the indexers
12990         have the same IndexerName attribute, and if so, set the
12991         DefaultName attribute on the class. 
12992
12993         * typemanager.cs: The return value might contain other stuff (not
12994         only methods).  For instance, consider a method with an "Item"
12995         property and an Item method.
12996
12997         * class.cs: If there is a problem with the parameter types,
12998         return. 
12999
13000 2002-05-24  Ravi Pratap  <ravi@ximian.com>
13001
13002         * ecore.cs (ImplicitConversionExists): Wrapper function which also
13003         looks at user defined conversion after making a call to 
13004         StandardConversionExists - we need this for overload resolution.
13005
13006         * expression.cs : Update accordingly the various method calls.
13007
13008         This fixes 2 bugs filed against implicit user defined conversions 
13009
13010 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
13011
13012         * statement.cs: Track the result of the assignment.
13013
13014 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
13015
13016         * expression.cs (MemberAccess): Improved error reporting for
13017         inaccessible members.
13018
13019 2002-05-22  Martin Baulig  <martin@gnome.org>
13020
13021         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
13022         itself with debugging support.
13023
13024 2002-05-22  Martin Baulig  <martin@gnome.org>
13025
13026         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
13027         Removed, this isn't needed anymore.
13028
13029 2002-05-20  Martin Baulig  <martin@gnome.org>
13030
13031         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
13032         be underlying type for an enum.
13033
13034 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
13035
13036         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
13037         that splits out the loading of just the core types.
13038
13039         * rootcontext.cs (ResolveCore): Split the struct resolution in
13040         two, so we can load the enumeration underlying types before any
13041         enums are used.
13042
13043         * expression.cs (Is): Bandaid until we fix properly Switch (see
13044         bug #24985 for details).
13045
13046         * typemanager.cs (ImplementsInterface): The hashtable will contain
13047         a null if there are no interfaces implemented.
13048
13049 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
13050
13051         * cs-parser.jay (indexer_declarator): It is fine to have array
13052         parameters
13053
13054 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
13055
13056         * typemanager.cs: (RegisterBuilder): New function used to register
13057         TypeBuilders that implement interfaces.  Since
13058         TypeBuilder.GetInterfaces (as usual) does not work with lame
13059         Reflection.Emit. 
13060         (AddUserType): register interfaces.
13061
13062         (ImplementsInterface): Use the builder_to_ifaces hash if we are
13063         dealing with TypeBuilder.  Also, arrays are showing up as
13064         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
13065         methods can not be invoked on them!
13066
13067         * ecore.cs (ExplicitReferenceConversionExists): Made public.
13068         (ImplicitReferenceConversionExists): Split out from
13069         StandardConversionExists. 
13070
13071         * expression.cs (As): We were only implementing one of the three
13072         cases for the as operator.  We now implement them all.
13073         (Is): Implement the various other cases for Is as well.
13074
13075         * typemanager.cs (CACHE): New define used to control if we want or
13076         not the FindMembers cache.  Seems to have a negative impact on
13077         performance currently
13078
13079         (MemberLookup): Nested types have full acess to
13080         enclosing type members
13081
13082         Remove code that coped with instance/static returns for events, we
13083         now catch this in RealFindMembers.
13084
13085         (RealFindMembers): only perform static lookup if the instance
13086         lookup did not return a type or an event.  
13087
13088 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
13089
13090         * assign.cs (CompoundAssign): We pass more semantic information
13091         now to Compound Assignments than we did before: now we have all
13092         the information at hand, and now we resolve the target *before* we
13093         do the expression expansion, which allows the "CacheValue" method
13094         to have the effect we intended (before, a [x] += 1 would generate
13095         two differen ArrayAccess expressions from the ElementAccess,
13096         during the resolution process).
13097
13098         (CompoundAssign.DoResolve): Resolve target and original_source here.
13099
13100 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
13101
13102         * expression.cs (ArrayAccess): dropped debugging information. 
13103
13104         * typemanager.cs: Small bug fix: I was always returning i_members,
13105         instead of one of i_members or s_members (depending on which had
13106         the content).
13107
13108         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
13109         method is invoked before any code generation takes place, and it
13110         is a mechanism to inform that the expression will be invoked more
13111         than once, and that the method should use temporary values to
13112         avoid having side effects
13113
13114         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
13115
13116         * ecore.cs (Expression.CacheTemporaries): Provide empty default
13117         implementation.
13118
13119         * expression.cs (Indirection, ArrayAccess): Add support for
13120         CacheTemporaries in these two bad boys. 
13121
13122         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
13123         ldobj or ldind_ref.  
13124         (StoreFromPtr): Handle stobj as well.
13125
13126         * expression.cs (UnaryMutator): Share more code.
13127
13128         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
13129         down: I was not tracking the Filter function as well, which
13130         was affecting the results of the cache.
13131
13132 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
13133
13134         * attribute.cs: Remove the hack to handle the CharSet property on
13135         StructLayouts. 
13136
13137 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
13138
13139         * attribute.cs (DoResolve): More uglyness, we now only try to
13140         resolve the attribute partially, to extract the CharSet
13141         information (only if we are a StructLayout attribute).  Otherwise 
13142
13143         (GetExtraTypeInfo): Add some code to conditionally kill in the
13144         future this.   I am more and more convinced that the .NET
13145         framework has special code to handle the attribute setting on
13146         certain elements.
13147
13148         * expression.cs (IsParamsMethodApplicable): Revert my previous
13149         foreach change here, it was wrong.
13150
13151 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
13152
13153         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
13154         (pp_expr): do not abort on unknown input, just return.
13155         (eval): abort if there are pending chars.
13156
13157         * attribute.cs (Attribute.Resolve): Positional parameters are
13158         optional.  Deal with that case.
13159
13160         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
13161         the Ansi/Unicode/Auto information for the type.
13162
13163         (TypeContainer.DefineType): instantiate the EmitContext here, as
13164         we will be using it during the type definition (to resolve
13165         attributes) and during the emit phase.
13166
13167         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
13168         to pull type information out of the attributes
13169
13170         (Attribute.Resolve): track the constructor builder, and allow for
13171         multiple invocations (structs and classes will use this).
13172
13173         * ecore.cs (MemberLookupFinal): new version with all the
13174         parameters customizable.
13175
13176         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
13177         constructors.  Return if the result value is null (as the error
13178         would have been flagged already by MemberLookupFinal)
13179
13180         Do not allow instances of abstract classes or interfaces to be
13181         created.
13182
13183         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
13184         We have to compare the assembly property here when dealing with
13185         FamANDAssem and Assembly access modifiers, because we might be
13186         creating an assembly from *modules* (that means that we are not
13187         getting TypeBuilders for types defined in other modules that are
13188         part of this assembly).
13189
13190         (Method.Emit): If the method is marked abstract and has a body,
13191         emit an error. 
13192
13193         (TypeContainer.DefineMembers): If both the defined member and the
13194         parent name match are methods, then do not emit any warnings: let
13195         the Method.Define routine take care of flagging warnings.  But if
13196         there is a mismatch (method overrides something else, or method is
13197         overriwritten by something, then emit warning).
13198
13199         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
13200         set to null, this means `do not check for the return type on the
13201         signature'. 
13202
13203         (Method.Define): set the return type for the method signature to
13204         null, so that we get methods with the same name and parameters and
13205         different return types.  This is used to flag warning 114 (you are
13206         hiding a method, and you probably want to use the new/override
13207         keywords instead).
13208
13209         * typemanager.cs (MemberLookup): Implemented proper access
13210         control, closing a long standing set of bug reports.  The problem
13211         was that the Framework only has two bits: Public and NonPublic,
13212         and NonPublic includes private and protected methods, but we need
13213         to enforce the FamANDAssem, FamOrAssem and Family. 
13214
13215 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
13216
13217         * statement.cs (GotoCase): Return true: Ammounts to giving up
13218         knowledge on whether we return or not, and letting the other case
13219         be responsible for it.
13220
13221 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
13222
13223         * driver.cs: Do not load directories for each file processed, only
13224         do it if there is a pattern.
13225
13226         * ecore.cs: Report readonly assigns here as well, as we might have
13227         been resolved only by MemberAccess.
13228
13229         (SimpleName.SimpleNameResolve): Also be useful for LValue
13230         resolution.   We need this to propagate assign to local readonly variables
13231
13232         * typemanager.cs: Use a ptrhashtable for the criteria, because we
13233         do not want to reuse potential criteria memory.
13234
13235         * class.cs (MyEventBuilder): Set reflected_type;
13236
13237         * ecore.cs (Constantify): Added support for constifying bools.
13238
13239         (RootContext.LookupType): Added a cache for values looked up in
13240         the declaration space.
13241
13242         * typemanager.cs (FindMembers): Now is a front-end to
13243         RealFindMembers, and provides a two-level hashtable-based cache to
13244         the request.  
13245
13246         15% performance improvement: from 22.5 to 19.2 seconds.
13247
13248         * expression.cs (IsParamsMethodApplicable): use foreach.
13249         (Invocation.DoResolve): ditto.
13250         (New.DoResolve): ditto.
13251         (ArrayCreation.DoResolve): ditto.
13252
13253         * ecore.cs (FindMostEncompassingType): use foreach.
13254
13255         * delegate.cs (NewDelegate.DoResolve): Use foreach
13256
13257         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
13258         (RemoveMethods): use foreach.
13259
13260         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
13261         nested foreach statements instead of for, and also break out of
13262         the inner loop once a match is found.
13263
13264         (Invocation.OverloadResolve): Use foreach, simplify the code. 
13265
13266 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
13267
13268         * cfold.cs (BinaryFold): During an enumeration evaluation context,
13269         we actually unwrap the expression to allow for extra information
13270         to be extracted. 
13271
13272         * expression.cs: Use Shr_Un on unsigned operations. 
13273
13274 2002-05-08  Ravi Pratap  <ravi@ximian.com>
13275
13276         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
13277         applicable operators was not being considered correctly. This closes
13278         the bug Miguel reported.
13279
13280 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
13281
13282         * attribute.cs: check that the type derives from System.Attribute
13283         and report the correct error in that case (moved the duplicate code to
13284         its own method, too).
13285
13286 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
13287
13288         * attribute.cs: lookup attribute type name as the spec says: first the
13289         bare attribute name and then name + "Attribute" (nant compiles with
13290         mcs after this fix).
13291
13292 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
13293
13294         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
13295         Because of the way we parse things, we should try to see if a
13296         UIntConstant can fit in an integer.
13297
13298 2002-05-07  Ravi Pratap  <ravi@ximian.com>
13299
13300         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
13301         when we are in an explicit context.
13302
13303         (ConvertReferenceExplicit): When converting from Iface type S to Class
13304         T make sure the rules are implemented as an OR.
13305
13306         * parameter.cs (ParameterType): Make it a property for now although the
13307         purpose really isn't anything immediate.
13308
13309         * expression.cs (Is*Applicable): Do better checking on the parameter type
13310         of a ref/out parameter. The ones from the system assemblies are already 
13311         marked with the correct type so we don't need to do any correction.
13312
13313         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
13314         the object type is standard too so include that.
13315
13316 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13317
13318         * ecore.cs (StandardConversionExists): Augment with missing code:
13319         deal with IntConstant, LongConstants and Enumerations.
13320
13321         * assign.cs: Report the error, instead of failing silently
13322
13323         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
13324         typecontainer that they are declared, because the
13325         typecontainer/namespace will have the list of using clauses that
13326         need to be applied.
13327
13328         Assembly Attributes were escaping the normal registration
13329         mechanism. 
13330
13331         (EmitCode): Apply attributes within an EmitContext that represents
13332         the container they were declared on.
13333
13334         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
13335
13336 2002-05-06  Ravi Pratap  <ravi@ximian.com>
13337
13338         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
13339         Revamp completely - make much cleaner as we now operate only
13340         on a set of Types.
13341
13342         (FindMostSpecificSource, FindMostSpecificTarget): New methods
13343         to implement the logic detailed in the spec more correctly.
13344
13345         (UserDefinedConversion): Update accordingly.
13346
13347 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13348
13349         * statement.cs: Return flow analysis information up.
13350
13351         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
13352         and the default.
13353
13354         (token): Do not consume an extra character before calling
13355         decimal_digits.
13356
13357 2002-05-06  Piers Haken <piersh@friskit.com>
13358
13359         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
13360
13361 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13362
13363         * class.cs (Constructor.Emit): Set the IsStatic flag in the
13364         EmitContext during the instance constructor initializer
13365         resolution, to stop access to instance variables.
13366
13367         This is mandated by the spec, last paragraph of the `constructor
13368         initializers' section. 
13369
13370 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
13371
13372         * cs-parser.jay, class.cs (Accessor): new class used to represent
13373         an accessor (get or set).  In the past we used `null' to represent
13374         a missing accessor.  But this is ambiguous because there was no
13375         way to tell in abstract indexers/properties if one of them was
13376         specified.
13377
13378         Now there is a way of addressing that.
13379
13380         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
13381         instead of FindMembers.
13382
13383         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
13384         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
13385
13386         * attribute.cs: Treat indexers and properties as the same in terms
13387         of applying attributes
13388
13389         * ecore.cs (FindMostEncompassedType): Use statically initialized
13390         EmptyExpressions()s like we do elsewhere to avoid creating useless
13391         objects (and we take this out of the tight loop).
13392
13393         (GetConversionOperators): Move the code to extract the actual
13394         operators to a separate routine to clean things up.
13395
13396 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
13397
13398         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
13399         events are always registered FieldBuilders.
13400
13401         * class.cs (FieldBase): New class shared by Fields 
13402
13403         * delegate.cs: If we are a toplevel delegate, use our full name.
13404         If we are a nested delegate, then only use our tail name.
13405
13406 2002-05-02  Ravi Pratap  <ravi@ximian.com>
13407
13408         * expression.cs (IsApplicable): Ensure that we add the "&" to
13409         ref/out types before comparing it with the type of the argument.
13410
13411         (IsParamsMethodApplicable): Ditto.
13412
13413         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
13414         silly me ;-)
13415
13416         * delegate.cs : Handle the case when we have more than one applicable
13417         method. Flag an error only when we finish checking all.
13418
13419 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
13420
13421         * expression.cs: Add support for boolean static initializers.
13422
13423 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
13424
13425         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
13426
13427         * parameter.cs (ComputeParameterTypes,
13428         ComputeAndDefineParameterTypes): Better error handling: now we
13429         clear the `types' cache if we fail during any of the type lookups.
13430         We also return the status code correctly to our caller
13431
13432         * delegate.cs: If we fail to define a delegate, abort the extra
13433         steps. 
13434
13435         * expression.cs (Binary.ResolveOperator): for
13436         operator==(object,object) and operator !=(object, object) we also
13437         have to verify that there is an implicit conversion from one to
13438         the other.
13439
13440         (ArrayAccess.DoResolve): Array Access can operate on
13441         non-variables. 
13442
13443 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
13444
13445         * assign.cs (CompoundAssign): A new class used as a "flag" that
13446         the assignment actually is happening as part of a compound
13447         assignment operator.
13448
13449         During compound assignment, a few new rules exist to enable things
13450         like:
13451
13452         byte b |= 1 + 2
13453
13454         From the spec:
13455
13456         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
13457         to the type of x) if y is implicitly convertible to the type of x,
13458         and the operator is a builtin operator and the return type of the
13459         operator is explicitly convertible to the type of x. 
13460
13461         * rootcontext.cs: Reset warning level to 2.  4 catches various
13462         "interesting" features in mcs, we must clean this up at some
13463         point, but currently am trying to kill other bugs ;-)
13464
13465         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
13466         in container classes as well.  
13467
13468         * expression.cs (Binary.ResolveOperator): Handle string case
13469         before anything else (as operator overloading does emit an error
13470         before doing anything else).
13471
13472         This code could go away when we move to a table driven model, but
13473         i could not come up with a good plan last night.
13474
13475 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
13476
13477         * typemanager.cs (CSharpName): reimplementation using regex.
13478         * class.cs: added null check for fields in Emit
13479         * rootcontext.cs: set warninglevel to 4
13480
13481 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
13482
13483         * typemanager.cs (CSharpName): reimplemented with Lupus
13484         suggestion.
13485
13486 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
13487
13488         * statement.cs (If): correclty implement Resolve, because we were
13489         not catching sem errors in there.  The same process is needed
13490         everywhere else. 
13491         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
13492
13493
13494         (Statement.Warning_DeadCodeFound): Factorize code.
13495         (While): Report dead code here too.
13496
13497         (Statement): Added Resolve virtual method to allow
13498         for resolution split from the emit code.
13499
13500 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
13501
13502         * statement.cs (EmitBoolExpression): No longer try to resolve the
13503         expression here.    
13504         (MakeBoolean): New utility function that resolve, implicitly
13505         converts to boolean and tags the expression. 
13506
13507
13508         (If, Do): Implement dead code elimination.
13509         (While): Implement loop inversion
13510
13511         (Do, While, For, If): Resolve the expression prior to calling our
13512         code generation.
13513
13514 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
13515
13516         * class.cs:
13517           - added method Report28 (warning: program has more than one entry point)
13518           - added method IsEntryPoint, implements paragraph 10.1 of the spec
13519           - modified method Method.Define, the part at the end of the method
13520
13521         * rootcontext.cs: added static public Location EntryPointLocation;
13522           
13523         * ../errors/cs0028.cs : Add test case for the above warning.              
13524
13525         * typemanager.cs:
13526           - modified method CSharpName to allow arrays of primitive type to
13527             be printed nicely (e.g. instead of System.Int32[][] it now prints
13528             int[][])
13529           - added method CSharpSignature: returns the signature of a method
13530             in string format to be used in reporting errors, warnings, etc.
13531
13532         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
13533         with String.Empty.
13534
13535 2002-04-26  Ravi Pratap  <ravi@ximian.com>
13536
13537         * delegate.cs (Define): Fix extremely silly bug where I was
13538         setting the type of the 'object' parameter of the BeginInvoke
13539         method to System.IAsyncResult instead of System.Object ;-)
13540
13541 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
13542
13543         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
13544         here. 
13545
13546         (Constructor.Emit): return if we fail to initialize the
13547         constructor.  Another door closed!  
13548
13549         * expression.cs (New.DoResolve): Improve error message (from -6 to
13550         1501).  Use DeclaredOnly lookup to find the exact constructor.
13551
13552         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
13553         loop.  This is useful.
13554
13555         * cs-parser.jay: Adjust the default parameters so that destructors
13556         have the proper signature.
13557
13558 2002-04-26  Martin Baulig  <martin@gnome.org>
13559
13560         * driver.cs (LoadAssembly): If `assembly' contains any characters
13561         which are only valid in path names and not in assembly names
13562         (currently slash, backslash and point), use Assembly.LoadFrom ()
13563         instead of Assembly.Load () on the `assembly' (before iteration
13564         over the link_paths).
13565
13566 2002-04-26  Martin Baulig  <martin@gnome.org>
13567
13568         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
13569
13570 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
13571
13572         * class.cs (Property): use the new typemanager.MemberLookup
13573
13574         (TypeContainer.MemberLookup): Implement using the
13575         TypeManager.MemberLookup now. 
13576
13577         * typemanager.cs: Make MemberLookup a function of the TypeManager,
13578         and return MemberInfos, so that these can be used without an
13579         EmitContext (what we had before).
13580
13581 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
13582
13583         * expression.cs: Fix the case where the argument to params if the
13584         type of the params.  I omitted handling this before.   Fixed
13585
13586 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
13587
13588         * driver.cs: Call BootCorlib_PopulateCoreType
13589
13590         * class.cs (Property.CheckBase): Check for properties only, not
13591         for all members. 
13592
13593         * interface.cs: Temporary hack: try/catch around the
13594         CustomAttributeBuilder, because I am getting an exception that I
13595         do not understand.
13596
13597         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
13598         types whose definitions are required to be there (attributes are
13599         defined before standard types).
13600
13601         Compute definitions as we boot the various types, as they are used
13602         immediately (value_type class will need object_type, but if we do
13603         not initialize object_type, we will pass a null, which will let
13604         the runtime pick the System.Object from the existing corlib, which
13605         is not what we want).
13606
13607 2002-04-22  Patrik Torstensson <totte@labs2.com>
13608
13609         * cs-tokenizer.cs: fixed a number of trim() issues.
13610
13611 2002-04-22  Ravi Pratap  <ravi@ximian.com>
13612
13613         * expression.cs (Argument.Type): Ensure that we return the correct
13614         type when we have out or ref parameters [in which case we 
13615         append a "&"].
13616
13617 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
13618
13619         * class.cs (Property, Indexer): Allow extern modifier in there. 
13620
13621         * typemanager.cs (InitBaseTypes): Initializes object_type and
13622         value_type, since those will be used early on during the bootstrap
13623         process to compile corlib.
13624
13625         (InitCoreTypes): Move code from here to InitBaseTypes.
13626
13627 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
13628
13629         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
13630         single-dimension arrays as using the ldlen opcode.  
13631
13632         Daniel Lewis discovered this optimization.  
13633
13634         * typemanager.cs: Add signature for System.Array::get_Length
13635
13636 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
13637
13638         * statement.cs: report the error when the foreach does not apply to an
13639         array nor a collection.
13640
13641 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
13642
13643         * expression.cs: Add implicit conversions to the operator ~.
13644
13645         * constant.cs (DecimalConstant.Emit): Emit decimal value.
13646
13647         * typemanager.cs: Locate the decimal constructor.
13648
13649 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
13650
13651         * attribute.cs: use the new property of TypeOf.
13652         * expression.cs: added 'get' property around typearg.
13653
13654         These changes fix a build breaker reported by NickD. Is this the
13655         correct way to fix?  If not, please, revert my changes and make it
13656         work :-).
13657
13658 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
13659
13660         * attribute.cs: Add support for typeof in attribute invocations.
13661         I am not sure that this is right though.
13662
13663 2002-04-14  Duncan Mak  <duncan@ximian.com>
13664
13665         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
13666         Binary.Operator.Division case.
13667
13668 2002-04-13  Ravi Pratap  <ravi@ximian.com>
13669
13670         * class.cs (DefineType): Ensure that we do a proper check on
13671         attribute types and also register it with the TypeManager.
13672
13673         (TypeContainer.Targets): The default for attribute types is
13674         AttributeTargets.All.
13675
13676         * attribute.cs (ApplyAttributes): Registering the attribute type
13677         is done elsewhere, not when we discover we have a Usage attribute.
13678
13679 2002-04-12  Ravi Pratap  <ravi@ximian.com>
13680
13681         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
13682         and get rid of is_delegate parameter.
13683
13684         * everywhere : update.
13685
13686 2002-04-12  Ravi Pratap  <ravi@ximian.com>
13687
13688         * cs-parser.jay (compilation_unit): Revamp completely to use
13689         some new ideas that I got from Rhys' grammar to solve the problems
13690         with assembly level attributes.
13691
13692         (outer_declaration): New grammar production.
13693
13694         (attribute_sections): Add.
13695
13696         (opt_attributes): Base on attribute_sections
13697
13698         (namespace_declaration): Allow opt_attributes to tackle the case
13699         when we have assembly level attributes - we are clever in this
13700         regard now ;-)
13701
13702         * attribute.cs (ApplyAttributes): Do not worry about assembly 
13703         attributes in the non-global context.
13704
13705         * rootcontext.cs (AddGlobalAttributes): Go back to using this
13706         instead of SetGlobalAttributes.
13707
13708         * class.cs, rootcontext.cs : Ensure we define and generate 
13709         attribute types before anything else.
13710
13711         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
13712         and flag the new error -20 for the case when the attribute type
13713         does not have valid targets specified. csc does not catch this.
13714
13715         * ../errors/errors.txt : update for error # -20
13716
13717 2002-04-11  Ravi Pratap  <ravi@ximian.com>
13718
13719         * support.cs (InternalParameters.ParameterModifier): Do some null
13720         checking and return sane values.
13721
13722         * class.cs (Method.Define): If we are a PInvoke method, ensure
13723         that we are static and extern. Report error # 601
13724
13725         * ../errors/cs0601.cs : Add test case for the above error.
13726
13727 2002-04-07  Ravi Pratap  <ravi@ximian.com>
13728
13729         * rootcontext.cs (attribute_types): We need to keep type of
13730         all attribute types separately and emit code for them first.
13731
13732         (RegisterAttribute) : Implement.
13733
13734         * class.cs (DefineType): Check if the current Type is a custom
13735         attribute type and register it accordingly.
13736
13737         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
13738         adding the first attribute twice and rename to
13739
13740         (SetGlobalAttributes): this.
13741
13742         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
13743         lookups.
13744
13745         * attribute.cs (ApplyAttributes): Take an additional argument telling us
13746         if we are processing global arguments. Hmm, I am unsure of this.
13747
13748 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
13749
13750         * expression.cs: added static array of strings to avoid calling
13751         Enum.ToString () for Operator in Binary. Significant recover of
13752         performance.
13753
13754 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
13755
13756         * class.cs (FindMembers): Allow the Builders of the various
13757         members to be null.  If they are skip them.  This only happens
13758         during the PInvoke declaration.
13759
13760 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
13761
13762         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
13763         failure, so we do not keep going afterwards.
13764
13765         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
13766         wanted to pass `false' as the `is_delegate' argument.  If this is
13767         the case, why not use delegate_type == null to mean `is_delegate =
13768         false' and anything else as is_delegate = true.
13769
13770 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
13771
13772         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
13773         code for the section, not the beginning of the tests.
13774
13775 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
13776
13777         * cfold.cs: Handle operator + (Enum x, Underlying x) 
13778
13779         * expression.cs (Binary): same.  Warn about errors where we have
13780         Enum/Enum in operator + as well.
13781
13782 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
13783
13784         * statement.cs:
13785                 - added support for switch(bool)
13786                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
13787                 - add TableSwitchEmit() to handle table-based switch statements
13788
13789 2002-04-05  Ravi Pratap  <ravi@ximian.com>
13790
13791         * expression.cs (Invocation.OverloadResolve): Factor out code which
13792         does parameter compatibility checking with arguments so that we can 
13793         re-use the code even from Delegate.VerifyApplicability
13794
13795         (VerifyArgumentsCompat): Move above code here.
13796
13797         * delegate.cs (VerifyApplicability): Get rid of duplicate code
13798         and instead make a call to the above method.
13799
13800 2002-03-31  Ravi Pratap  <ravi@ximian.com>
13801
13802         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
13803         We use it to keep track of classes which are attribute types.
13804
13805 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
13806
13807         * delegate.cs (Delegate.Define): Correctly define the types in the
13808         presence of fixed and array parameters.
13809
13810         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
13811         doing FindMembers.
13812
13813         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
13814         include NonPublic after the first iteration.
13815
13816         * class.cs (Indexer.CheckBase): Only check if both parents are
13817         non-null. 
13818
13819         * cs-parser.jay (accessor_body): If empty, set to null.
13820
13821         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
13822         same code path here to resolve constants names that we did have in
13823         MemberAccess.DoResolve.  There is too much code duplicated here.
13824
13825 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
13826
13827         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
13828
13829         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
13830         to MakeUnionSet.
13831
13832         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
13833         tokens, numbers and strings.
13834
13835         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
13836         parenthesis.
13837
13838         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
13839         asyncronous parameters and the regular parameters.  
13840
13841         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
13842         specify the target directory.
13843
13844         * expression.cs: (This.DoResolve): Simplify
13845         (As.Emit): Optimize, do not generate IsInst if the expression is
13846         always of the given type.
13847
13848         (Is.DoResolve): Bug fix, we were reporting both always/never for
13849         the is expression.
13850
13851         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
13852         creating too many unnecessary arrays.
13853
13854 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
13855
13856         * class.cs (EmitFieldInitializer): Use Assign expression to assign
13857         fields instead of rolling our own initializer.   Takes care of all
13858         implicit conversions, and drops unnecessary static checks/argument.
13859
13860 2002-03-31  Dick Porter  <dick@ximian.com>
13861
13862         * driver.cs: use the GetDirectories() return values properly, and
13863         use "/" as path separator.
13864
13865 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
13866
13867         * expression.cs (Unary): Optimize - - expr into expr.
13868         (Binary): Optimize a + (-b) into a -b.
13869
13870         * codegen.cs (CodeGen): Made all methods static.
13871
13872 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
13873
13874         * rootcontext.cs: 
13875
13876         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
13877         TypeBuilder property.
13878
13879         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
13880         instead. 
13881
13882         * tree.cs: Removed the various RecordXXXX, and replaced with a
13883         single RecordDecl.  Removed all the accessor methods, and just
13884         left a single access point Type 
13885
13886         * enum.cs: Rename DefineEnum to DefineType.
13887
13888         * decl.cs: New abstract method `DefineType' used to unify the
13889         Defines for Enumerations, Interfaces, TypeContainers and
13890         Delegates.
13891
13892         (FindType): Moved LookupInterfaceOrClass here.  Moved the
13893         LookupBaseClasses method that used to live in class.cs and
13894         interface.cs here, and renamed to FindType.
13895
13896         * delegate.cs: Implement DefineType.  Take advantage of the
13897         refactored pattern for locating the parent builder without taking
13898         the parent_builder argument (which we know does not work if we are
13899         nested, and triggering a toplevel definition).
13900
13901 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
13902
13903         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
13904         accessibility of a member has changed during override and report
13905         an error if so.
13906
13907         * class.cs (Method.Define, Property.Define): Only complain on
13908         overrides if the method is private, any other accessibility is
13909         fine (and since we just checked the permission is the same, we are
13910         good to go).
13911
13912         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
13913         and elif are processed always.  The other pre-processing
13914         directives are only processed if we are "taking" the path
13915
13916 2002-03-29  Martin Baulig  <martin@gnome.org>
13917
13918         * class.cs (Method.Emit): Only emit symbolic debugging info if the
13919         current location is not Null.
13920
13921         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
13922         a separate method so we can profile it.
13923
13924         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
13925         `span.Seconds' are just seconds, but no minutes or hours.
13926         (MainDriver): Profile the CodeGen.SaveSymbols calls.
13927
13928 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
13929
13930         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
13931         Remove the gratuitous set of Final:
13932
13933                                 // If an interface implementation, then we can set Final.
13934                                 if (((flags & MethodAttributes.Abstract) == 0) &&
13935                                     implementing.DeclaringType.IsInterface)
13936                                         flags |= MethodAttributes.Final;
13937
13938         I do not know what I was smoking when I used that.
13939
13940
13941         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
13942         step into fixing the name resolution issues for delegates and
13943         unifying the toplevel name resolution.
13944
13945 2002-03-28  Martin Baulig  <martin@gnome.org>
13946
13947         * class.cs (Method.Emit): If we have a symbol writer, call its
13948         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
13949         tell it about the current method.
13950
13951         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
13952         writer that we're going to emit the first byte of IL code for a new
13953         statement (a new source line).
13954         (EmitContext.EmitTopBlock): If we have a symbol writer, call
13955         EmitContext.Mark() before emitting any code.
13956
13957         * location.cs (SymbolDocument): Return null when we're Null.
13958
13959         * statement.cs (Statement): Moved the `Location loc' variable here.
13960         (Statement.EmitBoolExpression): If we have a symbol writer, call
13961         ec.Mark() before emitting any code to tell it that we're at the
13962         beginning of a new statement.
13963         (StatementExpression): Added `Location' argument to the constructor.
13964         (Block): Added public readonly variable `StartLocation' and public
13965         variable `EndLocation'.  The latter is to be set using SetEndLocation().
13966         (Block): Added constructor which takes a start and end location.
13967         (Block.SetEndLocation): New method. This sets the end location.
13968         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
13969         local variables we create.
13970         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
13971         each statement and do also mark the begin and end of the block.
13972
13973         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
13974         tell it the current lexer.Location, use Location.Null for the end of the
13975         block.
13976         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
13977         current block, set its end location using SetEndLocation().
13978         (statement_expression): StatementExpression constructor now takes the
13979         lexer.Location as additional argument.
13980         (for_statement, declare_local_variables): Likewise.
13981         (declare_local_variables): When creating a new implicit block, use the
13982         new Block constructor and pass it the lexer.Location.
13983
13984 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
13985
13986         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
13987         members also on the parent interfaces recursively.
13988
13989 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
13990
13991         * report.cs: Use new formats, since Gonzalo finished the missing
13992         bits. 
13993
13994         * expression.cs (Binary.ResolveOperator): added missing operator|
13995         operator& and operator^ for bool/bool.
13996
13997         * cs-parser.jay: CheckDef now takes a Location argument that is
13998         used to report errors more precisly (instead of reporting the end
13999         of a definition, we try to track something which is a lot closer
14000         to the source of the problem).
14001
14002         * cs-tokenizer.cs: Track global token use, so we can properly flag
14003         the use of #define/#undef after the first token has been seen.
14004
14005         Also, rename the reportXXXX to Error_DescriptiveName
14006
14007         * decl.cs (DeclSpace.IsTopLevel): Move property here from
14008         TypeContainer, so that Enum and Interface can use this too.
14009
14010         * class.cs (TypeContainer.LookupInterfaceOrClass,
14011         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
14012         `builder' argument.  Typically this was used to pass the parent
14013         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
14014         the definition).  
14015
14016         The problem is that a nested class could trigger the definition of
14017         a toplevel class, and the builder would be obviously wrong in that
14018         case. 
14019
14020         So we drop this argument, and we compute dynamically the
14021         TypeBuilder/ModuleBuilder (the correct information was available
14022         to us anyways from DeclSpace.Parent)
14023
14024         * interface.cs (Interface.DefineInterface): Drop builder
14025         parameter cleanup like class.cs
14026
14027         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
14028         like class.cs
14029
14030         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
14031         values. 
14032
14033         (Try.Emit): Propagate the returns value from the statement.
14034
14035         (Return.Emit): Even if we are leavning 
14036
14037         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
14038
14039         * modifiers.cs: Fix the computation of MethodAttributes flags.
14040
14041 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
14042
14043         * driver.cs: allow compilation of files that start with '/'.
14044         Add a default case when checking the argument of --target.
14045
14046 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
14047
14048         * interface.cs: Implement the same search algorithm for types in
14049         the interface code.
14050
14051         * delegate.cs: Do not allow multiple definition.
14052
14053         * Recovered ChangeLog that got accidentally amputated
14054
14055         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
14056
14057         * rootcontext.cs: Load manually enum to allow core classes to
14058         contain enumerations.
14059
14060         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
14061         Update to new static methods in TypeManager.
14062
14063         * typemanager.cs (GetMethod, GetConstructor): Use our
14064         implementation of FindMembers to find the members, since during
14065         corlib compilation, the types are TypeBuilders and GetMethod and
14066         GetConstructor do not work.
14067
14068         Make all methods in TypeManager static.
14069
14070         (InitCodeHelpers): Split the functionality from
14071         the InitCodeTypes function.
14072
14073         * driver.cs: Call InitCodeHelpers after we have populated the
14074         types. 
14075
14076         * cs-parser.jay (delegate_declaration): we did not used to compute
14077         the delegate name correctly for void delegates.
14078
14079 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
14080
14081         * rootcontext.cs (RootContext): Init the interface_resolve_order
14082         and type_container_resolve_order always.
14083
14084         (ResolveCore, BootstrapCorlib_ResolveClass,
14085         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
14086         compiler when compiling with --nostdlib
14087
14088         * class.cs (TypeContainer.DefineType): Check that our parent is
14089         not null.  This test is most important when we are bootstraping
14090         the core types.
14091
14092         * codegen.cs: Split out the symbol writing code.
14093
14094 2002-03-25  Martin Baulig  <martin@gnome.org>
14095
14096         * driver.cs (-g): Made -g an alias for --debug.
14097
14098 2002-03-24  Martin Baulig  <martin@gnome.org>
14099
14100         * codegen.cs (SymbolWriter): New public variable. Returns the
14101         current symbol writer.
14102         (CodeGen): Added `bool want_debugging_support' argument to the
14103          constructor. If true, tell the ModuleBuild that we want debugging
14104         support and ask it for the ISymbolWriter.
14105         (Save): If we have a symbol writer, call it's Close() method after
14106         saving the assembly.
14107
14108         * driver.c (--debug): New command line argument to create a
14109         debugger information file.
14110
14111         * location.cs (SymbolDocument): New public property. Returns an
14112         ISymbolDocumentWriter object for the current source file or null
14113         if we don't have a symbol writer.
14114
14115 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
14116
14117         * driver.cs (LoadAssembly): Correctly return when all the paths
14118         have been tried and not before.
14119
14120         * statement.cs (Switch.Emit): return the actual coverage for this
14121         statement (returns/not-returns)
14122
14123         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
14124         switch of the statement if we are the last switch section.  That
14125         kills two problems: try/catch problems (we used to emit an empty
14126         nop at the end) and switch statements where all branches would
14127         return. 
14128
14129 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
14130
14131         * driver.cs: Add default assemblies (the equivalent to the
14132         Microsoft CSC.RSP file)
14133
14134         * cs-tokenizer.cs: When updating `cols and setting it to zero,
14135         also update tokens_seen and set it to false.
14136
14137         * driver.cs: Implement --recurse for Mike.
14138
14139         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
14140         correctly splitting out the paths.
14141
14142 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
14143
14144         * interface.cs (Interface.PopulateProperty): Instead of using
14145         `parent' as the declaration space for the set parameters, use
14146         `this' 
14147
14148         * support.cs (InternalParameters): InternalParameters constructor
14149         takes a DeclSpace instead of a TypeContainer.
14150
14151         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
14152         types are being initialized, load the address of it before calling
14153         the function.  
14154
14155         (New): Provide a mechanism to disable the generation of local
14156         value type temporaries when the caller will be providing us with
14157         an address to store it.
14158
14159         (ArrayCreation.EmitDynamicInitializers): Use it.
14160
14161 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
14162
14163         * expression.cs (Invocation.EmitArguments): Only probe for array
14164         property if there is more than one argument.  Sorry about that.
14165
14166         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
14167         empty param arrays.
14168
14169         * class.cs (Method.LabelParameters): Fix incorrect code path that
14170         prevented the `ParamArrayAttribute' from being applied to the
14171         params attribute.
14172
14173 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
14174
14175         * support.cs (ReflectionParameters): Correctly compute whether the
14176         last argument is a params array.  Fixes the problem with
14177         string.Split ('a')
14178
14179         * typemanager.cs: Make the assemblies array always be non-null
14180         (empty, but non-null)
14181
14182         * tree.cs (RecordDecl): New function that abstracts the recording
14183         of names.  This reports error 101, and provides a pointer to the
14184         previous declaration.  Fixes a crash in the compiler.
14185
14186         * cs-parser.jay (constructor_declaration): Update to new grammar,
14187         and provide a constructor_body that can be empty.
14188
14189 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
14190
14191         * driver.cs: Add support for --resources.
14192
14193         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
14194         Make all types for the various array helper methods be integer.
14195
14196         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
14197         CheckState to ConvCast.
14198
14199         (ConvCast): Now it takes a `checked' state argument, to avoid
14200         depending on the emit context for the conversion, and just using
14201         the resolve time setting.
14202
14203         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
14204         instead of Invocation.EmitArguments.  We do not emit the original
14205         arguments, instead we emit those which have been converted to
14206         unsigned int expressions.
14207
14208         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
14209
14210         * codegen.cs: ditto.
14211
14212         * expression.cs (LocalVariableReference): Drop the use of the
14213         Store function that depended on the variable index.
14214
14215         * statement.cs (VariableInfo): Drop the `Idx' property from this
14216         class, as this is not taking into account the indexes for
14217         temporaries tat we generate during the execution, getting the
14218         indexes wrong.
14219
14220         * class.cs: First emit class initializers, then call the parent
14221         constructor. 
14222
14223         * expression.cs (Binary): Fix opcode emision.
14224         (UnaryMutator.EmitCode): Support checked code generation
14225
14226         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
14227         matches for events for both the Static and Instance scans,
14228         pointing to the same element.   Fix that.
14229
14230 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
14231
14232         * rootcontext.cs (ResolveTree): Always set the
14233         interface_resolve_order, because nested interfaces will be calling
14234         into us.
14235
14236         * class.cs (GetInterfaceOrClass): Track the same resolution
14237         process used by TypeManager.LookupType.  This fixes the nested
14238         type lookups in class declarations (separate path from
14239         LookupType). 
14240
14241         (TypeContainer.DefineType): Also define nested interfaces.
14242         (TypeContainer.RegisterOrder): New public function used to
14243         register the order in which child interfaces need to be closed.
14244
14245         Nested interfaces need to be closed after their parents have been
14246         created. 
14247
14248         * interface.cs (InterfaceAttr): Put all the logic for computing
14249         the interface attribute here. 
14250
14251         (DefineInterface): Register our interface order with the
14252         RootContext or with the TypeContainer depending on the case.
14253
14254 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
14255
14256         * cs-parser.jay: rework foreach statement to work with the new
14257         changes to the policy on SimpleNames.
14258
14259         * report.cs: support Stacktrace on warnings as well.
14260
14261         * makefile: drop --unsafe and /unsafe from the compile.
14262
14263 2002-03-13  Ravi Pratap  <ravi@ximian.com>
14264
14265         * ecore.cs (StandardConversionExists): Modify to take an Expression
14266         as the first parameter. Ensure we do null -> reference type conversion
14267         checking.
14268
14269         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
14270         temporary Expression objects.
14271
14272 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
14273
14274         * interface.cs: workaround bug in method overloading resolution
14275         (there is already a bugzilla bug for it).
14276
14277 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
14278
14279         We could also solve this problem by having a separate path for
14280         performing type lookups, instead of DoResolve, we could have a
14281         ResolveType entry point, and only participating pieces of the
14282         production (simplename, deref, array) would implement this. 
14283
14284         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
14285         signal SimpleName to only resolve type names and not attempt to
14286         resolve anything else.
14287
14288         * expression.cs (Cast): Set the flag.
14289
14290         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
14291
14292         * class.cs: Only report 108 if there is no `new' modifier.
14293
14294         * cs-parser.jay: rework foreach statement to work with the new
14295         changes to the policy on SimpleNames.
14296         
14297         * report.cs: support Stacktrace on warnings as well.
14298
14299         * makefile: drop --unsafe and /unsafe from the compile.
14300
14301 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
14302
14303         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
14304         lookups here, instead of doing that at parse time.  This means
14305         that our grammar will not introduce `LocalVariableReferences' as
14306         expressions at this point.  That solves the problem of code like
14307         this:
14308
14309         class X {
14310            static void Main ()
14311            { int X = 1;
14312             { X x = null }}}
14313
14314         This is only half the fix.  The full fix requires parameters to
14315         also be handled in this way.
14316
14317         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
14318         makes the use more obvious of the DeclSpace.  The
14319         ec.TypeContainer.TypeBuilder is now only used to pull the
14320         TypeBuilder for it.
14321
14322         My theory is that I can get rid of the TypeBuilder completely from
14323         the EmitContext, and have typecasts where it is used (from
14324         DeclSpace to where it matters).  
14325
14326         The only pending problem is that the code that implements Aliases
14327         is on TypeContainer, and probably should go in DeclSpace.
14328
14329         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
14330         lookups here, instead of doing that at parse time.  This means
14331         that our grammar will not introduce `LocalVariableReferences' as
14332         expressions at this point.  That solves the problem of code like
14333         this:
14334
14335         class X {
14336            static void Main ()
14337            { int X = 1;
14338             { X x = null }}}
14339
14340         This is only half the fix.  The full fix requires parameters to
14341         also be handled in this way.
14342
14343         * class.cs (Property.DefineMethod): When implementing an interface
14344         method, set newslot, when implementing an abstract method, do not
14345         set the flag (before we tried never setting it, or always setting
14346         it, which is the difference).
14347         (Indexer.DefineMethod): same.
14348         (Method.DefineMethod): same.
14349
14350         * ecore.cs: Only set the status used flag if we get back a Field.
14351
14352         * attribute.cs: Temporary hack, so Paolo can keep working.
14353
14354 2002-03-08  Ravi Pratap  <ravi@ximian.com>
14355
14356         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
14357         the unmanaged type in the case we have a MarshalAs attribute.
14358
14359         (Resolve): Handle the case when we are parsing the special MarshalAs
14360         attribute [we need to store the unmanaged type to use later]
14361
14362         * typemanager.cs (marshal_as_attr_type): Built in type for the 
14363         MarshalAs Attribute.
14364
14365         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
14366         on parameters and accordingly set the marshalling info.
14367
14368 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
14369
14370         * class.cs: Optimizing slightly by removing redundant code after
14371         we switched to the `NoTypes' return value.
14372         (Property.DefineMethod): use NoTypes here too.
14373
14374         This fixes the bug I introduced in my last batch of changes.
14375
14376 2002-03-05  Ravi Pratap  <ravi@ximian.com>
14377
14378         * tree.cs (RecordEnum): Add. We now keep track of enums too.
14379
14380         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
14381         Enums since those are types too. 
14382
14383         * cs-parser.jay (enum_declaration): Record enums as we parse them.
14384
14385         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
14386         thanks to a call during the lookup process.
14387
14388 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
14389
14390         * statement.cs (Foreach): Lots of work to accomodate a particular
14391         kind of foreach statement that I had not kept in mind.  It is
14392         possible to have foreachs on classes that provide a GetEnumerator
14393         method that return objects that implement the "pattern" for using
14394         a foreach, there is no need to support GetEnumerator
14395         specifically. 
14396
14397         This is needed to compile nant.
14398
14399         * decl.cs: Only report 114 if the member is not `Finalize' and if
14400         the warning level is at least 2.
14401
14402         * class.cs: Moved the compare function from Method to
14403         MethodSignature. 
14404
14405         (MethodSignature.InheritableMemberSignatureCompare): Add new
14406         filter function that is used to extract inheritable methods from a
14407         class. 
14408
14409         (Method.Define): Use the new `inheritable_method_signature_filter'
14410         delegate
14411
14412         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
14413         command. 
14414
14415 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
14416
14417         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
14418
14419         * cs-parser.jay: Add opt_semicolon to the interface declaration.
14420
14421         * expression.cs: Pass location information to
14422         ConvertImplicitStandard. 
14423
14424         * class.cs: Added debugging code to track return values from
14425         interfaces. 
14426
14427 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
14428
14429         * expression.cs (Is.DoResolve): If either side of the `is' is an
14430         interface, do not flag the warning.
14431
14432         * ecore.cs (ImplicitReferenceConversion): We need a separate test
14433         for interfaces
14434
14435         * report.cs: Allow for --fatal to be used with --probe.
14436
14437         * typemanager.cs (NoTypes): Move the definition for the empty Type
14438         array here. 
14439
14440         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
14441         properties. 
14442         (TypeContainer.DefineProxy): New function used to proxy to parent
14443         implementations when implementing interfaces.
14444         (TypeContainer.ParentImplements): used to lookup if our parent
14445         implements a public function that is required by an interface.
14446         (TypeContainer.VerifyPendingMethods): Hook this up.
14447
14448         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
14449         `modules' and `assemblies' arraylists into arrays.  We only grow
14450         these are the very early start up of the program, so this improves
14451         the speedof LookupType (nicely measured).
14452
14453         * expression.cs (MakeByteBlob): Replaced unsafe code with
14454         BitConverter, as suggested by Paolo.
14455
14456         * cfold.cs (ConstantFold.Binary): Special case: perform constant
14457         folding of string concatenation, but if either side is a string,
14458         and the other is not, then return null, and let the runtime use
14459         the concatenation on the string plus the object (using
14460         `Object.ToString'). 
14461
14462 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
14463
14464         Constant Folding has been implemented now.
14465
14466         * expression.cs (Unary.Reduce): Do not throw an exception, catch
14467         the error instead on types that are not supported in one's
14468         complement. 
14469
14470         * constant.cs (Constant and all children): New set of functions to
14471         perform implict and explicit conversions.
14472
14473         * ecore.cs (EnumConstant): Implement the new functions to perform
14474         conversion by proxying to the child expression.
14475
14476         * codegen.cs: (ConstantCheckState): Constant evaluation has its
14477         own separate setting that can not be turned off from the command
14478         line using --unchecked or --checked and is only controlled using
14479         the checked/unchecked statements and expressions.  This setting is
14480         used by the constant folder to flag errors.
14481
14482         * expression.cs (CheckedExpr, UncheckedExpr): Set the
14483         ConstantCheckState as well.   
14484
14485         During Resolve, they also have to flag the state, because the
14486         constant folder runs completely in the Resolve phase.
14487
14488         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
14489         well.
14490
14491 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
14492
14493         * cfold.cs: New file, this file contains the constant folder.
14494
14495         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
14496         argument to track whether we are using the resulting address to
14497         load or store a value and provide better error messages. 
14498
14499         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
14500         new AddressOf arguments.
14501
14502         * statement.cs (Foreach.EmitCollectionForeach): Update
14503
14504         * expression.cs (Argument.Emit): Call AddressOf with proper
14505         arguments to track usage.
14506
14507         (New.DoEmit): Call AddressOf with new arguments.
14508
14509         (Unary.Emit): Adjust AddressOf call.
14510
14511 2002-03-01  Ravi Pratap  <ravi@ximian.com>
14512
14513         * cs-parser.jay (member_access): Change the case for pre-defined types
14514         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
14515         this suggestion.
14516
14517         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
14518         a method body.
14519
14520         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
14521         essentially like methods and apply attributes like MethodImplOptions to them too.
14522
14523         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
14524         not being null.
14525
14526         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
14527         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
14528         is the DeclSpace.
14529
14530         * Update code everywhere accordingly.
14531
14532         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
14533
14534         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
14535
14536 2002-02-28  Ravi Pratap  <ravi@ximian.com>
14537
14538         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
14539         try performing lookups against those instead of jumping straight into using
14540         the 'using' clauses.
14541
14542         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
14543
14544         (LookupType): Perform lookups in implicit parents too.
14545
14546         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
14547         sequence as RootContext.LookupType. 
14548
14549         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
14550         the various cases of namespace lookups into this method.
14551
14552 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
14553
14554         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
14555         in positional arguments)
14556
14557         * class.cs (Operator): Update the AllowedModifiers to contain
14558         extern. 
14559
14560         * cs-parser.jay: Update operator declaration to allow for the
14561         operator body to be empty.
14562
14563         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
14564         values. 
14565
14566 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
14567
14568         * class.cs (Method.Emit): Label parameters.
14569
14570         * driver.cs: Return 1 or 0 as the program exit code.
14571
14572 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
14573
14574         * expression.cs: Special case the `null' object when trying to
14575         auto-compute the type, as anything can be explicitly converted to
14576         that. 
14577
14578         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
14579         spotting this Paolo.
14580
14581         (Expression.ImplicitNumericConversion): Perform comparissions of
14582         the type using the underlying type in the case of an enumeration
14583         rather than using the enumeration type for the compare.
14584
14585         Cope with the underlying == type case, which is not possible to
14586         catch before. 
14587
14588         (Expression.ConvertNumericExplicit): Perform comparissions of
14589         the type using the underlying type in the case of an enumeration
14590         rather than using the enumeration type for the compare.
14591
14592         * driver.cs: If the user does not supply an extension, assume .exe
14593
14594         * cs-parser.jay (if_statement): Rewrote so that we can track the
14595         location for the if statement.
14596
14597         * expression.cs (Binary.ConstantFold): Only concat strings when
14598         the operation is "+", not everything ;-)
14599
14600         * statement.cs (Statement.EmitBoolExpression): Take a location
14601         argument. 
14602         (If, While, Do): Track location.
14603
14604         * expression.cs (Binary.ResolveOperator): In the object + string
14605         case, I was missing a call to ConvertImplicit
14606
14607 2002-02-25  Ravi Pratap  <ravi@ximian.com>
14608
14609         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
14610         Location arguments. Ensure we use RootContext.LookupType to do our work
14611         and not try to do a direct Type.GetType and ModuleBuilder.GetType
14612
14613         * interface.cs (PopulateMethod): Handle the type of the parameter being
14614         null gracefully.
14615
14616         * expression.cs (Invocation.BetterFunction): Handle the case when we 
14617         have a params method with no fixed arguments and a call is made with no
14618         arguments.
14619
14620 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
14621
14622         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
14623         the verbatim-string-literal
14624
14625         * support.cs (InternalParameters.ParameterModifier): handle null
14626         fixed parameters.
14627         (InternalParameters.ParameterType): ditto.
14628
14629         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
14630         duplicating the name of the variable parameter.
14631         (GetParameterByName): Fix bug where we were not looking up array
14632         paramters if they were the only present (thanks Paolo!).
14633         (GetParameterInfo): We only have an empty set of types if both
14634         fixed and array are set to null.
14635         (GetParameterInfo-idx): Handle FixedParameter == null
14636
14637         * cs-parser.jay: Handle the case where there is no catch
14638         statements (missing null test).
14639
14640 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
14641
14642         * driver.cs (MainDriver): Be conservative on our command line
14643         handling.
14644
14645         Catch DirectoryNotFoundException when calling GetFiles.
14646
14647         (SplitPathAndPattern): Used to split the input specification into
14648         a path and a pattern that we can feed to Directory.GetFiles.
14649
14650 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
14651
14652         * statement.cs (Fixed): Implement the last case of the Fixed
14653         statement (string handling).
14654
14655         * expression.cs (StringPtr): New class used to return a char * to
14656         a string;  Used by the Fixed statement.
14657
14658         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
14659
14660         * expression.cs (Binary.ResolveOperator): Remove redundant
14661         MemberLookup pn parent type.
14662         Optimize union call, we do not need a union if the types are the same.
14663         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
14664         type.
14665
14666         Specialize the use of MemberLookup everywhere, instead of using
14667         the default settings. 
14668
14669         (StackAlloc): Implement stackalloc keyword.
14670
14671         * cs-parser.jay: Add rule to parse stackalloc.
14672
14673         * driver.cs: Handle /h, /help, /?
14674
14675         * expression.cs (MakeByteBlob): Removed the hacks we had in place
14676         before we supported unsafe code.
14677
14678         * makefile: add --unsafe to the self compilation of mcs.
14679
14680 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
14681
14682         * expression.cs (PointerArithmetic): New class that is used to
14683         perform pointer arithmetic.
14684         (Binary.Resolve): Handle pointer arithmetic
14685         Handle pointer comparission.
14686         (ArrayPtr): Utility expression class that is used to take the
14687         address of an array.
14688
14689         (ElementAccess): Implement array access for pointers
14690
14691         * statement.cs (Fixed): Implement fixed statement for arrays, we
14692         are missing one more case before we are done.
14693
14694         * expression.cs (Indirection): Implement EmitAssign and set the
14695         ExprClass to Variable.  This allows pointer dereferences to be
14696         treated as variables, and to have values assigned to them.
14697
14698         * ecore.cs (Expression.StoreFromPtr): New utility function to
14699         store values dereferencing.
14700
14701 2002-02-20  Ravi Pratap  <ravi@ximian.com>
14702
14703         * expression.cs (Binary.ResolveOperator): Ensure that we are
14704         not trying to operate on a void type - this fixes the reported
14705         bug.
14706
14707         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
14708         the parent implementation is sealed.
14709
14710         * ../errors/cs0239.cs : Add.
14711
14712         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
14713
14714         * typemanager.cs (unverifiable_code_type): Corresponds to 
14715         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
14716         which have unsafe code in them.
14717
14718         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
14719         unsafe context.
14720
14721 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
14722
14723         * cs-tokenizer.cs: Add support for @"litreal strings"
14724
14725         Make tokenizer accept pre-processor directives
14726         on any column (remove the old C-like limitation). 
14727
14728         * rootcontext.cs (EmitCode): Emit any global attributes.
14729         (AddGlobalAttributes): Used to keep track of assembly attributes. 
14730
14731         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
14732
14733         * cs-parser.jay: Add support for global attributes.  
14734
14735 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
14736
14737         * expression.cs (Indirection): New helper class.  Unary will
14738         create Indirection classes to be able to implement the
14739         IMemoryLocation interface on it.
14740
14741 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
14742
14743         * cs-parser.jay (fixed_statement): reference the right statement.
14744
14745         * statement.cs (Fixed.Emit): Finish implementing the fixed
14746         statement for the &x case.
14747
14748 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
14749
14750         * class.cs (Property.Define, Method.Define): Remove newslot when
14751         `implementing'.  
14752
14753         * modifiers.cs: My use of NewSlot when `Abstract' was set was
14754         wrong.  NewSlot should only be used if the `new' keyword is present.
14755
14756         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
14757         locating our system dir.  Sorry about this.
14758
14759 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
14760
14761         * driver.cs (GetSystemDir): Compute correctly the location of our
14762         system assemblies.  I was using the compiler directory instead of
14763         the library directory.
14764
14765 2002-02-13  Ravi Pratap  <ravi@ximian.com>
14766
14767         * expression.cs (BetterFunction): Put back in what Miguel commented out
14768         since it is the correct fix. The problem is elsewhere ;-)
14769
14770         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
14771         parameters of the parms method are themselves compatible or not !
14772
14773         (StandardConversionExists): Fix very dangerous bug where we were forgetting
14774         to check that a class implements an interface before saying that an implicit
14775         conversion was allowed. Use ImplementsInterface to do the checking.
14776
14777 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
14778
14779         * class.cs (Method.Define): Track whether we are an explicit
14780         implementation or not.  And only call DefineMethodOverride if we
14781         are an explicit implementation.
14782
14783         (Property.DefineMethod): Ditto.
14784
14785 2002-02-11  Ravi Pratap  <ravi@ximian.com>
14786
14787         * expression.cs (BetterFunction): Catch hideous bug which was
14788          preventing us from detecting ambiguous calls due to implicit casts i.e
14789         cs0121.
14790
14791 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
14792
14793         * support.cs (Pair): Remove un-needed method.  I figured why I was
14794         getting the error in cs-parser.jay, the variable in a foreach loop
14795         is readonly, and the compiler does not really treat this as a variable.
14796
14797         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
14798         instead of EQUALS in grammar.  
14799
14800         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
14801
14802         * expression.cs (Unary.DoResolve): Check whether the argument is
14803         managed or not.
14804
14805 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
14806
14807         * support.cs: Api for Pair to set a value.  Despite the fact that
14808         the variables are public the MS C# compiler refuses to compile
14809         code that accesses the field if the variable is part of a foreach
14810         statement. 
14811
14812         * statement.cs (Fixed): Begin implementation of the fixed
14813         statement.
14814
14815         (Block.AddVariable): Return the VariableInfo on success and null
14816         on failure instead of true/false. 
14817
14818         * cs-parser.jay (foreach): Catch errors on variables already
14819         defined (we were ignoring this value before) and properly unwind
14820         the block hierarchy
14821
14822         (fixed_statement): grammar for the fixed statement.
14823
14824 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
14825
14826         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
14827         pointer types to be incretemented.
14828
14829         (SizeOf): Implement.
14830
14831         * cs-parser.jay (pointer_member_access): Implement
14832         expr->IDENTIFIER production.
14833
14834         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
14835         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
14836         on safe contexts.
14837
14838         (Unary): Implement indirection.
14839
14840         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
14841         use in non-unsafe context).
14842
14843         (SimpleName.DoResolve): Check for pointers in field access on safe
14844         contexts. 
14845
14846         (Expression.LoadFromPtr): Factor the load-indirect code in this
14847         function.  This was duplicated in UnboxCast and ParameterReference
14848
14849 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
14850
14851         * expression.cs (ComposedCast): report an error if a pointer cast
14852         is used in a safe region.
14853
14854         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
14855         pointer type casts in unsafe context.
14856
14857         * codegen.cs (EmitContext): Set up IsUnsafe.
14858
14859         * cs-parser.jay (non_expression_type): Add productions for pointer
14860         casts. 
14861
14862         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
14863         code.  We should not use force into static mode if the method is
14864         not virtual.  Fixes bug in MIS
14865
14866         * statement.cs (Do.Emit, While.Emit, For.Emit,
14867         Statement.EmitBoolExpression): Add support to Do and While to
14868         propagate infinite loop as `I do return' semantics.
14869
14870         Improve the For case to also test for boolean constants.
14871
14872         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
14873         to the list of attributes we can add.
14874
14875         Remove `EmitContext' argument.
14876
14877         * class.cs (Method.Define): Apply parameter attributes.
14878         (Constructor.Define): Apply parameter attributes.
14879         (MethodCore.LabelParameters): Move here the core of labeling
14880         parameters. 
14881
14882         * support.cs (ReflectionParameters.ParameterModifier,
14883         InternalParameters.ParameterModifier): Use IsByRef on the type and
14884         only return the OUT bit for these parameters instead of in/out/ref
14885         flags.
14886
14887         This is because I miss-understood things.  The ParameterInfo.IsIn
14888         and IsOut represent whether the parameter has the [In] and [Out]
14889         attributes set.  
14890
14891 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
14892
14893         * ecore.cs (FieldExpr.Emit): Release temporaries.
14894
14895         * assign.cs (LocalTemporary.Release): new function.
14896
14897         * codegen.cs (EmitContext.GetTemporaryStorage,
14898         EmitContext.FreeTemporaryStorage): Rework the way we deal with
14899         temporary storage.  Now we can "put back" localbuilders when we
14900         are done with them
14901
14902 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
14903
14904         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
14905         need to make a copy of the variable to generate verifiable code.
14906
14907 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
14908
14909         * driver.cs: Compute dynamically the system directory.
14910
14911         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
14912         Slower, but more generally useful.  Used by the abstract
14913         registering implementation. 
14914
14915         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
14916         the rules for the special rule on Type/instances.  First check if
14917         we have the same name, and if so, try that special static path
14918         rather than the instance path.
14919
14920 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
14921
14922         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
14923         for, while and if.
14924
14925         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
14926         Enum, ValueType, Delegate or Array for non-corlib compiles.
14927
14928         * cs-tokenizer.cs: Catch long identifiers (645)
14929
14930         * typemanager.cs (IndexerPropetyName): Ravi never tested this
14931         piece of code.
14932
14933         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
14934         fix, we were returning too early, so we were not registering
14935         pending methods from abstract classes.
14936
14937         Do not register pending methods if the class is abstract.
14938
14939         * expression.cs (Conditional.DoResolve): Report circular implicit
14940         conversions when we neecd to compute it for conditional
14941         expressions. 
14942
14943         (Is.DoResolve): If the expression is always of the provided type,
14944         flag warning 183.  If the expression can not ever be of the
14945         provided type flag warning 184.
14946
14947         * class.cs: Catch 169 as well.
14948
14949         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
14950         read. 
14951
14952 2002-01-18  Nick Drochak  <ndrochak@gol.com>
14953
14954         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
14955
14956 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
14957
14958         * interface.cs: (PopulateMethod): Check for pointers being defined
14959         only if the unsafe context is active.
14960         (PopulateProperty): ditto.
14961         (PopulateIndexer): ditto.
14962
14963         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
14964         specified.  If pointers are present, make sure that they are
14965         present in an unsafe context.
14966         (Constructor, Constructor.Define): ditto.
14967         (Field, Field.Define): ditto.
14968         (Property, Property.Define): ditto.
14969         (Event, Event.Define): ditto.
14970
14971         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
14972         hashtable if there are classes or structs defined.
14973
14974         * expression.cs (LocalVariableReference.DoResolve): Simplify this
14975         code, as the constant resolution moved.
14976
14977         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
14978         the metadata, so we can flag error 133. 
14979
14980         * decl.cs (MemberCore.UnsafeOK): New function to test that a
14981         pointer is being declared in an unsafe context.
14982
14983 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
14984
14985         * modifiers.cs (Modifiers.Check): Require a Location argument.
14986         Report error 227 for Unsafe use.
14987
14988         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
14989
14990         * statement.cs (For.Emit): If the test is null, then report that
14991         we do `return', as we wont reach anything afterwards.
14992
14993         (Switch.SwitchGoverningType): Track the expression that matched
14994         the conversion.
14995
14996         * driver.cs: Allow negative numbers as an error code to flag.
14997
14998         * cs-parser.jay: Handle 1551.
14999
15000         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
15001
15002 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
15003
15004         * cs-parser.jay: Report 1518 (type declaration can only contain
15005         class, struct, interface, enum or delegate)
15006
15007         (switch_label): Report 1523 (keywords `case' or `default' must
15008         preced code)
15009
15010         (opt_switch_sections): Report 1522 (empty switch)
15011
15012         * driver.cs: Report 1515 (response file specified multiple times)
15013         Report 1516 (Source file specified multiple times).
15014
15015         * expression.cs (Argument.Resolve): Signal 1510
15016
15017         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
15018         access not allowed in static code)
15019
15020 2002-01-11  Ravi Pratap  <ravi@ximian.com>
15021
15022         * typemanager.cs (IsPointerType): Utility method which we are going
15023         to need a lot.
15024
15025         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
15026         the object type, so we take care of that.
15027
15028         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
15029
15030         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
15031         added to non-params parameters :-)
15032
15033         * typemanager.cs (CSharpName): Include 'void' type too. 
15034
15035         (void_ptr_type): Include in the set of core types.
15036
15037         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
15038         duplicating code.
15039
15040         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
15041         an unsafe context.
15042
15043         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
15044         completely forgotten about it.
15045
15046 2002-01-10  Ravi Pratap  <ravi@ximian.com>
15047
15048         * cs-parser.jay (pointer_type): Add. This begins our implementation
15049         of parsing rules for unsafe code.
15050
15051         (unsafe_statement): Implement.
15052
15053         (embedded_statement): Modify to include the above.
15054
15055         * statement.cs (Unsafe): Implement new class for unsafe blocks.
15056
15057         * codegen.cs (EmitContext.InUnsafe): Add. This determines
15058         if the current context is an unsafe one.
15059
15060         * cs-parser.jay (local_variable_pointer_type): Since local variable types
15061         are handled differently, we need separate rules for them.
15062
15063         (local_variable_declaration): Update to use local_variable_pointer_type
15064         to allow variable declarations of unmanaged pointer types.
15065
15066         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
15067         in unsafe contexts.
15068
15069         * ../errors/cs0214.cs : Add.
15070
15071 2002-01-16  Nick Drochak  <ndrochak@gol.com>
15072
15073         * makefile: remove 'response' file when cleaning.
15074
15075 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
15076
15077         * cs-parser.jay: Report 1524.
15078
15079 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
15080
15081         * typemanager.cs (RegisterMethod): drop checking if we have
15082         registered this from here
15083
15084 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
15085
15086         * class.cs (Method.EmitDestructor): Implement calling our base
15087         destructor. 
15088
15089         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
15090         value of InFinally.
15091
15092         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
15093         this routine and will wrap the call in a try/catch block.  Deal
15094         with the case.
15095
15096 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
15097
15098         * ecore.cs (Expression.MemberLookup): instead of taking a
15099         parameter `same_type' that was used to tell whether we could
15100         access private members we compute our containing type from the
15101         EmitContext.
15102
15103         (FieldExpr): Added partial support for volatile fields.  This does
15104         not work for volatile fields exposed from assemblies, as I can not
15105         figure out how to extract the modreq from it.
15106
15107         Updated all the source files to use this.
15108
15109         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
15110         because it is referenced by MemberLookup very often. 
15111
15112 2002-01-09  Ravi Pratap  <ravi@ximian.com>
15113
15114         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
15115         TypeBuilder.GetCustomAttributes to retrieve what we need.
15116
15117         Get rid of redundant default_member_attr_type as this is the same as
15118         default_member_type which already exists.
15119
15120         * interface.cs, attribute.cs : Update accordingly.
15121
15122 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
15123
15124         * typemanager.cs: Enable IndexerPropertyName again.  It does not
15125         work for TYpeBuilders though.  Ravi, can you please fix this?
15126
15127         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
15128
15129         * expression.cs (Argument.Emit): Handle the case of ref objects
15130         being passed to ref functions;  
15131
15132         (ParameterReference.EmitLoad): Loads the content of the pointer
15133         without dereferencing.
15134
15135 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
15136
15137         * cs-tokenizer.cs: Implemented the pre-processing expressions.
15138
15139 2002-01-08  Ravi Pratap  <ravi@ximian.com>
15140
15141         * class.cs (Indexer.DefineMethod): Incorporate the interface
15142         type in the name of the method if we are doing explicit interface
15143         implementation.
15144
15145         * expression.cs (ConversionExists): Remove as it is completely obsolete.
15146
15147         (BetterConversion): Fix extremely trivial bug where we were referring to
15148         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
15149         again !
15150
15151         * ../errors/bug16.cs : Add although we have fixed it.
15152
15153 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
15154
15155         * expression.cs (BaseIndexer): Begin implementation.
15156
15157         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
15158
15159         * cs-parser.jay (indexer_declarator): Use qualified_identifier
15160         production directly to remove a shift/reduce, and implement
15161         explicit interface implementation.
15162
15163         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
15164         after a floating point suffix.
15165
15166         * expression.cs (DoNumericPromotions): Improved the conversion for
15167         uint/uint.  If we have a constant, we avoid doing a typecast to a
15168         larger type.
15169
15170         * class.cs (Indexer): Implement explicit interface implementation
15171         for indexers.
15172
15173 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
15174
15175         * class.cs: make the default instance constructor public and hidebysig.
15176
15177 2001-01-03  Ravi Pratap  <ravi@ximian.com>
15178
15179         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
15180         so we can call it from elsewhere.
15181
15182         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
15183         we emit it internally if the class has a defined indexer; otherwise the user
15184         emits it by decorating the class definition with the DefaultMemberAttribute.
15185
15186         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
15187         attribute is not used on a type which defines an indexer.
15188
15189         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
15190         character when we skip whitespace.
15191
15192         * ../errors/cs0646.cs : Add.
15193
15194 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
15195
15196         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
15197         again. 
15198
15199         * makefile: Add practical target `mcs3.exe' which builds the third
15200         generation compiler. 
15201
15202         * expression.cs (New): Fix structures constructor calling.
15203
15204         * class.cs (Property, Method, Indexer): Emit Final flag on the
15205         method if we are an interface implementation and we are not
15206         abstract. 
15207
15208         * ecore.cs (PropertyExpr): New public field `IsBase', tells
15209         whether this property is referencing a `base' method.
15210
15211         * expression.cs (Invocation.EmitCall): take an extra argument:
15212         is_base, this is used to determine whether the `call' or
15213         `callvirt' opcode should be used.
15214
15215
15216         * delegate.cs: update EmitCall.
15217
15218         * class.cs (Method.Define): Set NewSlot for the cases where we are
15219         not implementing an interface method.
15220
15221         (Property.Define): ditto.
15222
15223 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
15224
15225         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
15226         'r'.  Allows mcs to parse itself fully.
15227
15228 2002-01-02  Ravi Pratap  <ravi@ximian.com>
15229
15230         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
15231         of the number of initializers that require the InitializeArray method.
15232
15233         (CheckIndices): Store the Expression in all cases - not the plain value. Also
15234         update the above field where necessary.
15235
15236         (MakeByteBlob): Update accordingly.
15237
15238         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
15239         greater than 2.
15240
15241         (EmitDynamicInitializers): Update in accordance with the new optimization.
15242
15243         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
15244         same OpCode applies.
15245
15246         * cs-parser.jay : Fix some glaring errors I introduced.
15247
15248 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
15249
15250         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
15251         so that we can check for name clashes there too.
15252
15253         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
15254         for interface indexers.
15255
15256         * interfaces.cs (Define): Emit the default member attribute.
15257
15258         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
15259         variable was being referred to while setting the value ;-)
15260
15261 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
15262
15263         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
15264         byte-by-byte information when we know the data is zero.
15265
15266         Make the block always a multiple of 4, because
15267         DefineInitializedData has a bug.
15268
15269         * assign.cs: Fix, we should assign from the temporary, not from
15270         the source. 
15271
15272         * expression.cs (MakeByteBlob): Fix my incorrect code.
15273
15274 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
15275
15276         * typemanager.cs (EnumToUnderlying): This function is used to get
15277         the underlying type from an enumeration, because it does not
15278         always work. 
15279
15280         * constant.cs: Use the I4_S form for values between -128 and 127.
15281
15282         * statement.cs (Block.LookupLabel): Looks up a label.
15283         (Block): Drop support for labeled blocks.
15284
15285         (LabeledStatement): New kind of statement that represents a label
15286         only.
15287
15288         (Goto): Finally implement this bad boy.
15289
15290         * cs-parser.jay: Update to reflect new mechanism to implement
15291         labels.
15292
15293 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
15294
15295         * codegen.cs (EmitContext.This): a codegen property that keeps the
15296         a single instance of this instead of creating many different this
15297         instances. 
15298
15299         * delegate.cs (Delegate.DoResolve): Update to use the property;
15300
15301         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
15302
15303         * expression.cs (BaseAccess.DoResolve): Ditto.
15304
15305 2001-12-29  Ravi Pratap  <ravi@ximian.com>
15306
15307         * typemanager.cs (methodimpl_attr_type): Add to hold the type
15308         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
15309
15310         (InitCoreTypes): Update accordingly.
15311
15312         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
15313         so we can quickly store the state.
15314
15315         (ApplyAttributes): Set the correct implementation flags
15316         for InternalCall methods.
15317
15318 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
15319
15320         * expression.cs (EmitCall): if a method is not virtual, then do
15321         not use callvirt on it.
15322
15323         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
15324         user defined stuff) requires the use of stobj, which takes an
15325         address on the stack instead of an array and an index.  So emit
15326         the Ldelema operation for it.
15327
15328         (EmitStoreOpcode): Use stobj for valuetypes.
15329
15330         (UnaryMutator.EmitCode): Use the right 1 value depending on
15331         whether we are dealing with int64/uint64, float or doubles.
15332
15333         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
15334         constructors that I implemented last night.
15335
15336         (Constructor.IsDefault): Fix to work properly for static
15337         constructors.
15338
15339         * cs-parser.jay (CheckDef): report method signature errors.
15340         Update error number 103 to be 132.
15341
15342         * decl.cs: New AdditionResult enumeration value: MethodExists.
15343         Although we do this check for methods later on in the semantic
15344         analysis, catching repeated default constructors is so easy that
15345         we catch these here. 
15346
15347         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
15348         promotions code.
15349
15350         (ParameterReference.EmitAssign, Emit): handle
15351         bools as bytes.
15352
15353         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
15354         (ArrayAccess.EmitStoreOpcode): ditto.
15355
15356         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
15357
15358         * expression.cs (MakeByteBlob): Complete all the missing types
15359         (uint, short, ushort, byte, sbyte)
15360
15361         * class.cs: Only init instance field initializers on instance
15362         constructors. 
15363
15364         Rename `constructors' to instance_constructors. 
15365
15366         (TypeContainer.AddConstructor): Only add constructors to the list
15367         if it is not static.
15368
15369         Make sure that we handle default_static_constructor independently
15370         everywhere where we handle instance_constructors
15371
15372 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
15373
15374         * class.cs: Do not lookup or create a base initializer for a
15375         static constructor.
15376
15377         (ConstructorInitializer.Resolve): use the proper type to lookup
15378         for constructors.
15379
15380         * cs-parser.jay: Report error 1585 (modifiers between type and name).
15381
15382         * enum.cs, interface.cs: Remove CloseType, this is taken care by
15383         in DeclSpace. 
15384
15385         * decl.cs: CloseType is now an virtual method, the default
15386         implementation just closes this type.
15387
15388 2001-12-28  Ravi Pratap  <ravi@ximian.com>
15389
15390         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
15391         to PreserveSig by default. Also emit HideBySig on such methods.
15392
15393         Basically, set the defaults to standard values.
15394
15395         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
15396         argument, if candidate is better, it can't be worse than the best !
15397
15398         (Invocation): Re-write bits to differentiate between methods being
15399         applicable in their expanded form and their normal form - for params
15400         methods of course.
15401
15402         Get rid of use_standard everywhere as only standard conversions are allowed
15403         in overload resolution. 
15404
15405         More spec conformance.
15406
15407 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
15408
15409         * driver.cs: Add --timestamp, to see where the compiler spends
15410         most of its time.
15411
15412         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
15413         `this' in static code.
15414
15415         (SimpleName.DoResolve): Implement in terms of a helper function
15416         that allows static-references to be passed upstream to
15417         MemberAccess.
15418
15419         (Expression.ResolveWithSimpleName): Resolve specially simple
15420         names when called by MemberAccess to implement the special
15421         semantics. 
15422
15423         (Expression.ImplicitReferenceConversion): Handle conversions from
15424         Null to reference types before others, as Null's type is
15425         System.Object. 
15426
15427         * expression.cs (Invocation.EmitCall): Handle the special case of
15428         calling methods declared on a reference type from a ValueType
15429         (Base classes System.Object and System.Enum)
15430
15431         (MemberAccess.Resolve): Only perform lookups on Enumerations if
15432         the left hand side is a TypeExpr, not on every enumeration. 
15433
15434         (Binary.Resolve): If types are reference types, then do a cast to
15435         object on operators != and == of both arguments.
15436
15437         * typemanager.cs (FindMembers): Extract instance and static
15438         members if requested.
15439
15440         * interface.cs (PopulateProperty): Use void_type instead of null
15441         as the return type for the setter method.
15442
15443         (PopulateIndexer): ditto.
15444
15445 2001-12-27  Ravi Pratap  <ravi@ximian.com>
15446
15447         * support.cs (ReflectionParameters): Fix minor bug where we
15448         were examining the wrong parameter for the ParamArray attribute.
15449
15450         Cope with requests for the type of the parameter at position
15451         greater than the params parameter's. We now return the element
15452         type of the params array as that makes more sense.
15453
15454         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
15455         accordingly as we no longer have to extract the element type
15456         ourselves.
15457
15458         (Invocation.OverloadResolve): Update.
15459
15460 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
15461
15462         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
15463         against IEnumerator, test whether the return value is a descendant
15464         of the IEnumerator interface.
15465
15466         * class.cs (Indexer.Define): Use an auxiliary method to implement
15467         the other bits of the method definition.  Begin support for
15468         explicit interface implementation.
15469
15470         (Property.DefineMethod): Use TypeManager.void_type instead of null
15471         for an empty return value.
15472
15473 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
15474
15475         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
15476         dealing with a FieldExpr which is composed of a FieldBuilder, in
15477         the code path we did extract the constant, but we should have
15478         obtained the underlying value to be able to cast it (otherwise we
15479         end up in an infinite loop, this is what Ravi was running into).
15480
15481         (ArrayCreation.UpdateIndices): Arrays might be empty.
15482
15483         (MemberAccess.ResolveMemberAccess): Add support for section
15484         14.5.4.1 that deals with the special case of E.I when E is a type
15485         and something else, that I can be a reference to a static member.
15486
15487         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
15488         handle a particular array type to create byte blobs, it is just
15489         something we dont generate byteblobs for.
15490
15491         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
15492         arguments. 
15493
15494         * location.cs (Push): remove the key from the hashtable that we
15495         are about to add.   This happens for empty files.
15496
15497         * driver.cs: Dispose files after we have parsed them.
15498
15499         (tokenize): new function that only runs the tokenizer on its
15500         input, for speed testing.
15501
15502 2001-12-26  Ravi Pratap  <ravi@ximian.com>
15503
15504         * class.cs (Event.Define): Define the private field only if there
15505         are no accessors defined.
15506
15507         * expression.cs (ResolveMemberAccess): If there is no associated
15508         field with the event, that means we have an event defined with its
15509         own accessors and we should flag error cs0070 since transforming
15510         ourselves into a field is not valid in that case.
15511
15512         * ecore.cs (SimpleName.DoResolve): Same as above.
15513
15514         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
15515         and charset to sane values.
15516
15517 2001-12-25  Ravi Pratap  <ravi@ximian.com>
15518
15519         * assign.cs (DoResolve): Perform check on events only if they 
15520         are being accessed outside the declaring type.
15521
15522         * cs-parser.jay (event_declarations): Update rules to correctly
15523         set the type of the implicit parameter etc.
15524
15525         (add_accessor, remove_accessor): Set current local parameters.
15526
15527         * expression.cs (Binary): For delegate addition and subtraction,
15528         cast the return value from the method into the appropriate delegate
15529         type.
15530
15531 2001-12-24  Ravi Pratap  <ravi@ximian.com>
15532
15533         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
15534         of these as the workaround is unnecessary.
15535
15536         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
15537         delegate data - none of that is needed at all.
15538
15539         Re-write bits to extract the instance expression and the delegate method
15540         correctly.
15541
15542         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
15543         on delegates too.
15544
15545         * attribute.cs (ApplyAttributes): New method to take care of common tasks
15546         of attaching attributes instead of duplicating code everywhere.
15547
15548         * everywhere : Update code to do attribute emission using the above method.
15549
15550 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
15551
15552         * expression.cs (IsParamsMethodApplicable): if there are not
15553         parameters, return immediately.
15554
15555         * ecore.cs: The 0 literal can be implicity converted to an enum
15556         type. 
15557
15558         (SimpleName.DoResolve): First lookup the type, then lookup the
15559         members. 
15560
15561         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
15562         want to get its address.  If the InstanceExpression is not
15563         addressable, store the result in a temporary variable, then get
15564         the address of it.
15565
15566         * codegen.cs: Only display 219 errors on warning level or above. 
15567
15568         * expression.cs (ArrayAccess): Make it implement the
15569         IMemoryLocation interface.
15570
15571         (Binary.DoResolve): handle the operator == (object a, object b)
15572         and operator != (object a, object b) without incurring into a
15573         BoxedCast (because 5 != o should never be performed).
15574
15575         Handle binary enumerator operators.
15576
15577         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
15578         value type, otherwise use Ldelem_ref.
15579
15580         Use precomputed names;
15581
15582         (AddressOf): Implement address of
15583
15584         * cs-parser.jay (labeled_statement): Fix recursive block
15585         addition by reworking the production.
15586
15587         * expression.cs (New.DoEmit): New has a special case:
15588                 
15589                  If we are dealing with a ValueType, we have a few
15590                  situations to deal with:
15591                 
15592                     * The target of New is a ValueType variable, that is
15593                       easy, we just pass this as the variable reference
15594                 
15595                     * The target of New is being passed as an argument,
15596                       to a boxing operation or a function that takes a
15597                       ValueType.
15598                 
15599                       In this case, we need to create a temporary variable
15600                       that is the argument of New.
15601
15602
15603 2001-12-23  Ravi Pratap  <ravi@ximian.com>
15604
15605         * rootcontext.cs (LookupType): Check that current_type is not null before
15606         going about looking at nested types.
15607
15608         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
15609         not implement the IAssignMethod interface any more.
15610
15611         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
15612         where we tranform them into FieldExprs if they are being resolved from within
15613         the declaring type.
15614
15615         * ecore.cs (SimpleName.DoResolve): Do the same here.
15616
15617         * assign.cs (DoResolve, Emit): Clean up code considerably. 
15618
15619         * ../errors/bug10.cs : Add.
15620
15621         * ../errors/cs0070.cs : Add.
15622
15623         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
15624
15625         * assign.cs : Get rid of EventIsLocal everywhere.
15626
15627 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
15628
15629         * ecore.cs (ConvertIntLiteral): finished the implementation.
15630
15631         * statement.cs (SwitchLabel): Convert the value we are using as a
15632         key before looking up the table.
15633
15634 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
15635
15636         * codegen.cs (EmitTopBlock): Require a Location argument now.
15637
15638         * cs-parser.jay (constructor_declarator): We need to setup
15639         current_local_parameters before we parse the
15640         opt_constructor_initializer, to allow the variables to be bound
15641         to the constructor arguments.
15642
15643         * rootcontext.cs (LookupType): First lookup nested classes in our
15644         class and our parents before we go looking outside our class.
15645
15646         * expression.cs (ConstantFold): Extract/debox the values at the
15647         beginnning. 
15648
15649         * rootcontext.cs (EmitCode): Resolve the constants first before we
15650         resolve the types.  This is not really needed, but it helps debugging.
15651
15652         * statement.cs: report location.
15653
15654         * cs-parser.jay: pass location to throw statement.
15655
15656         * driver.cs: Small bug fix.
15657
15658         * report.cs: Updated format to be 4-zero filled digits.
15659
15660 2001-12-22  Ravi Pratap  <ravi@ximian.com>
15661
15662         * expression.cs (CheckIndices): Fix minor bug where the wrong
15663         variable was being referred to ;-)
15664
15665         (DoEmit): Do not call EmitStaticInitializers when the 
15666         underlying type is System.Object.
15667
15668 2001-12-21  Ravi Pratap  <ravi@ximian.com>
15669
15670         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
15671         and do the usual workaround for SRE.
15672
15673         * class.cs (MyEventBuilder.EventType): New member to get at the type
15674         of the event, quickly.
15675
15676         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
15677
15678         * assign.cs (Assign.DoResolve): Handle the case when the target
15679         is an EventExpr and perform the necessary checks.
15680
15681         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
15682         interface.
15683
15684         (SimpleName.MemberStaticCheck): Include check for EventExpr.
15685
15686         (EventExpr): Set the type in the constructor itself since we 
15687         are meant to be born fully resolved.
15688
15689         (EventExpr.Define): Revert code I wrote earlier.
15690                 
15691         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
15692         instance expression is null. The instance expression is a This in that case
15693         or a null, depending on whether it is a static method or not.
15694
15695         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
15696         refers to more than one method.
15697
15698         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
15699         and accordingly flag errors.
15700
15701 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
15702
15703         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
15704
15705 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
15706
15707         * location.cs (ToString): Provide useful rutine.
15708
15709 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
15710
15711         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
15712         objects, return the actual integral boxed.
15713
15714         * statement.cs (SwitchLabel): define an ILLabel for each
15715         SwitchLabel. 
15716
15717         (Switch.CheckSwitch): If the value is a Literal, extract
15718         the underlying literal.
15719
15720         Also in the unused hashtable we had, add the SwitchLabel so we can
15721         quickly look this value up.
15722
15723         * constant.cs: Implement a bunch of new constants.  Rewrite
15724         Literal based on this.  Made changes everywhere to adapt to this.
15725
15726         * expression.cs (Expression.MakeByteBlob): Optimize routine by
15727         dereferencing array only once, and also copes with enumrations.
15728
15729         bytes are two bytes wide, not one.
15730
15731         (Cast): Perform constant conversions.
15732
15733         * ecore.cs (TryImplicitIntConversion): Return literals instead of
15734         wrappers to the literals here.
15735
15736         * expression.cs (DoNumericPromotions): long literals can converted
15737         to ulong implicity (this is taken care of elsewhere, but I was
15738         missing this spot).
15739
15740         * ecore.cs (Expression.Literalize): Make the return type Literal,
15741         to improve type checking.
15742
15743         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
15744
15745 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
15746
15747         * literal.cs: Revert code from ravi that checked the bounds.  The
15748         bounds are sane by the definition of the type itself. 
15749
15750         * typemanager.cs: Fix implementation of ImplementsInterface.  We
15751         need to actually look up in our parent hierarchy for interfaces
15752         implemented. 
15753
15754         * const.cs: Use the underlying type for enumerations
15755
15756         * delegate.cs: Compute the basename for the delegate creation,
15757         that should fix the delegate test case, and restore the correct
15758         Type Lookup semantics in rootcontext
15759
15760         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
15761         referencing a nested type with the Reflection API is using the "+"
15762         sign. 
15763
15764         * cs-parser.jay: Do not require EOF token at the end.
15765
15766 2001-12-20  Ravi Pratap  <ravi@ximian.com>
15767
15768         * rootcontext.cs (LookupType): Concatenate type names with
15769         a '.' instead of a '+' The test suite passes again.
15770
15771         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
15772         field of the enumeration.
15773
15774         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
15775         the case when the member is an EventExpr.
15776
15777         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
15778         static has an associated instance expression.
15779
15780         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
15781
15782         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
15783
15784         * class.cs (Event.Define): Register event and perform appropriate checks
15785         for error #111.
15786
15787         We define the Add and Remove methods even if the use provides none because
15788         in that case, we provide default implementations ourselves.
15789
15790         Define a private field of the type of the event. This is done by the CSC compiler
15791         and we should be doing it too ;-)
15792
15793         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
15794         More methods we use in code we generate.
15795
15796         (multicast_delegate_type, delegate_type): Two separate types since the distinction
15797         is important.
15798
15799         (InitCoreTypes): Update accordingly for the above.
15800
15801         * class.cs (Event.Emit): Generate code for default accessors that we provide
15802
15803         (EmitDefaultMethod): Do the job in the above.
15804
15805         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
15806         appropriate place.
15807
15808 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
15809
15810         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
15811         builders even if we were missing one.
15812
15813         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
15814         pass the Basename as our class name instead of the Name.  The
15815         basename will be correctly composed for us.
15816
15817         * parameter.cs (Paramters): Now takes a Location argument.
15818
15819         * decl.cs (DeclSpace.LookupType): Removed convenience function and
15820         make all the code call directly LookupType in RootContext and take
15821         this chance to pass the Location information everywhere.
15822
15823         * Everywhere: pass Location information.
15824
15825 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
15826
15827         * class.cs (Constructor.Define): Updated way of detecting the
15828         length of the parameters.
15829
15830         (TypeContainer.DefineType): Use basename as the type name for
15831         nested types.
15832
15833         (TypeContainer.Define): Do not recursively define types here, as
15834         definition is taken care in order by the RootContext.
15835
15836         * tree.cs: Keep track of namespaces in a per-file basis.
15837
15838         * parameter.cs (Parameter.ComputeSignature): Update to use
15839         DeclSpace. 
15840
15841         (Parameters.GetSignature): ditto.
15842
15843         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
15844         instead of a TypeContainer.
15845
15846         (Interface.SemanticAnalysis): Use `this' instead of our parent to
15847         resolve names.  Because we need to be resolve in our context, not
15848         our parents.
15849
15850         * driver.cs: Implement response files.
15851
15852         * class.cs (TypeContainer.DefineType): If we are defined, do not
15853         redefine ourselves.
15854
15855         (Event.Emit): Emit the code for add/remove handlers.
15856         (Event.Define): Save the MethodBuilders for add/remove.
15857
15858         * typemanager.cs: Use pair here too.
15859
15860         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
15861         DictionaryEntry requires the first argument to be non-null.  
15862
15863         (enum_declaration): Compute full name for registering the
15864         enumeration.
15865
15866         (delegate_declaration): Instead of using
15867         formal_parameter_list, use opt_formal_parameter_list as the list
15868         can be empty.
15869
15870         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
15871         (EventParsing): New property that controls whether `add' and
15872         `remove' are returned as tokens or identifiers (for events);
15873
15874 2001-12-19  Ravi Pratap  <ravi@ximian.com>
15875
15876         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
15877         use MyEventBuilder only and let it wrap the real builder for us.
15878
15879         (MyEventBuilder): Revamp constructor etc.
15880
15881         Implement all operations that we perform on EventBuilder in precisely the same
15882         way here too.
15883
15884         (FindMembers): Update to use the EventBuilder member.
15885
15886         (Event.Emit): Update accordingly.
15887
15888 2001-12-18  Ravi Pratap  <ravi@ximian.com>
15889
15890         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
15891         by calling the appropriate methods.
15892
15893         (GetCustomAttributes): Make stubs as they cannot possibly do anything
15894         useful.
15895
15896         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
15897
15898 2001-12-17  Ravi Pratap  <ravi@ximian.com>
15899
15900         * delegate.cs (Delegate.Populate): Check that the return type
15901         and various parameters types are indeed accessible.
15902
15903         * class.cs (Constructor.Define): Same here.
15904
15905         (Field.Define): Ditto.
15906
15907         (Event.Define): Ditto.
15908
15909         (Operator.Define): Check that the underlying Method defined itself
15910         correctly - so it's MethodBuilder should not be null.
15911
15912         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
15913         expression happens to be null.
15914
15915         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
15916         members but as of now we don't seem to be able to do anything really useful with it.
15917
15918         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
15919         not the EventBuilder.
15920
15921 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
15922
15923         * cs-tokenizer.cs: Add support for defines.
15924         Add support for #if, #elif, #else, #endif
15925
15926         (eval_var): evaluates a variable.
15927         (eval): stubbed for evaluating functions.
15928
15929         * cs-parser.jay: Pass the defines information
15930
15931         * driver.cs: Add --define command line option.
15932
15933         * decl.cs: Move MemberCore here.
15934
15935         Make it the base class for DeclSpace.  This allows us to catch and
15936         report 108 and 109 for everything now.
15937
15938         * class.cs (TypeContainer.Define): Extract all the members
15939         before populating and emit the warning 108 (new keyword required
15940         to override) instead of having each member implement this.
15941
15942         (MemberCore.Define): New abstract method, we will be using this in
15943         the warning reporting engine in Populate.
15944
15945         (Operator.Define): Adjust to new MemberCore protocol. 
15946
15947         * const.cs (Const): This does not derive from Expression, it is a
15948         temporary object we use to create fields, it is a MemberCore. 
15949
15950         * class.cs (Method.Define): Allow the entry point to be in a
15951         specific class.
15952
15953         * driver.cs: Rewrite the argument handler to clean it up a bit.
15954
15955         * rootcontext.cs: Made it just an auxiliary namespace feature by
15956         making everything static.
15957
15958         * driver.cs: Adapt code to use RootContext type name instead of
15959         instance variable.
15960
15961         * delegate.cs: Remove RootContext argument.
15962
15963         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
15964         argument. 
15965
15966         * class.cs (Event.Define): The lookup can fail.
15967
15968         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
15969
15970         * expression.cs: Resolve the this instance before invoking the code.
15971
15972 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
15973
15974         * cs-parser.jay: Add a production in element_access that allows
15975         the thing to become a "type" reference.  This way we can parse
15976         things like "(string [])" as a type.
15977
15978         Note that this still does not handle the more complex rules of
15979         casts. 
15980
15981
15982         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
15983
15984         * ecore.cs: (CopyNewMethods): new utility function used to
15985         assemble the list of methods from running FindMembers.
15986
15987         (MemberLookup): Rework FindMembers so that 
15988
15989 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
15990
15991         * class.cs (TypeContainer): Remove Delegates who fail to be
15992         defined.
15993
15994         * delegate.cs (Populate): Verify that we dont get null return
15995         values.   TODO: Check for AsAccessible.
15996
15997         * cs-parser.jay: Use basename to emit error 574 (destructor should
15998         have the same name as container class), not the full name.
15999
16000         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
16001         possible representation.  
16002
16003         Also implements integer type suffixes U and L.
16004
16005 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
16006
16007         * expression.cs (ArrayCreation.DoResolve): We need to do the
16008         argument resolution *always*.
16009
16010         * decl.cs: Make this hold the namespace.  Hold the root context as
16011         well.
16012         (LookupType): Move here.
16013
16014         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
16015
16016         * location.cs (Row, Name): Fixed the code, it was always returning
16017         references to the first file.
16018
16019         * interface.cs: Register properties defined through interfaces.
16020
16021         * driver.cs: Add support for globbing on the command line
16022
16023         * class.cs (Field): Make it derive from MemberCore as well.
16024         (Event): ditto.
16025
16026 2001-12-15  Ravi Pratap  <ravi@ximian.com>
16027
16028         * class.cs (Event::Define): Check that the type of the event is a delegate
16029         type else flag error #66.
16030
16031         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
16032         same.
16033
16034         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
16035         values of EntryPoint, CharSet etc etc.
16036
16037         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
16038
16039         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
16040         be null and we should ignore this. I am not sure if this is really clean. Apparently,
16041         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
16042         which needs this to do its work.
16043
16044         * ../errors/cs0066.cs : Add.
16045
16046 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
16047
16048         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
16049         helper functions.
16050
16051         * class.cs: (MethodSignature.MethodSignature): Removed hack that
16052         clears out the parameters field.
16053         (MemberSignatureCompare): Cleanup
16054
16055         (MemberCore): New base class used to share code between MethodCore
16056         and Property.
16057
16058         (RegisterRequiredImplementations) BindingFlags.Public requires
16059         either BindingFlags.Instace or Static.  Use instance here.
16060
16061         (Property): Refactored code to cope better with the full spec.
16062
16063         * parameter.cs (GetParameterInfo): Return an empty array instead
16064         of null on error.
16065
16066         * class.cs (Property): Abstract or extern properties have no bodies.
16067
16068         * parameter.cs (GetParameterInfo): return a zero-sized array.
16069
16070         * class.cs (TypeContainer.MethodModifiersValid): Move all the
16071         method modifier validation to the typecontainer so we can reuse
16072         this on properties.
16073
16074         (MethodCore.ParameterTypes): return an empty sized array of types.
16075
16076         (Property.Define): Test property modifier validity.
16077
16078         Add tests for sealed/override too.
16079
16080         (Method.Emit): abstract or extern methods have no bodies.
16081
16082 2001-12-14  Ravi Pratap  <ravi@ximian.com>
16083
16084         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
16085         thing.
16086
16087         (Method::Define, ::Emit): Modify accordingly.
16088
16089         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
16090
16091         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
16092
16093         * makefile: Pass in /unsafe.
16094
16095 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
16096
16097         * class.cs (MakeKey): Kill routine.
16098
16099         * class.cs (TypeContainer.Define): Correctly define explicit
16100         method implementations (they require the full interface name plus
16101         the method name).
16102
16103         * typemanager.cs: Deply the PtrHashtable here and stop using the
16104         lame keys.  Things work so much better.
16105
16106         This of course broke everyone who depended on `RegisterMethod' to
16107         do the `test for existance' test.  This has to be done elsewhere.
16108
16109         * support.cs (PtrHashtable): A hashtable that avoid comparing with
16110         the object stupid Equals method (because, that like fails all over
16111         the place).  We still do not use it.
16112
16113         * class.cs (TypeContainer.SetRequiredInterface,
16114         TypeContainer.RequireMethods): Killed these two routines and moved
16115         all the functionality to RegisterRequiredImplementations.
16116
16117         (TypeContainer.RegisterRequiredImplementations): This routine now
16118         registers all the implementations required in an array for the
16119         interfaces and abstract methods.  We use an array of structures
16120         which can be computed ahead of time to reduce memory usage and we
16121         also assume that lookups are cheap as most classes will not
16122         implement too many interfaces.
16123
16124         We also avoid creating too many MethodSignatures.
16125
16126         (TypeContainer.IsInterfaceMethod): Update and optionally does not
16127         clear the "pending" bit if we find that there are problems with
16128         the declaration.
16129
16130         (TypeContainer.VerifyPendingMethods): Update to report errors of
16131         methods that look like implementations but are not.
16132
16133         (TypeContainer.Define): Add support for explicit interface method
16134         implementation. 
16135
16136 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
16137
16138         * typemanager.cs: Keep track of the parameters here instead of
16139         being a feature of the TypeContainer.
16140
16141         * class.cs: Drop the registration of parameters here, as
16142         InterfaceMethods are also interface declarations.
16143
16144         * delegate.cs: Register methods with the TypeManager not only with
16145         the TypeContainer.  This code was buggy.
16146
16147         * interface.cs: Full registation here.
16148
16149 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
16150
16151         * expression.cs: Remove reducer for binary expressions, it can not
16152         be done this way.
16153
16154         * const.cs: Put here the code that used to go into constant.cs
16155
16156         * constant.cs: Put here the code for constants, this is a new base
16157         class for Literals.
16158
16159         * literal.cs: Make Literal derive from Constant.
16160
16161 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
16162
16163         * statement.cs (Return.Emit): Report error 157 if the user
16164         attempts to return from a finally block.
16165
16166         (Return.Emit): Instead of emitting a return, jump to the end of
16167         the function.
16168
16169         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
16170         LocalBuilder to store the result of the function.  ReturnLabel is
16171         the target where we jump.
16172
16173
16174 2001-12-09  Radek Doulik  <rodo@ximian.com>
16175
16176         * cs-parser.jay: remember alias in current namespace
16177
16178         * ecore.cs (SimpleName::DoResolve): use aliases for types or
16179         namespaces
16180
16181         * class.cs (LookupAlias): lookup alias in my_namespace
16182
16183         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
16184         aliases hashtable
16185         (LookupAlias): lookup alias in this and if needed in parent
16186         namespaces
16187
16188 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
16189
16190         * support.cs: 
16191
16192         * rootcontext.cs: (ModuleBuilder) Made static, first step into
16193         making things static.  I need this to avoid passing the
16194         TypeContainer when calling ParameterType.
16195
16196         * support.cs (InternalParameters.ParameterType): Remove ugly hack
16197         that did string manipulation to compute the type and then call
16198         GetType.  Use Parameter.ParameterType instead.
16199
16200         * cs-tokenizer.cs: Consume the suffix for floating values.
16201
16202         * expression.cs (ParameterReference): figure out whether this is a
16203         reference parameter or not.  Kill an extra variable by computing
16204         the arg_idx during emission.
16205
16206         * parameter.cs (Parameters.GetParameterInfo): New overloaded
16207         function that returns whether a parameter is an out/ref value or not.
16208
16209         (Parameter.ParameterType): The type of the parameter (base,
16210         without ref/out applied).
16211
16212         (Parameter.Resolve): Perform resolution here.
16213         (Parameter.ExternalType): The full type (with ref/out applied).
16214
16215         * statement.cs (Using.Emit, Using.EmitExpression): Implement
16216         support for expressions on the using statement.
16217
16218 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
16219
16220         * statement.cs (Using.EmitLocalVariableDecls): Split the
16221         localvariable handling of the using statement.
16222
16223         (Block.EmitMeta): Keep track of variable count across blocks.  We
16224         were reusing slots on separate branches of blocks.
16225
16226         (Try.Emit): Emit the general code block, we were not emitting it. 
16227
16228         Check the type of the declaration to be an IDisposable or
16229         something that can be implicity converted to it. 
16230
16231         Emit conversions if required.
16232
16233         * ecore.cs (EmptyExpression): New utility class.
16234         (Expression.ImplicitConversionExists): New utility function.
16235
16236 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
16237
16238         * statement.cs (Using): Implement.
16239
16240         * expression.cs (LocalVariableReference): Support read only variables.
16241
16242         * statement.cs: Remove the explicit emit for the Leave opcode.
16243         (VariableInfo): Add a readonly field.
16244
16245 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
16246
16247         * ecore.cs (ConvCast): new class used to encapsulate the various
16248         explicit integer conversions that works in both checked and
16249         unchecked contexts.
16250
16251         (Expression.ConvertNumericExplicit): Use new ConvCast class to
16252         properly generate the overflow opcodes.
16253
16254 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
16255
16256         * statement.cs: The correct type for the EmptyExpression is the
16257         element_type, not the variable type.  Ravi pointed this out.
16258
16259 2001-12-04  Ravi Pratap  <ravi@ximian.com>
16260
16261         * class.cs (Method::Define): Handle PInvoke methods specially
16262         by using DefinePInvokeMethod instead of the usual one.
16263
16264         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
16265         above to do the task of extracting information and defining the method.
16266
16267 2001-12-04  Ravi Pratap  <ravi@ximian.com>
16268
16269         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
16270         of the condition for string type.
16271
16272         (Emit): Move that here. 
16273
16274         (ArrayCreation::CheckIndices): Keep string literals in their expression
16275         form.
16276
16277         (EmitDynamicInitializers): Handle strings appropriately.
16278
16279 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
16280
16281         * codegen.cs (EmitContext): Replace multiple variables with a
16282         single pointer to the current Switch statement.
16283
16284         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
16285         EmitContext.
16286
16287 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
16288
16289         * statement.cs 
16290
16291         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
16292         default'.
16293
16294         (Foreach.Emit): Foreach on arrays was not setting
16295         up the loop variables (for break/continue).
16296
16297         (GotoCase): Semi-implented.
16298
16299 2001-12-03  Ravi Pratap  <ravi@ximian.com>
16300
16301         * attribute.cs (CheckAttribute): Handle system attributes by using
16302         Attribute.GetAttributes to examine information we need.
16303
16304         (GetValidPlaces): Same here.
16305
16306         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
16307
16308         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
16309
16310         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
16311
16312         (Method::Define): Set appropriate flags if we have a DllImport attribute.
16313
16314         (Method::Emit): Handle the case when we are a PInvoke method.
16315
16316 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
16317
16318         * expression.cs: Use ResolveWithSimpleName on compound names.
16319
16320 2001-12-02  Ravi Pratap  <ravi@ximian.com>
16321
16322         * constant.cs (EmitConstant): Make sure we resolve the associated expression
16323         before trying to reduce it.
16324
16325         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
16326
16327         * constant.cs (LookupConstantValue): Implement.
16328
16329         (EmitConstant): Use the above in emitting the constant.
16330
16331         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
16332         that are user-defined by doing a LookupConstantValue on them.
16333
16334         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
16335         too, like above.
16336
16337 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
16338
16339         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
16340
16341         (BaseAccess.DoResolve): Implement.
16342
16343         (MemberAccess.DoResolve): Split this routine into a
16344         ResolveMemberAccess routine that can be used independently
16345
16346 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
16347
16348         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
16349         As that share bits of the implementation.  Is returns a boolean,
16350         while As returns the Type that is being probed.
16351
16352 2001-12-01  Ravi Pratap  <ravi@ximian.com>
16353
16354         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
16355         instead of a Literal - much easier.
16356
16357         (EnumInTransit): Remove - utterly useless :-)
16358
16359         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
16360
16361         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
16362
16363         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
16364         chain when we have no associated expression.
16365
16366 2001-11-30  Ravi Pratap  <ravi@ximian.com>
16367
16368         * constant.cs (Define): Use Location while reporting the errror.
16369
16370         Also emit a warning when 'new' is used and there is no inherited
16371         member to hide.
16372
16373         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
16374         populated.
16375
16376         (LookupEnumValue): Implement to lookup an enum member's value and define it
16377         if necessary.
16378
16379         (Populate): Re-write accordingly to use the above routine.
16380
16381 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
16382
16383         * expression.cs (This): Fix prototype for DoResolveLValue to
16384         override the base class DoResolveLValue.
16385
16386         * cs-parser.cs: Report errors cs574 and cs575 (destructor
16387         declarations) 
16388
16389         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
16390         (we need to load the address of the field here).  This fixes
16391         test-22. 
16392
16393         (FieldExpr.DoResolveLValue): Call the DoResolve
16394         function to initialize the Instance expression.
16395
16396         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
16397         correctly the GetEnumerator operation on a value type.
16398
16399         * cs-parser.jay: Add more simple parsing error catches.
16400
16401         * statement.cs (Switch): Add support for string switches.
16402         Handle null specially.
16403
16404         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
16405
16406 2001-11-28  Ravi Pratap  <ravi@ximian.com>
16407
16408         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
16409
16410         (declare_local_constant): New helper function.
16411
16412         * statement.cs (AddConstant): Keep a separate record of constants
16413
16414         (IsConstant): Implement to determine if a variable is a constant.
16415
16416         (GetConstantExpression): Implement.
16417
16418         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
16419
16420         * statement.cs (IsVariableDefined): Re-write.
16421
16422 2001-11-27  Ravi Pratap  <ravi@ximian.com>
16423
16424         * class.cs (TypeContainer::FindMembers): Look for constants
16425         in the case when we are looking for MemberTypes.Field
16426
16427         * expression.cs (MemberAccess::DoResolve): Check that in the
16428         case we are a FieldExpr and a Literal, we are not being accessed
16429         by an instance reference.
16430
16431         * cs-parser.jay (local_constant_declaration): Implement.
16432
16433         (declaration_statement): Implement for constant declarations.
16434
16435 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
16436
16437         * statement.cs (Switch): Catch double defaults.
16438
16439         (Switch): More work on the switch() statement
16440         implementation.  It works for integral values now, need to finish
16441         string support.
16442
16443
16444 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
16445
16446         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
16447         integer literals into other integer literals.  To be used by
16448         switch. 
16449
16450 2001-11-24  Ravi Pratap  <ravi@ximian.com>
16451
16452         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
16453         some memory.
16454
16455         (EmitDynamicInitializers): Cope with the above since we extract data
16456         directly from ArrayData now.
16457
16458         (ExpectInitializers): Keep track of whether initializers are mandatory
16459         or not.
16460
16461         (Bounds): Make it a hashtable to prevent the same dimension being 
16462         recorded for every element in that dimension.
16463
16464         (EmitDynamicInitializers): Fix bug which prevented the Set array method
16465         from being found.
16466
16467         Also fix bug which was causing the indices to be emitted in the reverse
16468         order.
16469
16470 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
16471
16472         * expression.cs (ArrayCreation): Implement the bits that Ravi left
16473         unfinished.  They do not work, because the underlying code is
16474         sloppy.
16475
16476 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
16477
16478         * cs-parser.jay: Remove bogus fixme.
16479
16480         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
16481         on Switch statement.
16482
16483 2001-11-23  Ravi Pratap  <ravi@ximian.com>
16484
16485         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
16486         the same. 
16487
16488         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
16489         parameter. Apparently, any expression is allowed. 
16490
16491         (ValidateInitializers): Update accordingly.
16492
16493         (CheckIndices): Fix some tricky bugs thanks to recursion.
16494
16495         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
16496         I was being completely brain-dead.
16497
16498         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
16499         and re-write acordingly.
16500
16501         (DelegateInvocation): Re-write accordingly.
16502
16503         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
16504
16505         (MakeByteBlob): Handle types more correctly.
16506
16507         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
16508         initialization from expressions but it is incomplete because I am a complete
16509         Dodo :-|
16510
16511 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
16512
16513         * statement.cs (If.Emit): Fix a bug that generated incorrect code
16514         on If.  Basically, we have to return `true' (ie, we do return to
16515         our caller) only if both branches of the if return.
16516
16517         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
16518         short-circuit operators, handle them as short circuit operators. 
16519
16520         (Cast.DoResolve): Resolve type.
16521         (Cast.Cast): Take an expression as the target type.
16522
16523         * cs-parser.jay (cast_expression): Remove old hack that only
16524         allowed a limited set of types to be handled.  Now we take a
16525         unary_expression and we resolve to a type during semantic
16526         analysis.
16527
16528         Use the grammar productions from Rhys to handle casts (this is
16529         not complete like Rhys syntax yet, we fail to handle that corner
16530         case that C# has regarding (-x), but we will get there.
16531
16532 2001-11-22  Ravi Pratap  <ravi@ximian.com>
16533
16534         * class.cs (EmitFieldInitializer): Take care of the case when we have a
16535         field which is an array type.
16536
16537         * cs-parser.jay (declare_local_variables): Support array initialization too.
16538
16539         * typemanager.cs (MakeKey): Implement.
16540
16541         (everywhere): Use the above appropriately.
16542
16543         * cs-parser.jay (for_statement): Update for array initialization while
16544         declaring variables.
16545
16546         * ecore.cs : The error message was correct, it's the variable's names that
16547         were misleading ;-) Make the code more readable.
16548
16549         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
16550         the correct type etc.
16551
16552         (ConvertExplicit): Handle Enum types by examining the underlying type.
16553
16554 2001-11-21  Ravi Pratap  <ravi@ximian.com>
16555
16556         * parameter.cs (GetCallingConvention): Always return
16557         CallingConventions.Standard for now.
16558
16559 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
16560
16561         * expression.cs (Binary.ResolveOperator): Update the values of `l'
16562         and `r' after calling DoNumericPromotions.
16563
16564         * ecore.cs: Fix error message (the types were in the wrong order).
16565
16566         * statement.cs (Foreach.ProbeCollectionType): Need to pass
16567         BindingFlags.Instance as well 
16568
16569         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
16570         implicit int literal conversion in an empty cast so that we
16571         propagate the right type upstream.
16572
16573         (UnboxCast): new class used to unbox value types.
16574         (Expression.ConvertExplicit): Add explicit type conversions done
16575         by unboxing.
16576
16577         (Expression.ImplicitNumericConversion): Oops, forgot to test for
16578         the target type before applying the implicit LongLiterals to ULong
16579         literal cast.
16580
16581 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
16582
16583         * cs-parser.jay (for_statement): Reworked the way For works: now
16584         we declare manually any variables that are introduced in
16585         for_initializer to solve the problem of having out-of-band code
16586         emition (that is what got for broken).
16587
16588         (declaration_statement): Perform the actual variable declaration
16589         that used to be done in local_variable_declaration here.
16590
16591         (local_variable_declaration): Do not declare anything, just pass
16592         the information on a DictionaryEntry
16593
16594 2001-11-20  Ravi Pratap  <ravi@ximian.com>
16595
16596         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
16597         re-write of the logic to now make it recursive.
16598
16599         (UpdateIndices): Re-write accordingly.
16600
16601         Store element data in a separate ArrayData list in the above methods.
16602
16603         (MakeByteBlob): Implement to dump the array data into a byte array.
16604
16605 2001-11-19  Ravi Pratap  <ravi@ximian.com>
16606
16607         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
16608         into CheckIndices.
16609
16610         * constant.cs (Define): Implement.
16611
16612         (EmitConstant): Re-write fully.
16613
16614         Pass in location info.
16615
16616         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
16617         respectively.
16618
16619         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
16620         DictionaryEntry since we need location info too.
16621
16622         (constant_declaration): Update accordingly.
16623
16624         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
16625         code into another method : UpdateIndices.
16626
16627 2001-11-18  Ravi Pratap  <ravi@ximian.com>
16628
16629         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
16630         some type checking etc.
16631
16632 2001-11-17  Ravi Pratap  <ravi@ximian.com>
16633
16634         * expression.cs (ArrayCreation::ValidateInitializers): Implement
16635         bits to provide dimension info if the user skips doing that.
16636
16637         Update second constructor to store the rank correctly.
16638
16639 2001-11-16  Ravi Pratap  <ravi@ximian.com>
16640
16641         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
16642         and try to implement.
16643
16644         * ../errors/cs0150.cs : Add.
16645
16646         * ../errors/cs0178.cs : Add.
16647
16648 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
16649
16650         * statement.cs: Implement foreach on multi-dimensional arrays. 
16651
16652         * parameter.cs (Parameters.GetParameterByName): Also lookup the
16653         name of the params argument.
16654
16655         * expression.cs: Use EmitStoreOpcode to get the right opcode while
16656         initializing the array.
16657
16658         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
16659         we can use this elsewhere.
16660
16661         * statement.cs: Finish implementation of foreach for single
16662         dimension arrays.
16663
16664         * cs-parser.jay: Use an out-of-band stack to pass information
16665         around, I wonder why I need this.
16666
16667         foreach_block: Make the new foreach_block the current_block.
16668
16669         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
16670         function used to return a static Parameters structure.  Used for
16671         empty parameters, as those are created very frequently.
16672
16673         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
16674
16675 2001-11-15  Ravi Pratap  <ravi@ximian.com>
16676
16677         * interface.cs : Default modifier is private, not public. The
16678         make verify test passes again.
16679
16680 2001-11-15  Ravi Pratap  <ravi@ximian.com>
16681
16682         * support.cs (ReflectionParameters): Fix logic to determine
16683         whether the last parameter is a params one. Test 9 passes again.
16684
16685         * delegate.cs (Populate): Register the builders we define with
16686         RegisterParameterForBuilder. Test 19 passes again.
16687
16688         * cs-parser.jay (property_declaration): Reference $6 instead
16689         of $$ to get at the location.
16690
16691         (indexer_declaration): Similar stuff.
16692
16693         (attribute): Ditto.
16694
16695         * class.cs (Property): Register parameters for the Get and Set methods
16696         if they exist. Test 23 passes again.
16697
16698         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
16699         call to EmitArguments as we are sure there aren't any params arguments. 
16700         Test 32 passes again.
16701
16702         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
16703         IndexOutOfRangeException. 
16704
16705         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
16706         Test 33 now passes again.
16707
16708 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
16709
16710         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
16711         broke a bunch of things.  Will have to come up with a better way
16712         of tracking locations.
16713
16714         * statement.cs: Implemented foreach for single dimension arrays.
16715
16716 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
16717
16718         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
16719         an error.  This removes the lookup from the critical path.
16720
16721         * cs-parser.jay: Removed use of temporary_loc, which is completely
16722         broken. 
16723
16724 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
16725
16726         * support.cs (ReflectionParameters.ParameterModifier): Report
16727         whether the argument is a PARAMS argument or not.
16728
16729         * class.cs: Set the attribute `ParamArrayAttribute' on the
16730         parameter argument.
16731
16732         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
16733         and cons_param_array_attribute (ConstructorInfo for
16734         ParamArrayAttribute)., 
16735
16736         * codegen.cs: Emit the return using the `Return' statement, that
16737         way we can report the error correctly for missing return values. 
16738
16739         * class.cs (Method.Emit): Clean up.
16740
16741         * expression.cs (Argument.Resolve): Take another argument: the
16742         location where this argument is used.  Notice that this is not
16743         part of the "Argument" class as to reduce the size of the
16744         structure (we know the approximate location anyways).
16745
16746         Test if the argument is a variable-reference, if not, then
16747         complain with a 206.
16748
16749         (Argument.Emit): Emit addresses of variables.
16750
16751         (Argument.FullDesc): Simplify.
16752
16753         (Invocation.DoResolve): Update for Argument.Resolve.
16754
16755         (ElementAccess.DoResolve): ditto.
16756
16757         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
16758         method should be virtual, as this method is always virtual.
16759
16760         (NewDelegate.DoResolve): Update for Argument.Resolve.
16761
16762         * class.cs (ConstructorInitializer.DoResolve): ditto.
16763
16764         * attribute.cs (Attribute.Resolve): ditto.
16765
16766 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
16767
16768         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
16769
16770         * expression.cs (ParameterReference): Drop IStackStorage and implement
16771         IAssignMethod instead. 
16772
16773         (LocalVariableReference): ditto.
16774
16775         * ecore.cs (FieldExpr): Drop IStackStorage and implement
16776         IAssignMethod instead. 
16777
16778 2001-11-13  Miguel de Icaza <miguel@ximian.com>
16779
16780         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
16781         enumerations that are used in heavily used structures derive from
16782         byte in a laughable and pathetic attempt to reduce memory usage.
16783         This is the kind of pre-optimzations that you should not do at
16784         home without adult supervision.
16785
16786         * expression.cs (UnaryMutator): New class, used to handle ++ and
16787         -- separatedly from the other unary operators.  Cleans up the
16788         code, and kills the ExpressionStatement dependency in Unary.
16789
16790         (Unary): Removed `method' and `Arguments' from this class, making
16791         it smaller, and moving it all to SimpleCall, so I can reuse this
16792         code in other locations and avoid creating a lot of transient data
16793         strucutres when not required.
16794
16795         * cs-parser.jay: Adjust for new changes.
16796
16797 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
16798
16799         * enum.cs (Enum.Populate): If there is a failure during
16800         definition, return
16801
16802         * cs-parser.jay (opt_enum_base): we used to catch type errors
16803         here, but this is really incorrect.  The type error should be
16804         catched during semantic analysis.
16805
16806 2001-12-11  Ravi Pratap  <ravi@ximian.com>
16807
16808         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
16809         current_local_parameters as expected since I, in my stupidity, had forgotten
16810         to do this :-)
16811
16812         * attribute.cs (GetValidPlaces): Fix stupid bug.
16813
16814         * class.cs (Method::Emit): Perform check on applicability of attributes.
16815
16816         (Constructor::Emit): Ditto.
16817
16818         (Field::Emit): Ditto.
16819
16820         (Field.Location): Store location information.
16821
16822         (Property, Event, Indexer, Operator): Ditto.
16823
16824         * cs-parser.jay (field_declaration): Pass in location for each field.
16825
16826         * ../errors/cs0592.cs : Add.
16827
16828 2001-11-12  Ravi Pratap  <ravi@ximian.com>
16829
16830         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
16831
16832         (InitCoreTypes): Update accordingly.
16833
16834         (RegisterAttrType, LookupAttr): Implement.
16835
16836         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
16837         info about the same.
16838
16839         (Resolve): Update to populate the above as necessary.
16840
16841         (Error592): Helper.
16842
16843         (GetValidPlaces): Helper to the above.
16844
16845         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
16846
16847         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
16848
16849 2001-11-12  Ravi Pratap  <ravi@ximian.com>
16850
16851         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
16852
16853         * ../errors/cs0617.cs : Add.
16854
16855 2001-11-11  Ravi Pratap  <ravi@ximian.com>
16856
16857         * enum.cs (Emit): Rename to Populate to be more consistent with what
16858         we expect it to do and when exactly it is called.
16859
16860         * class.cs, rootcontext.cs : Update accordingly.
16861
16862         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
16863         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
16864
16865         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
16866
16867         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
16868         of a fieldinfo using the above, when dealing with a FieldBuilder.
16869
16870 2001-11-10  Ravi Pratap  <ravi@ximian.com>
16871
16872         * ../errors/cs0031.cs : Add.
16873
16874         * ../errors/cs1008.cs : Add.
16875
16876         * ../errrors/cs0543.cs : Add.
16877
16878         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
16879         enum type.
16880
16881         (FindMembers): Implement.
16882
16883         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
16884         enums and delegates too.
16885
16886         (enum_types): Rename to builder_to_enum.
16887
16888         (delegate_types): Rename to builder_to_delegate.
16889
16890         * delegate.cs (FindMembers): Implement.
16891
16892 2001-11-09  Ravi Pratap  <ravi@ximian.com>
16893
16894         * typemanager.cs (IsEnumType): Implement.
16895
16896         * enum.cs (Emit): Re-write parts to account for the underlying type
16897         better and perform checking etc.
16898
16899         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
16900         of the underlying type.
16901
16902         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
16903         value
16904
16905         * enum.cs (error31): Helper to report error #31.
16906
16907         * cs-parser.jay (enum_declaration): Store location of each member too.
16908
16909         * enum.cs (member_to_location): New hashtable. 
16910
16911         (AddEnumMember): Update location hashtable.
16912
16913         (Emit): Use the location of each member while reporting errors.
16914
16915 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
16916
16917         * cs-parser.jay: A for_initializer if is a
16918         local_variable_declaration really ammount to have an implicit
16919         block with the variable declaration and no initializer for for.
16920
16921         * statement.cs (For.Emit): Cope with null initializers.
16922
16923         This fixes the infinite loop on for initializers.
16924
16925 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
16926
16927         * enum.cs: More cleanup.
16928
16929         * ecore.cs: Remove dead code.
16930
16931         * class.cs (Property.Emit): More simplification.
16932         (Event.Emit): ditto.
16933
16934         Reworked to have less levels of indentation.
16935
16936 2001-11-08  Ravi Pratap  <ravi@ximian.com>
16937
16938         * class.cs (Property): Emit attributes.
16939
16940         (Field): Ditto.
16941
16942         (Event): Ditto.
16943
16944         (Indexer): Ditto.
16945
16946         (Operator): Ditto.
16947
16948         * enum.cs (Emit): Ditto.
16949
16950         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
16951         Enums too.
16952
16953         * class.cs (Field, Event, etc.): Move attribute generation into the
16954         Emit method everywhere.
16955
16956         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
16957         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
16958         as we had no way of defining nested enums !
16959
16960         * rootcontext.cs : Adjust code accordingly.
16961
16962         * typemanager.cs (AddEnumType): To keep track of enum types separately.
16963
16964 2001-11-07  Ravi Pratap  <ravi@ximian.com>
16965
16966         * expression.cs (EvalConstantExpression): Move into ecore.cs
16967
16968         * enum.cs (Enum): Rename some members and make them public and readonly
16969         according to our convention.
16970
16971         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
16972         nothing else.
16973
16974         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
16975
16976         (Enum::Emit): Write a simple version for now which doesn't try to compute
16977         expressions. I shall modify this to be more robust in just a while.
16978
16979         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
16980
16981         (TypeContainer::CloseType): Create the Enum types too.
16982
16983         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
16984
16985         * expression.cs (EvalConstantExpression): Get rid of completely.
16986
16987         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
16988         user-defined values and other cases.
16989
16990         (IsValidEnumLiteral): Helper function.
16991
16992         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
16993         out there in the case we had a literal FieldExpr.
16994
16995         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
16996
16997         (Literalize): Revamp a bit to take two arguments.
16998
16999         (EnumLiteral): New class which derives from Literal to wrap enum literals.
17000
17001 2001-11-06  Ravi Pratap  <ravi@ximian.com>
17002
17003         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
17004
17005         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
17006
17007         (Resolve): Use the above to ensure we have proper initializers.
17008
17009 2001-11-05  Ravi Pratap  <ravi@ximian.com>
17010
17011         * expression.cs (Expression::EvalConstantExpression): New method to 
17012         evaluate constant expressions.
17013
17014         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
17015
17016 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
17017
17018         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
17019         in an array.
17020
17021         (Binary.ResolveOperator): Handle operator != (object a, object b)
17022         and operator == (object a, object b);
17023
17024         (Binary.DoNumericPromotions): Indicate whether the numeric
17025         promotion was possible.
17026
17027         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
17028         Implement.  
17029
17030         Made the ArrayAccess implement interface IAssignMethod instead of
17031         IStackStore as the order in which arguments are passed reflects
17032         this.
17033
17034         * assign.cs: Instead of using expr.ExprClass to select the way of
17035         assinging, probe for the IStackStore/IAssignMethod interfaces.
17036
17037         * typemanager.cs: Load InitializeArray definition.
17038
17039         * rootcontext.cs (RootContext.MakeStaticData): Used to define
17040         static data that can be used to initialize arrays. 
17041
17042 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
17043
17044         * expression.cs: Handle operator== and operator!= for booleans.
17045
17046         (Conditioal.Reduce): Implement reducer for the ?: operator.
17047
17048         (Conditional.Resolve): Implement dead code elimination.
17049
17050         (Binary.Resolve): Catch string literals and return a new
17051         concatenated string.
17052
17053         (Unary.Reduce): Implement reduction of unary expressions.
17054
17055         * ecore.cs: Split out the expression core handling here.
17056
17057         (Expression.Reduce): New method used to perform constant folding
17058         and CSE.  This is needed to support constant-expressions. 
17059
17060         * statement.cs (Statement.EmitBoolExpression): Pass true and false
17061         targets, and optimize for !x.
17062
17063 2001-11-04  Ravi Pratap  <ravi@ximian.com>
17064
17065         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
17066         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
17067         set custom atttributes.
17068
17069         * literal.cs (Literal::GetValue): New abstract method to return the actual
17070         value of the literal, cast as an object.
17071
17072         (*Literal): Implement GetValue method.
17073
17074         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
17075         expressions to the arraylist but objects of type Argument.
17076
17077         * class.cs (TypeContainer::Emit): Emit our attributes too.
17078
17079         (Method::Emit, Constructor::Emit): Ditto.
17080
17081         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
17082         to be ignoring earlier.
17083
17084 2001-11-03  Ravi Pratap  <ravi@ximian.com>
17085
17086         * attribute.cs (AttributeSection::Define): Implement to do the business
17087         of constructing a CustomAttributeBuilder.
17088
17089         (Attribute): New trivial class. Increases readability of code.  
17090
17091         * cs-parser.jay : Update accordingly.
17092
17093         (positional_argument_list, named_argument_list, named_argument): New rules
17094
17095         (attribute_arguments): Use the above so that we are more correct.
17096
17097 2001-11-02  Ravi Pratap  <ravi@ximian.com>
17098
17099         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
17100         to perform all checks for a method with a params parameter.
17101
17102         (Invocation::OverloadResolve): Update to use the above method and therefore
17103         cope correctly with params method invocations.
17104
17105         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
17106         params too.
17107
17108         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
17109         constructors in our parent too because we can't afford to miss out on 
17110         protected ones ;-)
17111
17112         * attribute.cs (AttributeSection): New name for the class Attribute
17113
17114         Other trivial changes to improve readability.
17115
17116         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
17117         use the new class names.
17118
17119 2001-11-01  Ravi Pratap  <ravi@ximian.com>
17120
17121         * class.cs (Method::Define): Complete definition for params types too
17122
17123         (Indexer::Define): Ditto.
17124
17125         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
17126         Cope everywhere with a request for info about the array parameter.
17127
17128 2001-11-01  Ravi Pratap  <ravi@ximian.com>
17129
17130         * tree.cs (RecordNamespace): Fix up to check for the correct key.
17131
17132         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
17133         local_variable_type to extract the string corresponding to the type.
17134
17135         (local_variable_type): Fixup the action to use the new helper method.
17136
17137         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
17138         go.
17139
17140         * expression.cs : Clean out code which uses the above.
17141
17142 2001-10-31  Ravi Pratap  <ravi@ximian.com>
17143
17144         * typemanager.cs (RegisterMethod): Check if we already have an existing key
17145         and bale out if necessary by returning a false.
17146
17147         (RegisterProperty): Ditto.
17148
17149         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
17150         and print out appropriate error messages.
17151
17152         * interface.cs (everywhere): Ditto.
17153
17154         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
17155         location to constructor.
17156
17157         * class.cs (Property, Event, Indexer): Update accordingly.
17158
17159         * ../errors/cs111.cs : Added.
17160
17161         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
17162         of a method, as laid down by the spec.
17163
17164         (Invocation::OverloadResolve): Use the above method.
17165
17166 2001-10-31  Ravi Pratap  <ravi@ximian.com>
17167
17168         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
17169         now take a TypeContainer and a Parameters object.
17170
17171         (ParameterData): Modify return type of ParameterModifier method to be 
17172         Parameter.Modifier and not a string.
17173
17174         (ReflectionParameters, InternalParameters): Update accordingly.
17175
17176         * expression.cs (Argument::GetParameterModifier): Same here.
17177
17178         * support.cs (InternalParameters::ParameterType): Find a better way of determining
17179         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
17180         symbol in it at all so maybe this is only for now.
17181
17182 2001-10-30  Ravi Pratap  <ravi@ximian.com>
17183
17184         * support.cs (InternalParameters): Constructor now takes an extra argument 
17185         which is the actual Parameters class.
17186
17187         (ParameterDesc): Update to provide info on ref/out modifiers.
17188
17189         * class.cs (everywhere): Update call to InternalParameters to pass in
17190         the second argument too.
17191
17192         * support.cs (ParameterData): Add ParameterModifier, which is a method 
17193         to return the modifier info [ref/out etc]
17194
17195         (InternalParameters, ReflectionParameters): Implement the above.
17196
17197         * expression.cs (Argument::ParameterModifier): Similar function to return
17198         info about the argument's modifiers.
17199
17200         (Invocation::OverloadResolve): Update to take into account matching modifiers 
17201         too.
17202
17203         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
17204         a new SetFormalParameters object which we pass to InternalParameters.
17205
17206 2001-10-30  Ravi Pratap  <ravi@ximian.com>
17207
17208         * expression.cs (NewArray): Merge into the ArrayCreation class.
17209
17210 2001-10-29  Ravi Pratap  <ravi@ximian.com>
17211
17212         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
17213         NewUserdefinedArray into one as there wasn't much of a use in having
17214         two separate ones.
17215
17216         * expression.cs (Argument): Change field's name to ArgType from Type.
17217
17218         (Type): New readonly property which returns the proper type, taking into 
17219         account ref/out modifiers.
17220
17221         (everywhere): Adjust code accordingly for the above.
17222
17223         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
17224         whether we are emitting for a ref or out parameter.
17225
17226         * expression.cs (Argument::Emit): Use the above field to set the state.
17227
17228         (LocalVariableReference::Emit): Update to honour the flag and emit the
17229         right stuff.
17230
17231         * parameter.cs (Attributes): Set the correct flags for ref parameters.
17232
17233         * expression.cs (Argument::FullDesc): New function to provide a full desc.
17234
17235         * support.cs (ParameterData): Add method ParameterDesc to the interface.
17236
17237         (ReflectionParameters, InternalParameters): Implement the above method.
17238
17239         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
17240         reporting errors.
17241
17242         (Invocation::FullMethodDesc): Ditto. 
17243
17244 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
17245
17246         * cs-parser.jay: Add extra production for the second form of array
17247         creation. 
17248
17249         * expression.cs (ArrayCreation): Update to reflect the above
17250         change. 
17251
17252         * Small changes to prepare for Array initialization.
17253
17254 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
17255
17256         * typemanager.cs (ImplementsInterface): interface might be null;
17257         Deal with this problem;
17258
17259         Also, we do store negative hits on the cache (null values), so use
17260         this instead of calling t.GetInterfaces on the type everytime.
17261
17262 2001-10-28  Ravi Pratap  <ravi@ximian.com>
17263
17264         * typemanager.cs (IsBuiltinType): New method to help determine the same.
17265
17266         * expression.cs (New::DoResolve): Get rid of array creation code and instead
17267         split functionality out into different classes.
17268
17269         (New::FormArrayType): Move into NewBuiltinArray.
17270
17271         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
17272         quite useless.
17273
17274         (NewBuiltinArray): New class to handle creation of built-in arrays.
17275
17276         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
17277         account creation of one-dimensional arrays.
17278
17279         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
17280
17281         (NewUserdefinedArray::DoResolve): Implement.
17282
17283         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
17284
17285         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
17286         we maintain inside the TypeManager. This is necessary to perform lookups on the
17287         module builder.
17288
17289         (LookupType): Update to perform GetType on the module builders too.     
17290
17291         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
17292
17293         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
17294
17295 2001-10-23  Ravi Pratap  <ravi@ximian.com>
17296
17297         * expression.cs (New::DoResolve): Implement guts of array creation.
17298
17299         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
17300
17301 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
17302
17303         * expression.cs: Fix bug I introduced lsat night that broke
17304         Delegates. 
17305
17306         (Expression.Resolve): Report a 246 error (can not resolve name)
17307         if we find a SimpleName in the stream.
17308
17309         (Expression.ResolveLValue): Ditto.
17310
17311         (Expression.ResolveWithSimpleName): This function is a variant of
17312         ResolveName, this one allows SimpleNames to be returned without a
17313         warning.  The only consumer of SimpleNames is MemberAccess
17314
17315 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
17316
17317         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
17318         might arrive here.  I have my doubts that this is correct.
17319
17320         * statement.cs (Lock): Implement lock statement.
17321
17322         * cs-parser.jay: Small fixes to support `lock' and `using'
17323
17324         * cs-tokenizer.cs: Remove extra space
17325
17326         * driver.cs: New flag --checked, allows to turn on integer math
17327         checking. 
17328
17329         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
17330         Threading.Monitor.Exit 
17331
17332 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
17333
17334         * expression.cs (IndexerAccess::DoResolveLValue): Set the
17335         Expression Class to be IndexerAccess.
17336
17337         Notice that Indexer::DoResolve sets the eclass to Value.
17338
17339 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
17340
17341         * class.cs (TypeContainer::Emit): Emit code for indexers.
17342
17343         * assign.cs (IAssignMethod): New interface implemented by Indexers
17344         and Properties for handling assignment.
17345
17346         (Assign::Emit): Simplify and reuse code. 
17347
17348         * expression.cs (IndexerAccess, PropertyExpr): Implement
17349         IAssignMethod, clean up old code. 
17350
17351 2001-10-22  Ravi Pratap  <ravi@ximian.com>
17352
17353         * typemanager.cs (ImplementsInterface): New method to determine if a type
17354         implements a given interface. Provides a nice cache too.
17355
17356         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
17357         method.
17358
17359         (ConvertReferenceExplicit): Ditto.
17360
17361         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
17362         various methods, with correct names etc.
17363
17364         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
17365         Operator.UnaryNegation.
17366
17367         * cs-parser.jay (operator_declarator): Be a little clever in the case where
17368         we have a unary plus or minus operator.
17369
17370         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
17371         UnaryMinus.
17372
17373         * everywhere : update accordingly.
17374
17375         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
17376         respectively.
17377
17378         * class.cs (Method::Define): For the case where we are implementing a method
17379         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
17380         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
17381
17382 2001-10-21  Ravi Pratap  <ravi@ximian.com>
17383
17384         * interface.cs (FindMembers): Implement to work around S.R.E
17385         lameness.
17386
17387         * typemanager.cs (IsInterfaceType): Implement.
17388
17389         (FindMembers): Update to handle interface types too.
17390
17391         * expression.cs (ImplicitReferenceConversion): Re-write bits which
17392         use IsAssignableFrom as that is not correct - it doesn't work.
17393
17394         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
17395         and accordingly override EmitStatement.
17396
17397         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
17398         using the correct logic :-)
17399
17400 2001-10-19  Ravi Pratap  <ravi@ximian.com>
17401
17402         * ../errors/cs-11.cs : Add to demonstrate error -11 
17403
17404 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
17405
17406         * assign.cs (Assign::Resolve): Resolve right hand side first, and
17407         then pass this as a hint to ResolveLValue.
17408
17409         * expression.cs (FieldExpr): Add Location information
17410
17411         (FieldExpr::LValueResolve): Report assignment to readonly
17412         variable. 
17413
17414         (Expression::ExprClassFromMemberInfo): Pass location information.
17415
17416         (Expression::ResolveLValue): Add new method that resolves an
17417         LValue. 
17418
17419         (Expression::DoResolveLValue): Default invocation calls
17420         DoResolve. 
17421
17422         (Indexers): New class used to keep track of indexers in a given
17423         Type. 
17424
17425         (IStackStore): Renamed from LValue, as it did not really describe
17426         what this did.  Also ResolveLValue is gone from this interface and
17427         now is part of Expression.
17428
17429         (ElementAccess): Depending on the element access type
17430
17431         * typemanager.cs: Add `indexer_name_type' as a Core type
17432         (System.Runtime.CompilerServices.IndexerNameAttribute)
17433
17434         * statement.cs (Goto): Take a location.
17435
17436 2001-10-18  Ravi Pratap  <ravi@ximian.com>
17437
17438         * delegate.cs (Delegate::VerifyDelegate): New method to verify
17439         if two delegates are compatible.
17440
17441         (NewDelegate::DoResolve): Update to take care of the case when
17442         we instantiate a delegate from another delegate.
17443
17444         * typemanager.cs (FindMembers): Don't even try to look up members
17445         of Delegate types for now.
17446
17447 2001-10-18  Ravi Pratap  <ravi@ximian.com>
17448
17449         * delegate.cs (NewDelegate): New class to take care of delegate
17450         instantiation.
17451
17452         * expression.cs (New): Split the delegate related code out into 
17453         the NewDelegate class.
17454
17455         * delegate.cs (DelegateInvocation): New class to handle delegate 
17456         invocation.
17457
17458         * expression.cs (Invocation): Split out delegate related code into
17459         the DelegateInvocation class.
17460
17461 2001-10-17  Ravi Pratap  <ravi@ximian.com>
17462
17463         * expression.cs (New::DoResolve): Implement delegate creation fully
17464         and according to the spec.
17465
17466         (New::DoEmit): Update to handle delegates differently.
17467
17468         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
17469         because of which we were printing out arguments in reverse order !
17470
17471         * delegate.cs (VerifyMethod): Implement to check if the given method
17472         matches the delegate.
17473
17474         (FullDelegateDesc): Implement.
17475
17476         (VerifyApplicability): Implement.
17477
17478         * expression.cs (Invocation::DoResolve): Update to accordingly handle
17479         delegate invocations too.
17480
17481         (Invocation::Emit): Ditto.
17482
17483         * ../errors/cs1593.cs : Added.
17484
17485         * ../errors/cs1594.cs : Added.
17486
17487         * delegate.cs (InstanceExpression, TargetMethod): New properties.
17488
17489 2001-10-16  Ravi Pratap  <ravi@ximian.com>
17490
17491         * typemanager.cs (intptr_type): Core type for System.IntPtr
17492
17493         (InitCoreTypes): Update for the same.
17494
17495         (iasyncresult_type, asynccallback_type): Ditto.
17496
17497         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
17498         correct.
17499
17500         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
17501         too.
17502
17503         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
17504         the builders for the 4 members of a delegate type :-)
17505
17506         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
17507         type.
17508
17509         * expression.cs (New::DoResolve): Implement guts for delegate creation.
17510
17511         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
17512
17513 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
17514
17515         * statement.cs (Break::Emit): Implement.   
17516         (Continue::Emit): Implement.
17517
17518         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
17519         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
17520         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
17521         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
17522         end loop
17523
17524         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
17525         properties that track the label for the current loop (begin of the
17526         loop and end of the loop).
17527
17528 2001-10-15  Ravi Pratap  <ravi@ximian.com>
17529
17530         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
17531         use of emitting anything at all.
17532
17533         * class.cs, rootcontext.cs : Get rid of calls to the same.
17534
17535         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
17536
17537         (Populate): Define the constructor correctly and set the implementation
17538         attributes.
17539
17540         * typemanager.cs (delegate_types): New hashtable to hold delegates that
17541         have been defined.
17542
17543         (AddDelegateType): Implement.
17544
17545         (IsDelegateType): Implement helper method.
17546
17547         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
17548
17549         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
17550         and accordingly handle it.
17551
17552         * delegate.cs (Populate): Take TypeContainer argument.
17553         Implement bits to define the Invoke method. However, I still haven't figured out
17554         how to take care of the native int bit :-(
17555
17556         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
17557         Qualify the name of the delegate, not its return type !
17558
17559         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
17560         conversion.
17561
17562         (StandardConversionExists): Checking for array types turns out to be recursive.
17563
17564         (ConvertReferenceExplicit): Implement array conversion.
17565
17566         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
17567
17568 2001-10-12  Ravi Pratap  <ravi@ximian.com>
17569
17570         * cs-parser.jay (delegate_declaration): Store the fully qualified
17571         name as it is a type declaration.
17572
17573         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
17574         readonly.
17575
17576         (DefineDelegate): Renamed from Define. Does the same thing essentially,
17577         as TypeContainer::DefineType.
17578
17579         (Populate): Method in which all the definition of the various methods (Invoke)
17580         etc is done.
17581
17582         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
17583         see.
17584
17585         (CloseDelegate): Finally creates the delegate.
17586
17587         * class.cs (TypeContainer::DefineType): Update to define delegates.
17588         (Populate, Emit and CloseType): Do the same thing here too.
17589
17590         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
17591         delegates in all these operations.
17592
17593 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
17594
17595         * expression.cs: LocalTemporary: a new expression used to
17596         reference a temporary that has been created.
17597
17598         * assign.cs: Handle PropertyAccess back here, so that we can
17599         provide the proper semantic access to properties.
17600
17601         * expression.cs (Expression::ConvertReferenceExplicit): Implement
17602         a few more explicit conversions. 
17603
17604         * modifiers.cs: `NEW' modifier maps to HideBySig.
17605
17606         * expression.cs (PropertyExpr): Make this into an
17607         ExpressionStatement, and support the EmitStatement code path. 
17608
17609         Perform get/set error checking, clean up the interface.
17610
17611         * assign.cs: recognize PropertyExprs as targets, and if so, turn
17612         them into toplevel access objects.
17613
17614 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
17615
17616         * expression.cs: PropertyExpr::PropertyExpr: use work around the
17617         SRE.
17618
17619         * typemanager.cs: Keep track here of our PropertyBuilders again to
17620         work around lameness in SRE.
17621
17622 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
17623
17624         * expression.cs (LValue::LValueResolve): New method in the
17625         interface, used to perform a second resolution pass for LValues. 
17626
17627         (This::DoResolve): Catch the use of this in static methods.
17628
17629         (This::LValueResolve): Implement.
17630
17631         (This::Store): Remove warning, assigning to `this' in structures
17632         is 
17633
17634         (Invocation::Emit): Deal with invocation of
17635         methods on value types.  We need to pass the address to structure
17636         methods rather than the object itself.  (The equivalent code to
17637         emit "this" for structures leaves the entire structure on the
17638         stack instead of a pointer to it). 
17639
17640         (ParameterReference::DoResolve): Compute the real index for the
17641         argument based on whether the method takes or not a `this' pointer
17642         (ie, the method is static).
17643
17644         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
17645         value types returned from functions when we need to invoke a
17646         method on the sturcture.
17647
17648
17649 2001-10-11  Ravi Pratap  <ravi@ximian.com>
17650
17651         * class.cs (TypeContainer::DefineType): Method to actually do the business of
17652         defining the type in the Modulebuilder or Typebuilder. This is to take
17653         care of nested types which need to be defined on the TypeBuilder using
17654         DefineNestedMethod.
17655
17656         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
17657         methods in RootContext, only ported to be part of TypeContainer.
17658
17659         (TypeContainer::GetInterfaceOrClass): Ditto.
17660
17661         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
17662
17663         * interface.cs (Interface::DefineInterface): New method. Does exactly
17664         what RootContext.CreateInterface did earlier, only it takes care of nested types 
17665         too.
17666
17667         (Interface::GetInterfaces): Move from RootContext here and port.
17668
17669         (Interface::GetInterfaceByName): Same here.
17670
17671         * rootcontext.cs (ResolveTree): Re-write.
17672
17673         (PopulateTypes): Re-write.
17674
17675         * class.cs (TypeContainer::Populate): Populate nested types too.
17676         (TypeContainer::Emit): Emit nested members too.
17677
17678         * typemanager.cs (AddUserType): Do not make use of the FullName property,
17679         instead just use the name argument passed in as it is already fully
17680         qualified.
17681
17682         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
17683         to TypeContainer mapping to see if a type is user-defined.
17684
17685         * class.cs (TypeContainer::CloseType): Implement. 
17686
17687         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
17688         the default constructor.
17689
17690         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
17691         twice.
17692
17693         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
17694
17695         * interface.cs (CloseType): Create the type here.
17696
17697         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
17698         the hierarchy.
17699
17700         Remove all the methods which are now in TypeContainer.
17701
17702 2001-10-10  Ravi Pratap  <ravi@ximian.com>
17703
17704         * delegate.cs (Define): Re-write bits to define the delegate
17705         correctly.
17706
17707 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
17708
17709         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
17710
17711         * expression.cs (ImplicitReferenceConversion): handle null as well
17712         as a source to convert to any reference type.
17713
17714         * statement.cs (Return): Perform any implicit conversions to
17715         expected return type.  
17716
17717         Validate use of return statement.  
17718
17719         * codegen.cs (EmitContext): Pass the expected return type here.
17720
17721         * class.cs (Method, Constructor, Property): Pass expected return
17722         type to EmitContext.
17723
17724 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
17725
17726         * expression.cs: Make DoResolve take an EmitContext instead of a
17727         TypeContainer.
17728
17729         Replaced `l' and `location' for `loc', for consistency.
17730
17731         (Error, Warning): Remove unneeded Tc argument.
17732
17733         * assign.cs, literal.cs, constant.cs: Update to new calling
17734         convention. 
17735
17736         * codegen.cs: EmitContext now contains a flag indicating whether
17737         code is being generated in a static method or not.
17738
17739         * cs-parser.jay: DecomposeQI, new function that replaces the old
17740         QualifiedIdentifier.  Now we always decompose the assembled
17741         strings from qualified_identifier productions into a group of
17742         memberaccesses.
17743
17744 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
17745
17746         * rootcontext.cs: Deal with field-less struct types correctly now
17747         by passing the size option to Define Type.
17748
17749         * class.cs: Removed hack that created one static field. 
17750
17751 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
17752
17753         * statement.cs: Moved most of the code generation here. 
17754
17755 2001-10-09  Ravi Pratap  <ravi@ximian.com>
17756
17757         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
17758         seem very right.
17759
17760         (ElementAccess): Remove useless bits for now - keep checks as the spec
17761         says.
17762
17763 2001-10-08  Ravi Pratap  <ravi@ximian.com>
17764
17765         * expression.cs (ElementAccess::DoResolve): Remove my crap code
17766         and start performing checks according to the spec.
17767
17768 2001-10-07  Ravi Pratap  <ravi@ximian.com>
17769
17770         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
17771         rank_specifiers instead.
17772
17773         (rank_specifiers): Change the order in which the rank specifiers are stored
17774
17775         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
17776
17777         * expression.cs (ElementAccess): Implement the LValue interface too.
17778
17779 2001-10-06  Ravi Pratap  <ravi@ximian.com>
17780
17781         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
17782         except that user defined conversions are not included.
17783
17784         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
17785         perform the conversion of the return type, if necessary.
17786
17787         (New::DoResolve): Check whether we are creating an array or an object
17788         and accordingly do the needful.
17789
17790         (New::Emit): Same here.
17791
17792         (New::DoResolve): Implement guts of array creation.
17793
17794         (New::FormLookupType): Helper function.
17795
17796 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
17797
17798         * codegen.cs: Removed most of the code generation here, and move the
17799         corresponding code generation bits to the statement classes. 
17800
17801         Added support for try/catch/finalize and throw.
17802
17803         * cs-parser.jay: Added support for try/catch/finalize.
17804
17805         * class.cs: Catch static methods having the flags override,
17806         virtual or abstract.
17807
17808         * expression.cs (UserCast): This user cast was not really doing
17809         what it was supposed to do.  Which is to be born in fully resolved
17810         state.  Parts of the resolution were being performed at Emit time! 
17811
17812         Fixed this code.
17813
17814 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
17815
17816         * expression.cs: Implicity convert the result from UserCast.
17817
17818 2001-10-05  Ravi Pratap  <ravi@ximian.com>
17819
17820         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
17821         prevented it from working correctly. 
17822
17823         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
17824         merely ConvertImplicit.
17825
17826 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
17827
17828         * typemanager.cs: Make the LookupTypeContainer function static,
17829         and not per-instance.  
17830
17831         * class.cs: Make static FindMembers (the one that takes a Type
17832         argument). 
17833
17834         * codegen.cs: Add EmitForeach here.
17835
17836         * cs-parser.jay: Make foreach a toplevel object instead of the
17837         inline expansion, as we need to perform semantic analysis on it. 
17838
17839 2001-10-05  Ravi Pratap  <ravi@ximian.com>
17840
17841         * expression.cs (Expression::ImplicitUserConversion): Rename to
17842         UserDefinedConversion.
17843
17844         (Expression::UserDefinedConversion): Take an extra argument specifying 
17845         whether we look for explicit user conversions too.
17846
17847         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
17848
17849         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
17850
17851         (ExplicitUserConversion): Make it a call to UserDefinedConversion
17852         with the appropriate arguments.
17853
17854         * cs-parser.jay (cast_expression): Record location too.
17855
17856         * expression.cs (Cast): Record location info.
17857
17858         (Expression::ConvertExplicit): Take location argument.
17859
17860         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
17861         to determine if we are doing explicit conversions.
17862
17863         (UserCast::Emit): Update accordingly.
17864
17865         (Expression::ConvertExplicit): Report an error if everything fails.
17866
17867         * ../errors/cs0030.cs : Add.
17868
17869 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
17870
17871         * modifiers.cs: If the ABSTRACT keyword is present, also set the
17872         virtual and newslot bits. 
17873
17874         * class.cs (TypeContainer::RegisterRequiredImplementations):
17875         Record methods we need.
17876
17877         (TypeContainer::MakeKey): Helper function to make keys for
17878         MethodBases, since the Methodbase key is useless.
17879
17880         (TypeContainer::Populate): Call RegisterRequiredImplementations
17881         before defining the methods.   
17882
17883         Create a mapping for method_builders_to_methods ahead of time
17884         instead of inside a tight loop.
17885
17886         (::RequireMethods):  Accept an object as the data to set into the
17887         hashtable so we can report interface vs abstract method mismatch.
17888
17889 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
17890
17891         * report.cs: Make all of it static.
17892
17893         * rootcontext.cs: Drop object_type and value_type computations, as
17894         we have those in the TypeManager anyways.
17895
17896         Drop report instance variable too, now it is a global.
17897
17898         * driver.cs: Use try/catch on command line handling.
17899
17900         Add --probe option to debug the error reporting system with a test
17901         suite. 
17902
17903         * report.cs: Add support for exiting program when a probe
17904         condition is reached.
17905
17906 2001-10-03  Ravi Pratap  <ravi@ximian.com>
17907
17908         * expression.cs (Binary::DoNumericPromotions): Fix the case when
17909         we do a forcible conversion regardless of type, to check if 
17910         ForceConversion returns a null.
17911
17912         (Binary::error19): Use location to report error.
17913
17914         (Unary::error23): Use location here too.
17915
17916         * ../errors/cs0019.cs : Check in.
17917
17918         * ../errors/cs0023.cs : Check in.
17919
17920         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
17921         case of a non-null MethodInfo object with a length of 0 !
17922
17923         (Binary::ResolveOperator): Flag error if overload resolution fails to find
17924         an applicable member - according to the spec :-)
17925         Also fix logic to find members in base types.
17926
17927         (Unary::ResolveOperator): Same here.
17928
17929         (Unary::report23): Change name to error23 and make first argument a TypeContainer
17930         as I was getting thoroughly confused between this and error19 :-)
17931
17932         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
17933         (::FindMostEncompassedType): Implement.
17934         (::FindMostEncompassingType): Implement.
17935         (::StandardConversionExists): Implement.
17936
17937         (UserImplicitCast): Re-vamp. We now need info about most specific
17938         source and target types so that we can do the necessary conversions.
17939
17940         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
17941         mathematical union with no duplicates.
17942
17943 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
17944
17945         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
17946         in order from base classes to child classes, so that we can in
17947         child classes look up in our parent for method names and
17948         attributes (required for handling abstract, virtual, new, override
17949         constructs: we need to instrospect our base class, and if we dont
17950         populate the classes in order, the introspection might be
17951         incorrect.  For example, a method could query its parent before
17952         the parent has any methods and would determine that the parent has
17953         no abstract methods (while it could have had them)).
17954
17955         (RootContext::CreateType): Record the order in which we define the
17956         classes.
17957
17958 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
17959
17960         * class.cs (TypeContainer::Populate): Also method definitions can
17961         fail now, keep track of this.
17962
17963         (TypeContainer::FindMembers): Implement support for
17964         DeclaredOnly/noDeclaredOnly flag.
17965
17966         (Constructor::Emit) Return the ConstructorBuilder.
17967
17968         (Method::Emit) Return the MethodBuilder. 
17969         Check for abstract or virtual methods to be public.
17970
17971         * rootcontext.cs (RootContext::CreateType): Register all the
17972         abstract methods required for the class to be complete and the
17973         interface methods that must be implemented. 
17974
17975         * cs-parser.jay: Report error 501 (method requires body if it is
17976         not marked abstract or extern).
17977
17978         * expression.cs (TypeOf::Emit): Implement.
17979
17980         * typemanager.cs: runtime_handle_type, new global type.
17981
17982         * class.cs (Property::Emit): Generate code for properties.
17983
17984 2001-10-02  Ravi Pratap  <ravi@ximian.com>
17985
17986         * expression.cs (Unary::ResolveOperator): Find operators on base type
17987         too - we now conform exactly to the spec.
17988
17989         (Binary::ResolveOperator): Same here.
17990
17991         * class.cs (Operator::Define): Fix minor quirk in the tests.
17992
17993         * ../errors/cs0215.cs : Added.
17994
17995         * ../errors/cs0556.cs : Added.
17996
17997         * ../errors/cs0555.cs : Added.
17998
17999 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
18000
18001         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
18002         single integer which is really efficient
18003
18004 2001-10-01  Ravi Pratap  <ravi@ximian.com>
18005
18006         *  expression.cs (Expression::ImplicitUserConversion): Use location
18007         even in the case when we are examining True operators.
18008  
18009         * class.cs (Operator::Define): Perform extensive checks to conform
18010         with the rules for operator overloading in the spec.
18011
18012         * expression.cs (Expression::ImplicitReferenceConversion): Implement
18013         some of the other conversions mentioned in the spec.
18014
18015         * typemanager.cs (array_type): New static member for the System.Array built-in
18016         type.
18017
18018         (cloneable_interface): For System.ICloneable interface.
18019
18020         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
18021         we start resolving the tree and populating types.
18022
18023         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
18024  
18025 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
18026
18027         * expression.cs (Expression::ExprClassFromMemberInfo,
18028         Expression::Literalize): Create literal expressions from
18029         FieldInfos which are literals.
18030
18031         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
18032         type casts, because they were wrong.  The test suite in tests
18033         caught these ones.
18034
18035         (ImplicitNumericConversion): ushort to ulong requires a widening
18036         cast. 
18037
18038         Int32 constant to long requires widening cast as well.
18039
18040         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
18041         for integers because the type on the stack is not i4.
18042
18043 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
18044
18045         * expression.cs (report118): require location argument. 
18046
18047         * parameter.cs: Do not dereference potential null value.
18048
18049         * class.cs: Catch methods that lack the `new' keyword when
18050         overriding a name.  Report warnings when `new' is used without
18051         anything being there to override.
18052
18053         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
18054
18055         * class.cs: Only add constructor to hashtable if it is non-null
18056         (as now constructors can fail on define).
18057
18058         (TypeManager, Class, Struct): Take location arguments.
18059
18060         Catch field instance initialization in structs as errors.
18061
18062         accepting_filter: a new filter for FindMembers that is static so
18063         that we dont create an instance per invocation.
18064
18065         (Constructor::Define): Catch errors where a struct constructor is
18066         parameterless 
18067
18068         * cs-parser.jay: Pass location information for various new
18069         constructs. 
18070
18071         * delegate.cs (Delegate): take a location argument.
18072
18073         * driver.cs: Do not call EmitCode if there were problesm in the
18074         Definition of the types, as many Builders wont be there. 
18075
18076         * decl.cs (Decl::Decl): Require a location argument.
18077
18078         * cs-tokenizer.cs: Handle properly hex constants that can not fit
18079         into integers, and find the most appropiate integer for it.
18080
18081         * literal.cs: Implement ULongLiteral.
18082
18083         * rootcontext.cs: Provide better information about the location of
18084         failure when CreateType fails.
18085
18086 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
18087
18088         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
18089         as well.
18090
18091         * expression.cs (Binary::CheckShiftArguments): Add missing type
18092         computation.
18093         (Binary::ResolveOperator): Add type to the logical and and logical
18094         or, Bitwise And/Or and Exclusive Or code paths, it was missing
18095         before.
18096
18097         (Binary::DoNumericPromotions): In the case where either argument
18098         is ulong (and most signed types combined with ulong cause an
18099         error) perform implicit integer constant conversions as well.
18100
18101 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
18102
18103         * expression.cs (UserImplicitCast): Method should always be
18104         non-null. 
18105         (Invocation::BetterConversion): Simplified test for IntLiteral.
18106
18107         (Expression::ImplicitNumericConversion): Split this routine out.
18108         Put the code that performs implicit constant integer conversions
18109         here. 
18110
18111         (Expression::Resolve): Become a wrapper around DoResolve so we can
18112         check eclass and type being set after resolve.
18113
18114         (Invocation::Badness): Remove this dead function
18115
18116         (Binary::ResolveOperator): Do not compute the expensive argumnets
18117         unless we have a union for it.
18118
18119         (Probe::Emit): Is needs to do an isinst and then
18120         compare against null.
18121
18122         (::CanConvert): Added Location argument.  If the Location argument
18123         is null (Location.Null), then we do not report errors.  This is
18124         used by the `probe' mechanism of the Explicit conversion.  We do
18125         not want to generate an error for something that the user
18126         explicitly requested to be casted.  But the pipeline for an
18127         explicit cast first tests for potential implicit casts.
18128
18129         So for now, if the Location is null, it means `Probe only' to
18130         avoid adding another argument.   Might have to revise this
18131         strategy later.
18132
18133         (ClassCast): New class used to type cast objects into arbitrary
18134         classes (used in Explicit Reference Conversions).
18135
18136         Implement `as' as well.
18137
18138         Reverted all the patches from Ravi below: they were broken:
18139
18140                 * The use of `level' as a mechanism to stop recursive
18141                   invocations is wrong.  That was there just to catch the
18142                   bug with a strack trace but not as a way of addressing
18143                   the problem.
18144
18145                   To fix the problem we have to *understand* what is going
18146                   on and the interactions and come up with a plan, not
18147                   just get things going.
18148
18149                 * The use of the type conversion cache that I proposed
18150                   last night had an open topic: How does this work across
18151                   protection domains.  A user defined conversion might not
18152                   be public in the location where we are applying the
18153                   conversion, a different conversion might be selected
18154                   (ie, private A->B (better) but public B->A (worse),
18155                   inside A, A->B applies, but outside it, B->A will
18156                   apply).
18157
18158                 * On top of that (ie, even if the above is solved),
18159                   conversions in a cache need to be abstract.  Ie, `To
18160                   convert from an Int to a Short use an OpcodeCast', not
18161                   `To convert from an Int to a Short use the OpcodeCast on
18162                   the variable 5' (which is what this patch was doing).
18163
18164 2001-09-28  Ravi Pratap  <ravi@ximian.com>
18165
18166         * expression.cs (Invocation::ConversionExists): Re-write to use
18167         the conversion cache
18168
18169         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
18170         cache all conversions done, not just user-defined ones.
18171
18172         (Invocation::BetterConversion): The real culprit. Use ConversionExists
18173         to determine if a conversion exists instead of acutually trying to 
18174         perform the conversion. It's faster too.
18175
18176         (Expression::ConvertExplicit): Modify to use ConversionExists to check
18177         and only then attempt the implicit conversion.
18178
18179 2001-09-28  Ravi Pratap  <ravi@ximian.com>
18180
18181         * expression.cs (ConvertImplicit): Use a cache for conversions
18182         already found. Check level of recursion and bail out if necessary.
18183
18184 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
18185
18186         * typemanager.cs (string_concat_string_string, string_concat_object_object):
18187         Export standard methods that we expect for string operations.
18188
18189         * statement.cs (Block::UsageWarning): Track usage of variables and
18190         report the errors for not used variables.
18191
18192         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
18193         operator. 
18194
18195 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
18196
18197         * codegen.cs: remove unnneded code 
18198
18199         * expression.cs: Removed BuiltinTypeAccess class
18200
18201         Fix the order in which implicit conversions are
18202         done.  
18203
18204         The previous fixed dropped support for boxed conversions (adding a
18205         test to the test suite now)
18206
18207         (UserImplicitCast::CanConvert): Remove test for source being null,
18208         that code is broken.  We should not feed a null to begin with, if
18209         we do, then we should track the bug where the problem originates
18210         and not try to cover it up here.
18211
18212         Return a resolved expression of type UserImplicitCast on success
18213         rather than true/false.  Ravi: this is what I was talking about,
18214         the pattern is to use a static method as a "constructor" for
18215         objects. 
18216
18217         Also, do not create arguments until the very last minute,
18218         otherwise we always create the arguments even for lookups that
18219         will never be performed. 
18220
18221         (UserImplicitCast::Resolve): Eliminate, objects of type
18222         UserImplicitCast are born in a fully resolved state. 
18223
18224         * typemanager.cs (InitCoreTypes): Init also value_type
18225         (System.ValueType). 
18226
18227         * expression.cs (Cast::Resolve): First resolve the child expression.
18228
18229         (LValue): Add new method AddressOf to be used by
18230         the `&' operator.  
18231
18232         Change the argument of Store to take an EmitContext instead of an
18233         ILGenerator, because things like FieldExpr need to be able to call
18234         their children expression to generate the instance code. 
18235
18236         (Expression::Error, Expression::Warning): Sugar functions for
18237         reporting errors.
18238
18239         (Expression::MemberLookup): Accept a TypeContainer instead of a
18240         Report as the first argument.
18241
18242         (Expression::ResolvePrimary): Killed.  I still want to improve
18243         this as currently the code is just not right.
18244
18245         (Expression::ResolveMemberAccess): Simplify, but it is still
18246         wrong. 
18247
18248         (Unary::Resolve): Catch errors in AddressOf operators.
18249
18250         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
18251         index to a byte for the short-version, or the compiler will choose
18252         the wrong Emit call, which generates the wrong data.
18253
18254         (ParameterReference::Emit, ::Store): same.
18255
18256         (FieldExpr::AddressOf): Implement.
18257
18258         * typemanager.cs: TypeManager: made public variable instead of
18259         property.
18260
18261         * driver.cs: document --fatal.
18262
18263         * report.cs (ErrorMessage, WarningMessage): new names for the old
18264         Error and Warning classes.
18265
18266         * cs-parser.jay (member_access): Turn built-in access to types
18267         into a normal simplename
18268
18269 2001-09-27  Ravi Pratap  <ravi@ximian.com>
18270
18271         * expression.cs (Invocation::BetterConversion): Fix to cope
18272         with q being null, since this was introducing a bug.
18273
18274         * expression.cs (ConvertImplicit): Do built-in conversions first.
18275
18276 2001-09-27  Ravi Pratap  <ravi@ximian.com>
18277
18278         * expression.cs (UserImplicitCast::Resolve): Fix bug.
18279
18280 2001-09-27  Ravi Pratap  <ravi@ximian.com>
18281
18282         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
18283         I had introduced long ago (what's new ?).
18284
18285         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
18286         the work of all the checking. 
18287         (ConvertImplicit): Call CanConvert and only then create object if necessary.
18288         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
18289
18290         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
18291         that is the right way. 
18292
18293         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
18294         overloading resolution. Use everywhere instead of cutting and pasting code.
18295
18296         (Binary::ResolveOperator): Use MakeUnionSet.
18297
18298         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
18299         we have to convert to bool types. Not complete yet.
18300
18301 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
18302
18303         * typemanager.cs (TypeManager::CSharpName): support ushort.
18304
18305         * expression.cs (Expression::TryImplicitIntConversion): Attempts
18306         to provide an expression that performsn an implicit constant int
18307         conversion (section 6.1.6).
18308         (Expression::ConvertImplicitRequired): Reworked to include
18309         implicit constant expression conversions.
18310
18311         (Expression::ConvertNumericExplicit): Finished.
18312
18313         (Invocation::Emit): If InstanceExpression is null, then it means
18314         that we perform a call on this.
18315
18316 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
18317
18318         * expression.cs (Unary::Emit): Remove some dead code.
18319         (Probe): Implement Resolve and Emit for `is'.
18320         (Expression::ConvertImplicitRequired): Attempt to do constant
18321         expression conversions here.  Maybe should be moved to
18322         ConvertImplicit, but I am not sure.
18323         (Expression::ImplicitLongConstantConversionPossible,
18324         Expression::ImplicitIntConstantConversionPossible): New functions
18325         that tell whether is it possible to apply an implicit constant
18326         expression conversion.
18327
18328         (ConvertNumericExplicit): Started work on explicit numeric
18329         conversions.
18330
18331         * cs-parser.jay: Update operator constants.
18332
18333         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
18334         (Parameters::GetSignature): Hook up VerifyArgs here.
18335         (Parameters::VerifyArgs): Verifies that no two arguments have the
18336         same name. 
18337
18338         * class.cs (Operator): Update the operator names to reflect the
18339         ones that the spec expects (as we are just stringizing the
18340         operator names).
18341
18342         * expression.cs (Unary::ResolveOperator): Fix bug: Use
18343         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
18344         previous usage did only work for our methods.
18345         (Expression::ConvertImplicit): Handle decimal implicit numeric
18346         conversions as well.
18347         (Expression::InternalTypeConstructor): Used to invoke constructors
18348         on internal types for default promotions.
18349
18350         (Unary::Emit): Implement special handling for the pre/post
18351         increment/decrement for overloaded operators, as they need to have
18352         the same semantics as the other operators.
18353
18354         (Binary::ResolveOperator): ditto.
18355         (Invocation::ConversionExists): ditto.
18356         (UserImplicitCast::Resolve): ditto.
18357
18358 2001-09-26  Ravi Pratap  <ravi@ximian.com>
18359
18360         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
18361         operator, return after emitting body. Regression tests pass again !
18362
18363         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
18364         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
18365         (Invocation::OverloadResolve): Ditto.
18366         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
18367
18368         * everywhere : update calls to the above methods accordingly.
18369
18370 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
18371
18372         * assign.cs (Assign): Make it inherit from ExpressionStatement.
18373
18374         * expression.cs (ExpressionStatement): New base class used for
18375         expressions that can appear in statements, so that we can provide
18376         an alternate path to generate expression that do not leave a value
18377         on the stack.
18378
18379         (Expression::Emit, and all the derivatives): We no longer return
18380         whether a value is left on the stack or not.  Every expression
18381         after being emitted leaves a single value on the stack.
18382
18383         * codegen.cs (EmitContext::EmitStatementExpression): Use the
18384         facilties of ExpressionStatement if possible.
18385
18386         * cs-parser.jay: Update statement_expression.
18387
18388 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
18389
18390         * driver.cs: Change the wording of message
18391
18392 2001-09-25  Ravi Pratap  <ravi@ximian.com>
18393
18394         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
18395         the type of the expression to the return type of the method if
18396         we have an overloaded operator match ! The regression tests pass again !
18397         (Unary::ResolveOperator): Ditto.
18398
18399         * expression.cs (Invocation::ConversionExists): Correct the member lookup
18400         to find "op_Implicit", not "implicit" ;-)
18401         (UserImplicitCast): New class to take care of user-defined implicit conversions.
18402         (ConvertImplicit, ForceConversion): Take TypeContainer argument
18403
18404         * everywhere : Correct calls to the above accordingly.
18405
18406         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
18407         (ConvertImplicit): Do user-defined conversion if it exists.
18408
18409 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
18410
18411         * assign.cs: track location.
18412         (Resolve): Use implicit conversions on assignment.
18413
18414         * literal.cs: Oops.  Not good, Emit of short access values should
18415         pass (Bytes) or the wrong argument will be selected.
18416
18417         * expression.cs (Unary::Emit): Emit code for -expr.
18418
18419         (Unary::ResolveOperator): Handle `Substract' for non-constants
18420         (substract from zero from the non-constants).
18421         Deal with Doubles as well. 
18422
18423         (Expression::ConvertImplicitRequired): New routine that reports an
18424         error if no implicit conversion exists. 
18425
18426         (Invocation::OverloadResolve): Store the converted implicit
18427         expressions if we make them
18428
18429 2001-09-24  Ravi Pratap  <ravi@ximian.com>
18430
18431         * class.cs (ConstructorInitializer): Take a Location argument.
18432         (ConstructorBaseInitializer): Same here.
18433         (ConstructorThisInitializer): Same here.
18434
18435         * cs-parser.jay : Update all calls accordingly.
18436
18437         * expression.cs (Unary, Binary, New): Take location argument.
18438         Update accordingly everywhere.
18439
18440         * cs-parser.jay : Update all calls to the above to take a location
18441         argument.
18442
18443         * class.cs : Ditto.
18444
18445 2001-09-24  Ravi Pratap  <ravi@ximian.com>
18446
18447         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
18448         (Invocation::BetterConversion): Same here
18449         (Invocation::ConversionExists): Ditto.
18450
18451         (Invocation::ConversionExists): Implement.
18452
18453 2001-09-22  Ravi Pratap  <ravi@ximian.com>
18454
18455         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
18456         Also take an additional TypeContainer argument.
18457
18458         * All over : Pass in TypeContainer as argument to OverloadResolve.
18459
18460         * typemanager.cs (CSharpName): Update to check for the string type and return
18461         that too.
18462
18463         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
18464         a given method.
18465
18466 2001-09-21  Ravi Pratap  <ravi@ximian.com>
18467
18468         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
18469         (Invocation::BetterFunction): Implement.
18470         (Invocation::BetterConversion): Implement.
18471         (Invocation::ConversionExists): Skeleton, no implementation yet.
18472
18473         Okay, things work fine !
18474
18475 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
18476
18477         * typemanager.cs: declare and load enum_type, delegate_type and
18478         void_type. 
18479
18480         * expression.cs (Expression::Emit): Now emit returns a value that
18481         tells whether a value is left on the stack or not.  This strategy
18482         might be reveted tomorrow with a mechanism that would address
18483         multiple assignments.
18484         (Expression::report118): Utility routine to report mismatches on
18485         the ExprClass.
18486
18487         (Unary::Report23): Report impossible type/operator combination
18488         utility function.
18489
18490         (Unary::IsIncrementableNumber): Whether the type can be
18491         incremented or decremented with add.
18492         (Unary::ResolveOperator): Also allow enumerations to be bitwise
18493         complemented. 
18494         (Unary::ResolveOperator): Implement ++, !, ~,
18495
18496         (Invocation::Emit): Deal with new Emit convetion.
18497
18498         * All Expression derivatives: Updated their Emit method to return
18499         whether they leave values on the stack or not.
18500
18501         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
18502         stack for expressions that are statements. 
18503
18504 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
18505
18506         * expression.cs (LValue): New interface.  Must be implemented by
18507         LValue objects.
18508         (LocalVariableReference, ParameterReference, FieldExpr): Implement
18509         LValue interface.
18510
18511         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
18512         interface for generating code, simplifies the code.
18513
18514 2001-09-20  Ravi Pratap  <ravi@ximian.com>
18515
18516         * expression.cs (everywhere): Comment out return statements in ::Resolve
18517         methods to avoid the warnings.
18518
18519 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
18520
18521         * driver.cs (parse): Report error 2001 if we can not open the
18522         source file.
18523
18524         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
18525         not resolve it.
18526
18527         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
18528         object. 
18529
18530         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
18531         otherwise nested blocks end up with the same index.
18532
18533         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
18534
18535         * expression.cs:  Instead of having FIXMEs in the Resolve
18536         functions, throw exceptions so it is obvious that we are facing a
18537         bug. 
18538
18539         * cs-parser.jay (invocation_expression): Pass Location information.
18540
18541         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
18542         Use a basename for those routines because .NET does not like paths
18543         on them. 
18544
18545         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
18546         already defined.
18547
18548 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
18549
18550         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
18551         are loading the correct data types (throws an exception if not).
18552         (TypeManager::InitCoreTypes): Use CoreLookupType
18553
18554         * expression.cs (Unary::ResolveOperator): return the child
18555         expression for expressions which are just +expr.
18556         (Unary::ResolveOperator): Return negative literals for -LITERAL
18557         expressions (otherwise they are Unary {Literal}).
18558         (Invocation::Badness): Take into account `Implicit constant
18559         expression conversions'.
18560
18561         * literal.cs (LongLiteral): Implement long literal class.
18562         (IntLiteral): export the `Value' of the intliteral. 
18563
18564 2001-09-19  Ravi Pratap  <ravi@ximian.com>
18565
18566         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
18567
18568         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
18569         instead of 'Operator'
18570
18571         * expression.cs (Binary::ResolveOperator): Update accordingly.
18572         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
18573         and 'Minus'
18574
18575         * cs-parser.jay (unary_expression): Update to use the new names.
18576
18577         * gen-treedump.cs (GetUnary): Same here.
18578
18579         * expression.cs (Unary::Resolve): Implement.
18580         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
18581         operators are found instead of making noise ;-)
18582         (Unary::ResolveOperator): New method to do precisely the same thing which
18583         Binary::ResolveOperator does for Binary expressions.
18584         (Unary.method, .Arguments): Add.
18585         (Unary::OperName): Implement.   
18586         (Unary::ForceConversion): Copy and Paste !
18587
18588         * class.cs (Operator::Define): Fix a small bug for the case when we have 
18589         a unary operator.
18590
18591         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
18592         for the inbuilt operators. Only overloading works for now ;-)
18593
18594 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
18595
18596         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
18597         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
18598
18599         * expression.cs (This::Emit): Implement. 
18600         (This::Resolve): Implement.
18601         (TypeOf:Resolve): Implement.
18602         (Expression::ResolveSimpleName): Add an implicit this to instance
18603         field references. 
18604         (MemberAccess::Resolve): Deal with Parameters and Fields. 
18605         Bind instance variable to Field expressions.
18606         (FieldExpr::Instance): New field used to track the expression that
18607         represents the object instance.
18608         (FieldExpr::Resolve): Track potential errors from MemberLookup not
18609         binding 
18610         (FieldExpr::Emit): Implement.
18611
18612         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
18613         the last instruction contains a return opcode to avoid generating
18614         the last `ret' instruction (this generates correct code, and it is
18615         nice to pass the peverify output).
18616
18617         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
18618         initializer for static and instance variables.
18619         (Constructor::Emit): Allow initializer to be null in the case of
18620         static constructors.  Only emit initializer for instance
18621         constructors. 
18622
18623         (TypeContainer::FindMembers): Return a null array if there are no
18624         matches.
18625
18626         Also fix the code for the MemberTypes.Method branch, as it was not
18627         scanning that for operators (or tried to access null variables before).
18628
18629         * assign.cs (Assign::Emit): Handle instance and static fields. 
18630
18631         * TODO: Updated.
18632
18633         * driver.cs: Stop compilation if there are parse errors.
18634
18635         * cs-parser.jay (constructor_declaration): Provide default base
18636         initializer for non-static constructors.
18637         (constructor_declarator): Do not provide a default base
18638         initializers if none was specified.
18639         Catch the fact that constructors should not have parameters.
18640
18641         * class.cs: Do not emit parent class initializers for static
18642         constructors, that should be flagged as an error.
18643
18644 2001-09-18  Ravi Pratap  <ravi@ximian.com>
18645
18646         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
18647         Move back code into TypeContainer::Populate.
18648
18649 2001-09-18  Ravi Pratap  <ravi@ximian.com>
18650
18651         * class.cs (TypeContainer::AddConstructor): Fix the check to
18652         compare against Name, not Basename. 
18653         (Operator::OpType): Change Plus and Minus to Add and Subtract.
18654
18655         * cs-parser.jay : Update accordingly.
18656
18657         * class.cs (TypeContainer::FindMembers): For the case where we are searching
18658         for methods, don't forget to look into the operators too.
18659         (RegisterMethodBuilder): Helper method to take care of this for
18660         methods, constructors and operators.
18661         (Operator::Define): Completely revamp.
18662         (Operator.OperatorMethod, MethodName): New fields.
18663         (TypeContainer::Populate): Move the registering of builders into
18664         RegisterMethodBuilder.
18665         (Operator::Emit): Re-write.
18666
18667         * expression.cs (Binary::Emit): Comment out code path to emit method
18668         invocation stuff for the case when we have a user defined operator. I am
18669         just not able to get it right !
18670
18671 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
18672
18673         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
18674         argument. 
18675
18676         (Expression::MemberLookup): Provide a version that allows to
18677         specify the MemberTypes and BindingFlags. 
18678
18679         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
18680         so it was not fetching variable information from outer blocks.
18681
18682         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
18683         Beforefieldinit as it was buggy.
18684
18685         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
18686         that Ravi put here.  
18687
18688         * class.cs (Constructor::Emit): Only emit if block is not null.
18689         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
18690         deal with this by semantically definining it as if the user had
18691         done it.
18692
18693         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
18694         constructors as we now "emit" them at a higher level.
18695
18696         (TypeContainer::DefineDefaultConstructor): Used to define the
18697         default constructors if none was provided.
18698
18699         (ConstructorInitializer): Add methods Resolve and Emit. 
18700
18701         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
18702
18703 2001-09-17  Ravi Pratap  <ravi@ximian.com>
18704
18705         * class.cs (TypeContainer::EmitDefaultConstructor): Register
18706         the default constructor builder with our hashtable for methodbuilders
18707         to methodcores.
18708
18709         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
18710         and argument_count is 0 in which case we have a match.
18711         (Binary::ResolveOperator): More null checking and miscellaneous coding
18712         style cleanup.
18713
18714 2001-09-17  Ravi Pratap  <ravi@ximian.com>
18715
18716         * rootcontext.cs (IsNameSpace): Compare against null.
18717
18718         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
18719
18720         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
18721         and Unary::Operator.
18722
18723         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
18724         accordingly.
18725
18726         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
18727         we have overloaded operators.
18728         (Binary::ResolveOperator): Implement the part which does the operator overload
18729         resolution.
18730
18731         * class.cs (Operator::Emit): Implement.
18732         (TypeContainer::Emit): Emit the operators we have too.
18733
18734         * expression.cs (Binary::Emit): Update to emit the appropriate code for
18735         the case when we have a user-defined operator.
18736
18737 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
18738
18739         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
18740
18741 2001-09-16  Ravi Pratap  <ravi@ximian.com>
18742
18743         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
18744         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
18745         (Constructor::Emit): Implement.
18746         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
18747         if we have no work to do. 
18748         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
18749         Emit method.
18750
18751         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
18752         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
18753
18754         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
18755         of parent.parent.
18756
18757 2001-09-15  Ravi Pratap  <ravi@ximian.com>
18758
18759         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
18760         in the source.
18761         (Tree::RecordNamespace): Method to do what the name says ;-)
18762         (Tree::Namespaces): Property to get at the namespaces hashtable.
18763
18764         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
18765         keep track.
18766
18767         * rootcontext.cs (IsNamespace): Fixed it :-)
18768
18769 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
18770
18771         * class.cs (TypeContainer::FindMembers): Add support for
18772         constructors. 
18773         (MethodCore): New class that encapsulates both the shared aspects
18774         of a Constructor and a Method.  
18775         (Method, Constructor): Factored pieces into MethodCore.
18776
18777         * driver.cs: Added --fatal which makes errors throw exceptions.
18778         Load System assembly as well as part of the standard library.
18779
18780         * report.cs: Allow throwing exceptions on errors for debugging.
18781
18782         * modifiers.cs: Do not use `parent', instead use the real type
18783         container to evaluate permission settings.
18784
18785         * class.cs: Put Ravi's patch back in.  He is right, and we will
18786         have to cope with the
18787
18788 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18789
18790         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
18791         FamORAssem, not FamANDAssem.
18792
18793 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
18794
18795         * driver.cs: Added --parse option that only parses its input files
18796         and terminates.
18797
18798         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
18799         incorrect.  IsTopLevel is not used to tell whether an object is
18800         root_types or not (that can be achieved by testing this ==
18801         root_types).  But to see if this is a top-level *class* (not
18802         necessarly our "toplevel" container). 
18803
18804 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18805
18806         * enum.cs (Enum::Define): Modify to call the Lookup method on the
18807         parent instead of a direct call to GetType.
18808
18809 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18810
18811         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
18812         Modifiers.TypeAttr. This should just be a call to that method.
18813
18814         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
18815         object so that we can determine if we are top-level or not.
18816
18817         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
18818         TypeContainer too.
18819
18820         * enum.cs (Enum::Define): Ditto.
18821
18822         * modifiers.cs (FieldAttr): Re-write.
18823
18824         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
18825         (TypeContainer::HaveStaticConstructor): New property to provide access
18826         to precisely that info.
18827
18828         * modifiers.cs (MethodAttr): Re-write.
18829         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
18830
18831         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
18832         of top-level types as claimed.
18833
18834 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
18835
18836         * expression.cs (MemberLookup): Fruitless attempt to lookup
18837         constructors.  Maybe I need to emit default constructors?  That
18838         might be it (currently .NET emits this for me automatically).
18839         (Invocation::OverloadResolve): Cope with Arguments == null.
18840         (Invocation::EmitArguments): new function, shared by the new
18841         constructor and us.
18842         (Invocation::Emit): Handle static and instance methods.  Emit
18843         proper call instruction for virtual or non-virtual invocations.
18844         (New::Emit): Implement.
18845         (New::Resolve): Implement.
18846         (MemberAccess:Resolve): Implement.
18847         (MethodGroupExpr::InstanceExpression): used conforming to the spec
18848         to track instances.
18849         (FieldExpr::Resolve): Set type.
18850
18851         * support.cs: Handle empty arguments.
18852                 
18853         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
18854         SimpleLookup): Auxiliary routines to help parse a qualifier
18855         identifier.  
18856
18857         Update qualifier_identifier rule.
18858
18859         * codegen.cs: Removed debugging messages.
18860
18861         * class.cs: Make this a global thing, this acts just as a "key" to
18862         objects that we might have around.
18863
18864         (Populate): Only initialize method_builders_to_methods once.
18865
18866         * expression.cs (PropertyExpr): Initialize type from the
18867         PropertyType. 
18868
18869         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
18870         Resolve pattern.  Attempt to implicitly convert value to boolean.
18871         Emit code.
18872
18873         * expression.cs: Set the type for the int32/int32 argument case.
18874         (Binary::ResolveOperator): Set the return type to boolean for
18875         comparission operators
18876
18877         * typemanager.cs: Remove debugging print code.
18878
18879         (Invocation::Resolve): resolve type.
18880
18881         * class.cs: Allocate a MemberInfo of the correct size, as the code
18882         elsewhere depends on the test to reflect the correct contents.
18883
18884         (Method::) Keep track of parameters, due to System.Reflection holes
18885
18886         (TypeContainer::Populate): Keep track of MethodBuilders to Method
18887         mapping here.
18888
18889         (TypeContainer::FindMembers): Use ArrayList and then copy an array
18890         of the exact size and return that.
18891
18892         (Class::LookupMethodByBuilder): New function that maps
18893         MethodBuilders to its methods.  Required to locate the information
18894         on methods because System.Reflection bit us again.
18895
18896         * support.cs: New file, contains an interface ParameterData and
18897         two implementations: ReflectionParameters and InternalParameters
18898         used to access Parameter information.  We will need to grow this
18899         as required.
18900
18901         * expression.cs (Invocation::GetParameterData): implement a cache
18902         and a wrapper around the ParameterData creation for methods. 
18903         (Invocation::OverloadResolve): Use new code.
18904
18905 2001-09-13  Ravi Pratap  <ravi@ximian.com>
18906
18907         * class.cs (TypeContainer::EmitField): Remove and move into 
18908         (Field::Define): here and modify accordingly.
18909         (Field.FieldBuilder): New member.
18910         (TypeContainer::Populate): Update accordingly.
18911         (TypeContainer::FindMembers): Implement.
18912
18913 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
18914
18915         * statement.cs: (VariableInfo::VariableType): New field to be
18916         initialized with the full type once it is resolved. 
18917
18918 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
18919
18920         * parameter.cs (GetParameterInfo): Use a type cache to compute
18921         things only once, and to reuse this information
18922
18923         * expression.cs (LocalVariableReference::Emit): Implement.
18924         (OpcodeCast::Emit): fix.
18925
18926         (ParameterReference::Resolve): Implement.
18927         (ParameterReference::Emit): Implement.
18928
18929         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
18930         that are expressions need to stay as Expressions.
18931
18932         * typemanager.cs (CSharpName): Returns the C# name of a type if
18933         possible. 
18934
18935         * expression.cs (Expression::ConvertImplicit): New function that
18936         implements implicit type conversions.
18937
18938         (Expression::ImplicitReferenceConversion): Implements implicit
18939         reference conversions.
18940
18941         (EmptyCast): New type for transparent casts.
18942
18943         (OpcodeCast): New type for casts of types that are performed with
18944         a sequence of bytecodes.
18945
18946         (BoxedCast): New type used for casting value types into reference
18947         types.  Emits a box opcode.
18948
18949         (Binary::DoNumericPromotions): Implements numeric promotions of
18950         and computation of the Binary::Type.
18951
18952         (Binary::EmitBranchable): Optimization.
18953
18954         (Binary::Emit): Implement code emission for expressions.
18955
18956         * typemanager.cs (TypeManager): Added two new core types: sbyte
18957         and byte.
18958
18959 2001-09-12  Ravi Pratap  <ravi@ximian.com>
18960
18961         * class.cs (TypeContainer::FindMembers): Method which does exactly
18962         what Type.FindMembers does, only we don't have to use reflection. No
18963         implementation yet.
18964
18965         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
18966         typecontainer objects as we need to get at them.
18967         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
18968
18969         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
18970         typecontainer object.
18971
18972         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
18973         of just a Report object.
18974
18975 2001-09-11  Ravi Pratap  <ravi@ximian.com>
18976
18977         * class.cs (Event::Define): Go back to using the prefixes "add_" and
18978         "remove_"
18979         (TypeContainer::Populate): Now define the delegates of the type too.
18980         (TypeContainer.Delegates): Property to access the list of delegates defined
18981         in the type.
18982
18983         * delegates.cs (Delegate::Define): Implement partially.
18984
18985         * modifiers.cs (TypeAttr): Handle more flags.
18986
18987 2001-09-11  Ravi Pratap  <ravi@ximian.com>
18988
18989         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
18990         and not <=
18991         (Operator::Define): Re-write logic to get types by using the LookupType method
18992         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
18993         (Indexer::Define): Ditto.
18994         (Event::Define): Ditto.
18995         (Property::Define): Ditto.
18996
18997 2001-09-10  Ravi Pratap  <ravi@ximian.com>
18998
18999         * class.cs (TypeContainer::Populate): Now define operators too. 
19000         (TypeContainer.Operators): New property to access the list of operators
19001         in a type.
19002         (Operator.OperatorMethodBuilder): New member to hold the method builder
19003         for the operator we are defining.
19004         (Operator::Define): Implement.
19005
19006 2001-09-10  Ravi Pratap  <ravi@ximian.com>
19007
19008         * class.cs (Event::Define): Make the prefixes of the accessor methods
19009         addOn_ and removeOn_ 
19010
19011         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
19012         of the location being passed in too. Ideally, this should go later since all
19013         error reporting should be done through the Report object.
19014
19015         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
19016         (Populate): Iterate thru the indexers we have and define them too.
19017         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
19018         for the get and set accessors.
19019         (Indexer::Define): Implement.
19020
19021 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
19022
19023         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
19024         my previous implementation, did not work.
19025
19026         * typemanager.cs: Add a couple of missing types (the longs).
19027
19028         * literal.cs: Use TypeManager.bool_type instead of getting it.
19029
19030         * expression.cs (EventExpr): New kind of expressions.
19031         (Expressio::ExprClassFromMemberInfo): finish
19032
19033 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
19034
19035         * assign.cs: Emit stores to static fields differently.
19036
19037 2001-09-08  Ravi Pratap  <ravi@ximian.com>
19038
19039         * Merge in changes and adjust code to tackle conflicts. Backed out my
19040         code in Assign::Resolve ;-) 
19041
19042 2001-09-08  Ravi Pratap  <ravi@ximian.com>
19043
19044         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
19045         instead Report.Error and also pass in the location.
19046         (CSharpParser::Lexer): New readonly property to return the reference
19047         to the Tokenizer object.
19048         (declare_local_variables): Use Report.Error with location instead of plain 
19049         old error.
19050         (CheckDef): Ditto.
19051
19052         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
19053         (Operator.CheckBinaryOperator): Ditto.
19054
19055         * cs-parser.jay (operator_declarator): Update accordingly.
19056
19057         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
19058         (CheckBinaryOperator): Same here.
19059
19060         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
19061         on the name without any prefixes of namespace names etc. This is because we
19062         already might have something already fully qualified like 
19063         'System.Console.WriteLine'
19064
19065         * assign.cs (Resolve): Begin implementation. Stuck ;-)
19066
19067 2001-09-07  Ravi Pratap  <ravi@ximian.com>
19068
19069         * cs-tokenizer.cs (location): Return a string which also contains
19070         the file name.
19071
19072         * expression.cs (ElementAccess): New class for expressions of the
19073         type 'element access.'
19074         (BaseAccess): New class for expressions of the type 'base access.'
19075         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
19076         respectively.
19077
19078         * cs-parser.jay (element_access): Implement action.
19079         (base_access): Implement actions.
19080         (checked_expression, unchecked_expression): Implement.
19081
19082         * cs-parser.jay (local_variable_type): Correct and implement.
19083         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
19084
19085         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
19086
19087         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
19088         name and the specifiers.
19089
19090         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
19091
19092         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
19093         making them all public ;-)
19094
19095         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
19096         class anyways.
19097
19098 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
19099
19100         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
19101         PropertyExprs.
19102         (FieldExpr, PropertyExprs): New resolved expressions.
19103         (SimpleName::MemberStaticCheck): Perform static checks for access
19104         to non-static fields on static methods. Maybe this should be
19105         generalized for MemberAccesses. 
19106         (SimpleName::ResolveSimpleName): More work on simple name
19107         resolution. 
19108
19109         * cs-parser.jay (primary_expression/qualified_identifier): track
19110         the parameter index.
19111
19112         * codegen.cs (CodeGen::Save): Catch save exception, report error.
19113         (EmitContext::EmitBoolExpression): Chain to expression generation
19114         instead of temporary hack.
19115         (::EmitStatementExpression): Put generic expression code generation.
19116
19117         * assign.cs (Assign::Emit): Implement variable assignments to
19118         local variables, parameters and fields.
19119
19120 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
19121
19122         * statement.cs (Block::GetVariableInfo): New method, returns the
19123         VariableInfo for a variable name in a block.
19124         (Block::GetVariableType): Implement in terms of GetVariableInfo
19125
19126         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
19127         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
19128
19129 2001-09-06  Ravi Pratap  <ravi@ximian.com>
19130
19131         * cs-parser.jay (operator_declaration): Continue on my quest : update
19132         to take attributes argument.
19133         (event_declaration): Ditto.
19134         (enum_declaration): Ditto.
19135         (indexer_declaration): Ditto.
19136
19137         * class.cs (Operator::Operator): Update constructor accordingly.
19138         (Event::Event): Ditto.
19139
19140         * delegate.cs (Delegate::Delegate): Same here.
19141
19142         * enum.cs (Enum::Enum): Same here.
19143
19144 2001-09-05  Ravi Pratap  <ravi@ximian.com>
19145
19146         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
19147
19148         * ../tests/cs0658.cs : New file to demonstrate error 0658.
19149
19150         * attribute.cs (Attributes): New class to encapsulate all attributes which were
19151         being passed around as an arraylist.
19152         (Attributes::AddAttribute): Method to add attribute sections.
19153
19154         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
19155         (struct_declaration): Update accordingly.
19156         (constant_declaration): Update.
19157         (field_declaration): Update.
19158         (method_header): Update.
19159         (fixed_parameter): Update.
19160         (parameter_array): Ditto.
19161         (property_declaration): Ditto.
19162         (destructor_declaration): Ditto.
19163
19164         * class.cs (Struct::Struct): Update constructors accordingly.
19165         (Class::Class): Ditto.
19166         (Field::Field): Ditto.
19167         (Method::Method): Ditto.
19168         (Property::Property): Ditto.
19169         (TypeContainer::OptAttribute): update property's return type.
19170
19171         * interface.cs (Interface.opt_attributes): New member.
19172         (Interface::Interface): Update to take the extra Attributes argument.
19173
19174         * parameter.cs (Parameter::Parameter): Ditto.
19175
19176         * constant.cs (Constant::Constant): Ditto.
19177
19178         * interface.cs (InterfaceMemberBase): New OptAttributes field.
19179         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
19180         the attributes as a parameter.
19181         (InterfaceProperty): Update constructor call.
19182         (InterfaceEvent): Ditto.
19183         (InterfaceMethod): Ditto.
19184         (InterfaceIndexer): Ditto.
19185
19186         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
19187         pass the attributes too.
19188         (interface_event_declaration): Ditto.
19189         (interface_property_declaration): Ditto.
19190         (interface_method_declaration): Ditto.
19191         (interface_declaration): Ditto.
19192
19193 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
19194
19195         * class.cs (Method::Define): Track the "static Main" definition to
19196         create an entry point. 
19197
19198         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
19199         EntryPoint if we find it. 
19200
19201         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
19202         (EmitContext::ig): Make this variable public.
19203
19204         * driver.cs: Make the default output file be the first file name
19205         with the .exe extension.  
19206
19207         Detect empty compilations
19208
19209         Handle various kinds of output targets.  Handle --target and
19210         rename -t to --dumper.
19211
19212         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
19213         methods inherited from Expression return now an Expression.  This
19214         will is used during the tree rewriting as we resolve them during
19215         semantic analysis.
19216
19217         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
19218         the spec.  Missing entirely is the information about
19219         accessability of elements of it.
19220
19221         (Expression::ExprClassFromMemberInfo): New constructor for
19222         Expressions that creates a fully initialized Expression based on
19223         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
19224         a Type.
19225
19226         (Invocation::Resolve): Begin implementing resolution of invocations.
19227
19228         * literal.cs (StringLiteral):  Implement Emit.
19229
19230 2001-09-05  Ravi Pratap  <ravi@ximian.com>
19231
19232         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
19233         member.
19234
19235 2001-09-04  Ravi Pratap  <ravi@ximian.com>
19236
19237         * cs-parser.jay (attribute_arguments): Implement actions.
19238         (attribute): Fix bug in production. Implement action.
19239         (attribute_list): Implement.
19240         (attribute_target): Implement.
19241         (attribute_target_specifier, opt_target_specifier): Implement
19242         (CheckAttributeTarget): New method to check if the attribute target
19243         is valid.
19244         (attribute_section): Implement.
19245         (opt_attributes): Implement.
19246
19247         * attribute.cs : New file to handle attributes.
19248         (Attribute): Class to hold attribute info.
19249
19250         * cs-parser.jay (opt_attribute_target_specifier): Remove production
19251         (attribute_section): Modify production to use 2 different rules to 
19252         achieve the same thing. 1 s/r conflict down !
19253         Clean out commented, useless, non-reducing dimension_separator rules.
19254
19255         * class.cs (TypeContainer.attributes): New member to hold list
19256         of attributes for a type.
19257         (Struct::Struct): Modify to take one more argument, the attribute list.
19258         (Class::Class): Ditto.
19259         (Field::Field): Ditto.
19260         (Method::Method): Ditto.
19261         (Property::Property): Ditto.
19262
19263         * cs-parser.jay (struct_declaration): Update constructor call to
19264         pass in the attributes too.
19265         (class_declaration): Ditto.
19266         (constant_declaration): Ditto.
19267         (field_declaration): Ditto.
19268         (method_header): Ditto.
19269         (fixed_parameter): Ditto.
19270         (parameter_array): Ditto.
19271         (property_declaration): Ditto.
19272
19273         * constant.cs (Constant::Constant): Update constructor similarly.
19274         Use System.Collections.
19275
19276         * parameter.cs (Parameter::Parameter): Update as above.
19277
19278 2001-09-02  Ravi Pratap  <ravi@ximian.com>
19279
19280         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
19281         (TypeContainer.delegates): New member to hold list of delegates.
19282
19283         * cs-parser.jay (delegate_declaration): Implement the action correctly 
19284         this time as I seem to be on crack ;-)
19285
19286 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
19287
19288         * rootcontext.cs (RootContext::IsNamespace): new function, used to
19289         tell whether an identifier represents a namespace.
19290
19291         * expression.cs (NamespaceExpr): A namespace expression, used only
19292         temporarly during expression resolution.
19293         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
19294         utility functions to resolve names on expressions.
19295
19296 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
19297
19298         * codegen.cs: Add hook for StatementExpressions. 
19299
19300         * class.cs: Fix inverted test for static flag in methods.
19301
19302 2001-09-02  Ravi Pratap  <ravi@ximian.com>
19303
19304         * class.cs (Operator::CheckUnaryOperator): Correct error number used
19305         to make it coincide with MS' number.
19306         (Operator::CheckBinaryOperator): Ditto.
19307
19308         * ../errors/errors.txt : Remove error numbers added earlier.
19309
19310         * ../errors/cs1019.cs : Test case for error # 1019
19311
19312         * ../errros/cs1020.cs : Test case for error # 1020
19313
19314         * cs-parser.jay : Clean out commented cruft.
19315         (dimension_separators, dimension_separator): Comment out. Ostensibly not
19316         used anywhere - non-reducing rule.
19317         (namespace_declarations): Non-reducing rule - comment out.
19318
19319         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
19320         with TypeContainer::AddEnum.
19321
19322         * delegate.cs : New file for delegate handling classes.
19323         (Delegate): Class for declaring delegates.
19324
19325         * makefile : Update.
19326
19327         * cs-parser.jay (delegate_declaration): Implement.
19328
19329 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
19330
19331         * class.cs (Event::Define): Implement.
19332         (Event.EventBuilder): New member.
19333
19334         * class.cs (TypeContainer::Populate): Update to define all enums and events
19335         we have.
19336         (Events): New property for the events arraylist we hold. Shouldn't we move to using
19337         readonly fields for all these cases ?
19338
19339 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
19340
19341         * class.cs (Property): Revamp to use the convention of making fields readonly.
19342         Accordingly modify code elsewhere.
19343
19344         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
19345         the Define method of the Property class.
19346
19347         * class.cs : Clean up applied patch and update references to variables etc. Fix 
19348         trivial bug.
19349         (TypeContainer::Populate): Update to define all the properties we have. Also
19350         define all enumerations.
19351
19352         * enum.cs (Define): Implement.
19353
19354 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
19355
19356         * cs-parser.jay (overloadable_operator): The semantic value is an
19357         enum of the Operator class.
19358         (operator_declarator): Implement actions.
19359         (operator_declaration): Implement.
19360
19361         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
19362         validity of definitions.
19363         (Operator::CheckBinaryOperator): Static method to check for binary operators
19364         (TypeContainer::AddOperator): New method to add an operator to a type.
19365
19366         * cs-parser.jay (indexer_declaration): Added line to actually call the
19367         AddIndexer method so it gets added ;-)
19368
19369         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
19370         already taken care of by the MS compiler ?  
19371
19372 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
19373
19374         * class.cs (Operator): New class for operator declarations.
19375         (Operator::OpType): Enum for the various operators.
19376
19377 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
19378
19379         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
19380         ostensibly handle this in semantic analysis.
19381
19382         * cs-parser.jay (general_catch_clause): Comment out
19383         (specific_catch_clauses, specific_catch_clause): Ditto.
19384         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
19385         (catch_args, opt_catch_args): New productions.
19386         (catch_clause): Rewrite to use the new productions above
19387         (catch_clauses): Modify accordingly.
19388         (opt_catch_clauses): New production to use in try_statement
19389         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
19390         and re-write the code in the actions to extract the specific and
19391         general catch clauses by being a little smart ;-)
19392
19393         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
19394         Hooray, try and catch statements parse fine !
19395
19396 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19397
19398         * statement.cs (Block::GetVariableType): Fix logic to extract the type
19399         string from the hashtable of variables.
19400
19401         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
19402         I end up making that mistake ;-)
19403         (catch_clauses): Fixed gross error which made Key and Value of the 
19404         DictionaryEntry the same : $1 !!
19405
19406 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19407
19408         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
19409
19410         * cs-parser.jay (event_declaration): Correct to remove the semicolon
19411         when the add and remove accessors are specified. 
19412
19413 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19414
19415         * cs-parser.jay (IndexerDeclaration): New helper class to hold
19416         information about indexer_declarator.
19417         (indexer_declarator): Implement actions.
19418         (parsing_indexer): New local boolean used to keep track of whether
19419         we are parsing indexers or properties. This is necessary because 
19420         implicit_parameters come into picture even for the get accessor in the 
19421         case of an indexer.
19422         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
19423
19424         * class.cs (Indexer): New class for indexer declarations.
19425         (TypeContainer::AddIndexer): New method to add an indexer to a type.
19426         (TypeContainer::indexers): New member to hold list of indexers for the
19427         type.
19428
19429 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
19430
19431         * cs-parser.jay (add_accessor_declaration): Implement action.
19432         (remove_accessor_declaration): Implement action.
19433         (event_accessors_declaration): Implement
19434         (variable_declarators): swap statements for first rule - trivial.
19435
19436         * class.cs (Event): New class to hold information about event
19437         declarations.
19438         (TypeContainer::AddEvent): New method to add an event to a type
19439         (TypeContainer::events): New member to hold list of events.
19440
19441         * cs-parser.jay (event_declaration): Implement actions.
19442
19443 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
19444
19445         * cs-parser.jay (dim_separators): Implement. Make it a string
19446         concatenating all the commas together, just as they appear.
19447         (opt_dim_separators): Modify accordingly
19448         (rank_specifiers): Update accordingly. Basically do the same
19449         thing - instead, collect the brackets here.
19450         (opt_rank_sepcifiers): Modify accordingly.
19451         (array_type): Modify to actually return the complete type string
19452         instead of ignoring the rank_specifiers.
19453         (expression_list): Implement to collect the expressions
19454         (variable_initializer): Implement. We make it a list of expressions
19455         essentially so that we can handle the array_initializer case neatly too.
19456         (variable_initializer_list): Implement.
19457         (array_initializer): Make it a list of variable_initializers
19458         (opt_array_initializer): Modify accordingly.
19459
19460         * expression.cs (New::NType): Add enumeration to help us
19461         keep track of whether we have an object/delegate creation
19462         or an array creation.
19463         (New:NewType, New::Rank, New::Indices, New::Initializers): New
19464         members to hold data about array creation.
19465         (New:New): Modify to update NewType
19466         (New:New): New Overloaded contructor for the array creation
19467         case.
19468
19469         * cs-parser.jay (array_creation_expression): Implement to call
19470         the overloaded New constructor.
19471
19472 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
19473
19474         * class.cs (TypeContainer::Constructors): Return member
19475         constructors instead of returning null.
19476
19477 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
19478
19479         * typemanager.cs (InitCoreTypes): Initialize the various core
19480         types after we have populated the type manager with the user
19481         defined types (this distinction will be important later while
19482         compiling corlib.dll)
19483
19484         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
19485         on Expression Classification.  Now all expressions have a method
19486         `Resolve' and a method `Emit'.
19487
19488         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
19489         generation from working.     Also add some temporary debugging
19490         code. 
19491
19492 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
19493
19494         * codegen.cs: Lots of code generation pieces.  This is only the
19495         beginning, will continue tomorrow with more touches of polish.  We
19496         handle the fundamentals of if, while, do, for, return.  Others are
19497         trickier and I need to start working on invocations soon.
19498
19499         * gen-treedump.cs: Bug fix, use s.Increment here instead of
19500         s.InitStatement. 
19501
19502         * codegen.cs (EmitContext): New struct, used during code
19503         emission to keep a context.   Most of the code generation will be
19504         here. 
19505
19506         * cs-parser.jay: Add embedded blocks to the list of statements of
19507         this block.  So code generation proceeds in a top down fashion.
19508
19509 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
19510
19511         * statement.cs: Add support for multiple child blocks.
19512
19513 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
19514
19515         * codegen.cs (EmitCode): New function, will emit the code for a
19516         Block of code given a TypeContainer and its ILGenerator. 
19517
19518         * statement.cs (Block): Standard public readonly optimization.
19519         (Block::Block constructors): Link children. 
19520         (Block::Child): Child Linker.
19521         (Block::EmitVariables): Emits IL variable declarations.
19522
19523         * class.cs: Drop support for MethodGroups here, delay until
19524         Semantic Analysis.
19525         (Method::): Applied the same simplification that I did before, and
19526         move from Properties to public readonly fields.
19527         (Method::ParameterTypes): Returns the parameter types for the
19528         function, and implements a cache that will be useful later when I
19529         do error checking and the semantic analysis on the methods is
19530         performed.
19531         (Constructor::GetCallingConvention): Renamed from CallingConvetion
19532         and made a method, optional argument tells whether this is a class
19533         or a structure to apply the `has-this' bit.
19534         (Method::GetCallingConvention): Implement, returns the calling
19535         convention. 
19536         (Method::Define): Defines the type, a second pass is performed
19537         later to populate the methods.
19538
19539         (Constructor::ParameterTypes): implement a cache similar to the
19540         one on Method::ParameterTypes, useful later when we do semantic
19541         analysis. 
19542
19543         (TypeContainer::EmitMethod):  New method.  Emits methods.
19544
19545         * expression.cs: Removed MethodGroup class from here.
19546
19547         * parameter.cs (Parameters::GetCallingConvention): new method.
19548
19549 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
19550
19551         * class.cs (TypeContainer::Populate): Drop RootContext from the
19552         argument. 
19553
19554         (Constructor::CallingConvention): Returns the calling convention.
19555         (Constructor::ParameterTypes): Returns the constructor parameter
19556         types. 
19557
19558         (TypeContainer::AddConstructor): Keep track of default constructor
19559         and the default static constructor.
19560
19561         (Constructor::) Another class that starts using `public readonly'
19562         instead of properties. 
19563
19564         (Constructor::IsDefault): Whether this is a default constructor. 
19565
19566         (Field::) use readonly public fields instead of properties also.
19567
19568         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
19569         track of static constructors;  If none is used, turn on
19570         BeforeFieldInit in the TypeAttributes. 
19571
19572         * cs-parser.jay (opt_argument_list): now the return can be null
19573         for the cases where there are no arguments. 
19574
19575         (constructor_declarator): If there is no implicit `base' or
19576         `this', then invoke the default parent constructor. 
19577
19578         * modifiers.cs (MethodAttr): New static function maps a set of
19579         modifiers flags into a MethodAttributes enum
19580         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
19581         MethodAttr, TypeAttr to represent the various mappings where the
19582         modifiers are used.
19583         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
19584
19585 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
19586
19587         * parameter.cs (GetParameterInfo): Fix bug where there would be no
19588         method arguments.
19589
19590         * interface.cs (PopulateIndexer): Implemented the code generator
19591         for interface indexers.
19592
19593 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
19594
19595         * interface.cs (InterfaceMemberBase): Now we track the new status
19596         here.  
19597
19598         (PopulateProperty): Implement property population.  Woohoo!  Got
19599         Methods and Properties going today. 
19600
19601         Removed all the properties for interfaces, and replaced them with
19602         `public readonly' fields. 
19603
19604 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
19605
19606         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
19607         initialize their hashtables/arraylists only when they are needed
19608         instead of doing this always.
19609
19610         * parameter.cs: Handle refs and out parameters.
19611
19612         * cs-parser.jay: Use an ArrayList to construct the arguments
19613         instead of the ParameterCollection, and then cast that to a
19614         Parameter[] array.
19615
19616         * parameter.cs: Drop the use of ParameterCollection and use
19617         instead arrays of Parameters.
19618
19619         (GetParameterInfo): Use the Type, not the Name when resolving
19620         types. 
19621
19622 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
19623
19624         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
19625         and instead use public readonly fields.
19626
19627         * class.cs: Put back walking code for type containers.
19628
19629 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
19630
19631         * class.cs (MakeConstant): Code to define constants.
19632
19633         * rootcontext.cs (LookupType): New function.  Used to locate types 
19634
19635
19636 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
19637
19638         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
19639         this System.Reflection code is.  Kudos to Microsoft
19640
19641         * typemanager.cs: Implement a type cache and avoid loading all
19642         types at boot time.  Wrap in LookupType the internals.  This made
19643         the compiler so much faster.  Wow.  I rule!
19644
19645         * driver.cs: Make sure we always load mscorlib first (for
19646         debugging purposes, nothing really important).
19647
19648         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
19649         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
19650
19651         * rootcontext.cs: Lookup types on their namespace;  Lookup types
19652         on namespaces that have been imported using the `using' keyword.
19653
19654         * class.cs (TypeContainer::TypeAttr): Virtualize.
19655         (Class::TypeAttr): Return attributes suitable for this bad boy.
19656         (Struct::TypeAttr): ditto.
19657         Handle nested classes.
19658         (TypeContainer::) Remove all the type visiting code, it is now
19659         replaced with the rootcontext.cs code
19660
19661         * rootcontext.cs (GetClassBases): Added support for structs. 
19662
19663 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
19664
19665         * interface.cs, statement.cs, class.cs, parameter.cs,
19666         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
19667         Drop use of TypeRefs, and use strings instead.
19668
19669 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
19670
19671         * rootcontext.cs: 
19672
19673         * class.cs (Struct::Struct): set the SEALED flags after
19674         checking the modifiers.
19675         (TypeContainer::TypeAttr): new property, returns the
19676         TypeAttributes for a class.  
19677
19678         * cs-parser.jay (type_list): Oops, list production was creating a
19679         new list of base types.
19680
19681         * rootcontext.cs (StdLib): New property.
19682         (GetInterfaceTypeByName): returns an interface by type name, and
19683         encapsulates error handling here.
19684         (GetInterfaces): simplified.
19685         (ResolveTree): Encapsulated all the tree resolution here.
19686         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
19687         types. 
19688
19689         * driver.cs: Add support for --nostdlib, to avoid loading the
19690         default assemblies.
19691         (Main): Do not put tree resolution here. 
19692
19693         * rootcontext.cs: Beginning of the class resolution.
19694
19695 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
19696
19697         * rootcontext.cs: Provide better error reporting. 
19698
19699         * cs-parser.jay (interface_base): set our $$ to be interfaces.
19700
19701         * rootcontext.cs (CreateInterface): Handle the case where there
19702         are no parent interfaces.
19703
19704         (CloseTypes): Routine to flush types at the end.
19705         (CreateInterface): Track types.
19706         (GetInterfaces): Returns an array of Types from the list of
19707         defined interfaces.
19708
19709         * typemanager.c (AddUserType): Mechanism to track user types (puts
19710         the type on the global type hash, and allows us to close it at the
19711         end). 
19712
19713 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
19714
19715         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
19716         RecordInterface instead.
19717
19718         * cs-parser.jay: Updated to reflect changes above.
19719
19720         * decl.cs (Definition): Keep track of the TypeBuilder type that
19721         represents this type here.  Not sure we will use it in the long
19722         run, but wont hurt for now.
19723
19724         * driver.cs: Smaller changes to accomodate the new code.
19725
19726         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
19727         when done. 
19728
19729         * rootcontext.cs (CreateInterface):  New method, used to create
19730         the System.TypeBuilder type for interfaces.
19731         (ResolveInterfaces): new entry point to resolve the interface
19732         hierarchy. 
19733         (CodeGen): Property, used to keep track of the code generator.
19734
19735 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
19736
19737         * cs-parser.jay: Add a second production for delegate_declaration
19738         with `VOID'.
19739
19740         (enum_body): Put an opt_comma here instead of putting it on
19741         enum_body or enum_member_declarations so we can handle trailing
19742         commas on enumeration members.  Gets rid of a shift/reduce.
19743
19744         (type_list): Need a COMMA in the middle.
19745
19746         (indexer_declaration): Tell tokenizer to recognize get/set
19747
19748         * Remove old targets.
19749
19750         * Re-add the parser target.
19751
19752 2001-07-13  Simon Cozens <simon@simon-cozens.org>
19753
19754         * cs-parser.jay: Add precendence rules for a number of operators
19755         ot reduce the number of shift/reduce conflicts in the grammar.
19756
19757 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
19758
19759         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
19760         and put it here.
19761
19762         Get rid of old crufty code.
19763
19764         * rootcontext.cs: Use this to keep track of the parsed
19765         representation and the defined types available to the program. 
19766
19767         * gen-treedump.cs: adjust for new convention.
19768
19769         * type.cs: Split out the type manager, and the assembly builder
19770         from here. 
19771
19772         * typemanager.cs: the type manager will live here now.
19773
19774         * cil-codegen.cs: And the code generator here. 
19775
19776 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
19777
19778         * makefile: Fixed up for easy making.
19779
19780 2001-07-13  Simon Cozens <simon@simon-cozens.org>
19781
19782         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
19783         the 
19784
19785         (unary_expression): Expand pre_increment_expression and
19786         post_decrement_expression to reduce a shift/reduce.
19787
19788 2001-07-11  Simon Cozens
19789
19790         * cs-tokenizer.cs: Hex numbers should begin with a 0.
19791
19792         Improve allow_keyword_as_indent name.
19793
19794 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
19795
19796         * Adjustments for Beta2. 
19797
19798 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
19799
19800         * decl.cs: Added `Define' abstract method.
19801         (InTransit): new property, used to catch recursive definitions. 
19802
19803         * interface.cs: Implement `Define'. 
19804
19805         * modifiers.cs: Map Modifiers.constants to
19806         System.Reflection.TypeAttribute flags.
19807
19808         * class.cs: Keep track of types and user-defined types.
19809         (BuilderInit): New method for creating an assembly
19810         (ResolveType): New function to launch the resolution process, only
19811         used by interfaces for now.
19812
19813         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
19814         that are inserted into the name space. 
19815
19816 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
19817
19818         * ARGH.  I have screwed up my tree so many times due to the use of
19819         rsync rather than using CVS.  Going to fix this at once. 
19820
19821         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
19822         load types.
19823
19824 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
19825
19826         * Experiment successful: Use System.Type rather that our own
19827         version of Type.  
19828
19829 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
19830
19831         * cs-parser.jay: Removed nsAliases from here.
19832
19833         Use new namespaces, handle `using XXX;' 
19834
19835         * namespace.cs: Reimplemented namespace handling, use a recursive
19836         definition of the class.  Now we can keep track of using clauses
19837         and catch invalid using clauses.
19838
19839 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
19840
19841         * gen-treedump.cs: Adapted for all the renaming.
19842
19843         * expression.cs (Expression): this class now has a Type property
19844         which returns an expression Type.
19845
19846         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
19847         `Type', as this has a different meaning now in the base
19848
19849 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
19850
19851         * interface.cs, class.cs: Removed from all the sources the
19852         references to signature computation, as we can not do method
19853         signature computation during the parsing time, as we are not
19854         trying to solve at that point distinguishing:
19855
19856         class X {
19857                 void a (Blah x) {}
19858                 void a (NS.Blah x) {}
19859         }
19860
19861         Which depending on the context might be valid or not, as we do not
19862         know if Blah is the same thing as NS.Blah at that point.
19863
19864         * Redid everything so the code uses TypeRefs now instead of
19865         Types.  TypeRefs are just temporary type placeholders, that need
19866         to be resolved.  They initially have a pointer to a string and the
19867         current scope in which they are used.  This is used later by the
19868         compiler to resolve the reference to an actual Type. 
19869
19870         * DeclSpace is no longer a CIR.Type, and neither are
19871         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
19872         are all DeclSpaces, but no Types. 
19873
19874         * type.cs (TypeRefManager): This implements the TypeRef manager,
19875         which keeps track of all the types that need to be resolved after
19876         the parsing has finished. 
19877
19878 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
19879
19880         * ARGH.  We are going to have to store `foreach' as a class rather
19881         than resolving it, as we need to verify error 1579 after name
19882         resolution.   *OR* we could keep a flag that says `This request to
19883         IEnumerator comes from a foreach statement' which we can then use
19884         to generate the error.
19885
19886 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
19887
19888         * class.cs (TypeContainer.AddMethod): we now add methods to the
19889         MethodGroup instead of the method hashtable.  
19890
19891         * expression.cs: Add MethodGroup abstraction, which gets us one
19892         step closer to the specification in the way we handle method
19893         declarations.  
19894
19895         * cs-parser.jay (primary_expression): qualified_identifier now
19896         tried to match up an identifier to a local variable reference or
19897         to a parameter reference.
19898
19899         current_local_parameters is now a parser global variable that
19900         points to the current parameters for the block, used during name
19901         lookup.
19902
19903         (property_declaration): Now creates an implicit `value' argument to
19904         the set accessor.
19905
19906 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
19907
19908         * parameter.cs: Do not use `param' arguments as part of the
19909         signature, per the spec.
19910
19911 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
19912
19913         * decl.cs: Base class for classes, structs and interfaces.  This
19914         is the "Declaration Space" 
19915
19916         * cs-parser.jay: Use CheckDef for checking declaration errors
19917         instead of having one on each function.
19918
19919         * class.cs: Factor out some code for handling error handling in
19920         accordance to the "Declarations" section in the "Basic Concepts"
19921         chapter in the ECMA C# spec.
19922
19923         * interface.cs: Make all interface member classes derive from
19924         InterfaceMemberBase.
19925
19926 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
19927
19928         * Many things: all interfaces are parsed and generated in
19929         gen-treedump.  Support for member variables, constructors,
19930         destructors, properties, constants is there.
19931
19932         Beginning of the IL backend, but very little done, just there for
19933         testing purposes. 
19934
19935 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
19936
19937         * cs-parser.jay: Fix labeled statement.
19938
19939         * cs-tokenizer.cs (escape): Escape " and ' always.
19940         ref_line, ref_name: keep track of the line/filename as instructed
19941         by #line by the compiler.
19942         Parse #line.
19943
19944 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
19945
19946         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
19947         to match the values in System.CodeDOM.
19948
19949         Divid renamed to Divide.
19950
19951         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
19952         statements. 
19953         (Statements.set): remove.
19954
19955         * System.CodeDOM/CodeCatchClause.cs: always have a valid
19956         statements. 
19957
19958         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
19959         falseStatements always have valid values. 
19960
19961         * cs-parser.jay: Use System.CodeDOM now.
19962