2004-09-15 Marek Safar <marek.safar@seznam.cz>
[mono.git] / mcs / mcs / ChangeLog
1 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
2
3         Fixed bug #65766
4         * const.cs: Explicitly set constant as static.
5
6 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
7
8         Fixed bug #64226
9         * cs-parser.jay: Add error 1017 report.
10
11 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
12
13         Fixed bug #59980, #64224
14         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
15
16         * typemanager.cs (IsSpecialMethod): Simplified
17
18 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
19
20         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
21         condition with better params.
22
23 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
24
25         Fixed bug #65238
26         * attribute.cs (Resolve): Property has to have both
27         accessors.
28
29 2004-09-14  Martin Baulig  <martin@ximian.com>
30
31         Merged latest changes into gmcs.  Please keep this comment in
32         here, it makes it easier for me to see what changed in MCS since
33         the last time I merged.
34
35 2004-09-14  Martin Baulig  <martin@ximian.com>
36
37         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
38
39 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
40
41         Fixed bug #61902
42         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
43         called and is obsolete then this member suppress message
44         when call is inside next [Obsolete] method or type.
45
46         * expression.cs: Use TestObsoleteMethodUsage member.
47
48 2004-09-14  Martin Baulig  <martin@ximian.com>
49
50         * cs-parser.jay: Sync a bit with the GMCS version.
51
52 2004-09-14  Martin Baulig  <martin@ximian.com>
53
54         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
55         (CSharpParser.yacc_verbose_flag): New public field.
56
57         * genericparser.cs: Removed.
58
59 2004-09-14  Raja R Harinath  <rharinath@novell.com>
60
61         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
62
63 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
64
65         * class.cs (MethodCore.CheckBase): Fix bug #65757.
66
67 2004-09-10  Martin Baulig  <martin@ximian.com>
68
69         Backported my MemberName changes from GMCS into MCS.
70
71         - we are now using a special `MemberName' class instead of using
72         strings; in GMCS, the `MemberName' also contains the type
73         arguments.
74
75         - changed the grammar rules a bit:
76           * the old `member_name' is now a `namespace_or_type_name':
77             The rule is that we use `namespace_or_type_name' everywhere
78             where we expect either a "member name" (GetEnumerator) or a
79             "member name" with an explicit interface name
80             (IEnumerable.GetEnumerator).
81             In GMCS, the explicit interface name may include type arguments
82             (IEnumerable<T>.GetEnumerator).
83           * we use `member_name' instead of just `IDENTIFIER' for
84             "member names":
85             The rule is that we use `member_name' wherever a member may
86             have type parameters in GMCS.       
87
88         * decl.cs (MemberName): New public class.
89         (MemberCore.MemberName): New public readonly field.
90         (MemberCore.ctor): Take a `MemberName' argument, not a string.
91         (DeclSpace): Likewise.
92
93         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
94         * enum.cs (Enum.ctor): Likewise.
95
96         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
97         MemberName.     
98         (AliasEntry.ctor): Take a MemberName, not an Expression.
99         (AliasEntry.UsingAlias): Likewise.
100
101         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
102         (IMethodData.MemberName): Changed type from string to MemberName.
103         (MemberBase.ExplicitInterfaceName): Likewise.
104         (AbstractPropertyEventMethod.SetupName): Make this private.
105         (AbstractPropertyEventMethod.ctor): Added `string prefix'
106         argument; compute the member name here.
107         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
108         on the `member.MemberName' and the `prefix'.
109
110         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
111         not `type_name'.
112         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
113         thus, we get a `MemberName' instead of a `string'.  These
114         declarations may have type parameters in GMCS.
115         (interface_method_declaration, delegate_declaration): Likewise.
116         (class_declaration, interface_declaration): Likewise.
117         (method_header): Use `namespace_or_type_name' instead of
118         `member_name'.  We may be an explicit interface implementation.
119         (property_declaration, event_declaration): Likewise.
120         (member_name): This is now just an `IDENTIFIER', not a
121         `namespace_or_type_name'.
122         (type_name, interface_type): Removed.
123         (namespace_or_type_name): Return a MemberName, not an Expression.
124         (primary_expression): Use `member_name' instead of `IDENTIFIER';
125         call GetTypeExpression() on the MemberName to get an expression.
126         (IndexerDeclaration.interface_type): Changed type from string to
127         MemberName.
128         (MakeName): Operate on MemberName's instead of string's.
129
130 2004-09-13  Raja R Harinath  <rharinath@novell.com>
131
132         Fix bug #55770.
133         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
134         (NamespaceEntry.Lookup): Add new argument to flag if we want the
135         lookup to avoid symbols introduced by 'using'.
136         * rootcontext.cs (NamespaceLookup): Update.
137
138 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
139
140         * class.cs (TypeContainer.DoDefineMembers): Do not call
141         DefineDefaultConstructor for static classes.
142
143 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
144
145         * attribute.cs (Attribute.Resolve): Add error 653 report.
146
147         * class.cs (Class.ApplyAttributeBuilder): Add error 641
148         report.
149         (Method.ApplyAttributeBuilder): Add error 685 report.
150         (Operator.Define): Add error 564 report.
151
152         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
153
154         * expression.cs (Invocation.DoResolve): Add error
155         245 and 250 report.
156
157         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
158         error 674 report.
159
160 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
161
162         * class.cs (ConstructorInitializer.Resolve):
163         Wrong error number (515->516).
164
165 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
166
167         * class.cs (Indexer.Define): Add error 631 report.
168
169 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
170
171         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
172
173 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
174
175         * expression.cs (Probe.DoResolve): Add error CS0241 report.
176
177 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
178
179         * cs-parser.jay: Added error CS0241 report.
180
181 2004-09-10  Raja R Harinath  <rharinath@novell.com>
182
183         * cs-parser.jay (fixed_statement): Introduce a scope for the
184         declaration in the 'fixed' statement.
185
186 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
187
188         * cs-parser.jay: Added CS0230 error report.
189
190 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
191
192         * cs-parser.jay: Added errors CS0231 and CS0257 report.
193
194 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
195
196         * expression.cs (Argument.Resolve): Added error CS0192 and
197         CS0199 report.
198
199 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
200
201         C# 2.0 #pragma warning feature
202
203         * cs-tokenizer.cs (PreProcessPragma): New method; 
204         Handles #pragma directive.
205
206         * report.cs (WarningRegions): New class; Support
207         class for #pragma warning directive. It tests whether
208         warning is enabled for a given line.
209
210 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
211
212         * const.cs: Add more descriptive error report, tahnks to
213         Sebastien. 
214
215 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
216
217         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
218
219 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
220
221         * expression.cs: Apply patch from Ben: Remove dead code from
222         ArrayCreation, and remove the TurnintoConstant call in const.cs,
223         as that code just threw an exception anwyays.
224
225         * const.cs: Remove the call to the turnintoconstant, for details
226         see bug: #63144
227         
228         * literal.cs: The type of the null-literal is the null type;  So
229         we use a placeholder type (literal.cs:System.Null, defined here)
230         for it.
231
232         * expression.cs (Conditional.DoResolve): Remove some old code that
233         is no longer needed, conversions have been fixed.
234
235         (ArrayCreationExpression.DoResolve): Return false if we fail to
236         resolve the inner expression.
237
238 2004-09-07  Raja R Harinath  <rharinath@novell.com>
239
240         Fix test-290.cs.
241         * cs-parser.jay (delegate_declaration): Record a delegate
242         declaration as a type declaration.
243         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
244
245 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
246
247         * parameter.cs: Do not crash if the type can not be resolved. 
248
249         * expression.cs: Report errors with unsafe pointers, fixes #64896
250
251 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
252
253         * expression.cs: Pointer arith always needs to do a conv.i
254         if the operand is a long. fix 65320
255
256 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
257
258         Fixed cs0619-37.cs, cs0619-38.cs
259
260         * enum.cs (GetObsoleteAttribute): Removed.
261
262         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
263         on Enum member is double staged. The first is tested member
264         and then enum.
265
266 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
267
268         Fixed #56986, #63631, #65231
269
270         * class.cs: (TypeContainer.AddToMemberContainer): New method,
271         adds member to name container.
272         (TypeContainer.AddToTypeContainer): New method, adds type to
273         name container.
274         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
275         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
276         AddOperator): Simplified by reusing AddToMemberContainer.
277         (TypeContainer.UserDefinedStaticConstructor): Changed to property
278         instead of field.
279         (Method.CheckForDuplications): Fixed implementation to test all
280         possibilities.
281         (MemberBase): Detection whether member is explicit interface
282         implementation is now in constructor.
283         (MemberBase.UpdateMemberName): Handles IndexerName.
284         (Accessor): Changed to keep also location information.
285         (AbstractPropertyEventMethod): Is derived from MemberCore.
286         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
287         will be emited or not.
288         (PropertyBase.AreAccessorsDuplicateImplementation):
289         Tests whether accessors are not in collision with some method.
290         (Operator): Is derived from MethodCore to simplify common
291         operations.
292
293         * decl.cs (Flags.TestMethodDuplication): Test for duplication
294         must be performed.
295         (DeclSpace.AddToContainer): Adds the member to defined_names
296         table. It tests for duplications and enclosing name conflicts.
297
298         * enum.cs (EnumMember): Clean up to reuse the base structures
299
300 2004-09-03  Martin Baulig  <martin@ximian.com>
301
302         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
303         into TypeContainer, to make partial classes work again.
304
305 2004-09-03  Martin Baulig  <martin@ximian.com>
306
307         * rootcontext.cs (RootContext.V2): Removed.
308
309 2004-03-23  Martin Baulig  <martin@ximian.com>
310
311         * expression.cs (Invocation.OverloadResolve): Added `bool
312         may_fail' argument and use it instead of the Location.IsNull() hack.
313
314 2004-09-03  Martin Baulig  <martin@ximian.com>
315
316         Merged latest changes into gmcs.  Please keep this comment in
317         here, it makes it easier for me to see what changed in MCS since
318         the last time I merged.
319
320 2004-09-03  Raja R Harinath  <rharinath@novell.com>
321
322         Fix #61128.
323         * expression.cs (BetterConversion): Don't allow either conversion 
324         to be null.  Remove redundant implicit conversion test when 'q ==
325         null' -- when this function is invoked, we already know that the
326         implicit conversion exists.
327         (BetterFunction): Assume that 'best' is non-null.  Remove
328         redundant reimplementation of IsApplicable when 'best' is null.
329         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
330         number of arguments.
331         (IsAncestralType): Extract from OverloadResolve.
332         (OverloadResolve): Make robust to the MethodGroupExpr being
333         unsorted.  Implement all the logic of Section 14.5.5.1, and
334         support overloading of methods from multiple applicable types.
335         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
336
337         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
338         (RealError, Warning): Append type of report to related symbol.
339
340 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
341
342         * enum.cs: Fixed CLS-Compliance checks for enum members.
343         Error tests cs3008-8.cs, cs3014-8.cs
344
345 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
346
347         Fixed bug #62342, #63102
348         * class.cs: ImplementIndexer uses member.IsExplicitImpl
349         like ImplementMethod.
350
351 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
352
353         * attribute.cs (Attribute.GetAttributeArgumentExpression):
354         Fixed bug #65170.
355
356 2004-09-02  Martin Baulig  <martin@ximian.com>
357
358         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
359         TypeManager.GetArgumentTypes() rather than calling GetParameters()
360         on the MethodBase.
361
362 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
363
364         C# 2.0 Static classes implemented
365
366         * class.cs (TypeContainer): instance_constructors,
367         initialized_fields, initialized_static_fields,
368         default_constructor, base_inteface_types are protected to be
369         accessible from StaticClass.
370         (TypeContainer.DefineDefaultConstructor): New virtual method
371         for custom default constructor generating
372         (StaticClass): New class to handle "Static classes" feature.
373
374         * cs-parser.jay: Handle static keyword on class like instance
375         of StaticClass.
376
377         * driver.cs: Added "/langversion" command line switch with two
378         options (iso-1, default).
379
380 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
381
382         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
383
384 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
385
386         * delegate.cs: Style.
387
388 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
389
390         * delegate.cs: Add seperate instance expr field for miguel.
391
392 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
393
394         * PointerArithmetic (Resolve): make sure we are not doing
395         pointer arith on void*. Also, make sure we are resolved
396         by not setting eclass until resolve.
397
398         All callers: Make sure that PointerArithmetic gets resolved.
399
400 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
401
402         * ArrayCreation (LookupType): If the type does not resolve 
403         to an array, give an error.
404
405 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
406
407         * statement.cs (Try.Resolve): Fixed bug #64222
408
409 2004-08-27  Martin Baulig  <martin@ximian.com>
410
411         * class.cs
412         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
413         crash here.     
414
415 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
416
417         * ecore.cs (Constantify): Get underlying type via
418         System.Enum.GetUnderlyingType to avoid StackOverflow on the
419         Windows in special cases.
420
421 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
422
423         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
424         for obtaining also private methods.
425         (GetRemoveMethod): Used GetRemoveMethod (true)
426         for obtaining also private methods.
427
428 2004-08-24  Martin Baulig  <martin@ximian.com>
429
430         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
431         MethodAttributes.HideBySig for operators.
432
433 2004-08-23  Martin Baulig  <martin@ximian.com>
434
435         Back to the old error reporting system :-)
436
437         * report.cs (Message): Removed.
438         (Report.MessageData, ErrorData, WarningData): Removed.
439         (Report.Error, Warning): Back to the old system.
440
441 2004-08-23  Martin Baulig  <martin@ximian.com>
442
443         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
444
445         * class.cs (TypeContainer.ParentContainer): New public virtual
446         method; replaces the explicit interface implementation.
447         (ClassPart.ParentContainer): Override.
448
449 2004-08-23  Martin Baulig  <martin@ximian.com>
450
451         * statement.cs (Switch): Added support for constant switches; see
452         #59428 or test-285.cs.
453
454 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
455
456         Fixed bug #62740.
457         * statement.cs (GetEnumeratorFilter): Removed useless
458         logic because C# specs is strict. GetEnumerator must be
459         public.
460
461 2004-08-22  Martin Baulig  <martin@ximian.com>
462
463         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
464         a switch and may break, reset the barrier.  Fixes #59867.
465
466 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
467
468         CLS-Compliance speed up (~5% for corlib)
469
470         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
471         New method. Tests container for CLS-Compliant names
472
473         * class.cs (TypeContainer.VerifyClsName): New method.
474         Checks whether container name is CLS Compliant.
475         (Constructor): Implements IMethodData.
476
477         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
478         low-case table for CLS Compliance test.
479         (MemberCache.VerifyClsParameterConflict): New method.
480         Checks method parameters for CS3006 error.
481
482         * enum.cs (EnumMember): Is derived from MemberCore.
483         (Enum.VerifyClsName): Optimized for better performance.
484
485 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
486
487         * report.cs: Renamed Error_T to Error and changed all
488         references.
489
490 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
491
492         * class.cs (TypeContainer.IndexerArrayList): New inner class
493         container for indexers.
494         (TypeContainer.DefaultIndexerName): New constant for default
495         indexer name. Replaced all "Item" with this constant.
496         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
497
498         * typemanager.cs (TypeManager.default_member_ctor): Cache here
499         DefaultMemberAttribute constructor.
500
501 2004-08-05  Martin Baulig  <martin@ximian.com>
502
503         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
504         Fix bug #59429.
505
506 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
507
508         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
509         multi platforms problem.
510
511         * compiler.csproj: Included shared files.
512
513 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
514
515         Fix bug 60333, 55971 in the more general way
516         * attribute.cs (Attribute.GetAttributeArgumentExpression):
517         Added arg_type argument for constant conversion.
518         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
519
520 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
521
522         Fix bug #59760
523         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
524         OperatorArrayList, MethodCoreArrayList for typecontainer
525         containers. Changed class member types to these new types.
526         (MethodArrayList.DefineMembers): Added test for CS0659.
527
528 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
529
530         * cfold.cs: Synchronize the folding with the code in expression.cs
531         Binary.DoNumericPromotions for uint operands.
532
533         * attribute.cs: Revert patch from Raja, it introduced a regression
534         while building Blam-1.2.1 (hard to isolate a test case).
535
536 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
537
538         Fix for #55382
539         * class.cs:
540         (TypeContainer.Define): Renamed to DefineContainerMembers because of
541         name collision.
542         (MethodCore.parent_method): New member. The method we're overriding
543         if this is an override method.
544         (MethodCore.CheckBase): Moved from Method class and made common.
545         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
546         private.
547         (MethodCore.CheckForDuplications): New abstract method. For custom
548         member duplication search in a container
549         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
550         method and its return type.
551         (Event.conflict_symbol): New member. Symbol with same name in the
552         parent class.
553
554         * decl.cs:
555         (MemberCache.FindMemberWithSameName): New method. The method
556         is looking for conflict with inherited symbols.
557
558 2004-08-04  Martin Baulig  <martin@ximian.com>
559
560         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
561
562         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
563
564 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
565
566         * report.cs (Message): New enum for better error, warning reference in
567         the code.
568         (MessageData): New inner abstract class. It generally handles printing of
569         error and warning messages.
570         Removed unused Error, Warning, Message methods.
571
572 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
573
574         Fix for cs0592-8.cs test
575         * attribute.cs
576         (Attributable.ValidAttributeTargets): Made public.
577         (Attribute.ExplicitTarget): New member for explicit target value.
578         (Attribute.CheckTargets): Now we translate explicit attribute
579         target to Target here.
580
581 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
582
583         * ecore.cs (MethodGroupExpr): new IsBase property.
584
585         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
586
587         * delegate.cs (DelegateCreation): store a MethodGroupExpr
588         rather than an instance expr.
589
590         (DelegateCreation.Emit): Use the method group rather than
591         the instance expression. Also, if you have base.Foo as the
592         method for a delegate, make sure to emit ldftn, not ldftnvirt.
593
594         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
595
596         (NewDelegate.DoResolve): Only check for the existance of Invoke
597         if the method is going to be needed. Use MethodGroupExpr.
598
599         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
600
601         * expression.cs: For pointer arith., make sure to use
602         the size of the type, not the size of the pointer to
603         the type.
604
605 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
606
607         Fix for #60722
608         * class.cs (Class): Added error CS0502 test.
609
610 2004-08-03  John Luke  <jluke@cfl.rr.com>
611             Raja R Harinath  <rharinath@novell.com>
612
613         Fix for #60997.
614         * attribute.cs (Attribute.complained_before): New flag.
615         (Attribute.ResolveType, Attribute.Resolve),
616         (Attribute.DefinePInvokeMethod): Set it.
617         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
618         
619 2004-08-03  Martin Baulig  <martin@ximian.com>
620
621         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
622         use a user-defined operator; we still need to do numeric
623         promotions in case one argument is a builtin type and the other
624         one has an implicit conversion to that type.  Fixes #62322.
625
626 2004-08-02  Martin Baulig  <martin@ximian.com>
627
628         * statement.cs (LocalInfo.Flags): Added `IsThis'.
629         (LocalInfo.IsThis): New public property.
630         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
631
632 2004-08-01  Martin Baulig  <martin@ximian.com>
633
634         * class.cs (TypeContainer.GetClassBases): Don't set the default
635         here since we may get called from GetPartialBases().
636         (TypeContainer.DefineType): If GetClassBases() didn't return a
637         parent, use the default one.
638
639 2004-07-30  Duncan Mak  <duncan@ximian.com>
640
641         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
642
643 2004-07-30  Martin Baulig  <martin@ximian.com>
644
645         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
646
647         * class.cs (SourceMethod): New public class, derive from the
648         symbol writer's ISourceMethod.
649         (Method): Use the new symbol writer API.
650
651         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
652         as argument and use the new symbol writer.
653
654         * location.cs
655         (SourceFile): Implement the symbol writer's ISourceFile.
656         (Location.SymbolDocument): Removed.
657         (Location.SourceFile): New public property.
658
659         * symbolwriter.cs: Use the new symbol writer API.
660
661 2004-07-30  Raja R Harinath  <rharinath@novell.com>
662
663         * Makefile (install-local): Remove.  Functionality moved to
664         executable.make.
665
666 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
667
668         * Makefile: Install mcs.exe.config file together with mcs.exe.
669         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
670         correct runtime version.
671         
672 2004-07-25  Martin Baulig  <martin@ximian.com>
673
674         * class.cs
675         (TypeContainer.RegisterOrder): Removed, this was unused.
676         (TypeContainer, interface_order): Removed.
677         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
678         TypeContainer as argument since we can also be called with a
679         `PartialContainer' for a partial class/struct/interface.
680         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
681         of checking whether we're an `Interface' - we could be a
682         `PartialContainer'.
683         (PartialContainer.Register): Override; call
684         AddClass()/AddStruct()/AddInterface() on our parent.
685
686         * cs-parser.jay (interface_member_declaration): Add things to the
687         `current_container', not the `current_class'.
688
689         * rootcontext.cs (RegisterOrder): The overloaded version which
690         takes an `Interface' was unused, removed.
691
692         * typemanager.cs (TypeManager.LookupInterface): Return a
693         `TypeContainer', not an `Interface'.
694         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
695         contain a `PartialContainer' for an interface, so check it's
696         `Kind' to figure out what it is.
697
698 2004-07-25  Martin Baulig  <martin@ximian.com>
699
700         * class.cs (Class.DefaultTypeAttributes): New public constant.
701         (Struct.DefaultTypeAttributes): Likewise.
702         (Interface.DefaultTypeAttributes): Likewise.
703         (PartialContainer.TypeAttr): Override this and add the
704         DefaultTypeAttributes.
705
706 2004-07-25  Martin Baulig  <martin@ximian.com>
707
708         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
709         we can just use the `Parent' field instead.
710
711 2004-07-25  Martin Baulig  <martin@ximian.com>
712
713         * class.cs (TypeContainer.Emit): Renamed to EmitType().
714
715 2004-07-25  Martin Baulig  <martin@ximian.com>
716
717         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
718         our parts before defining any methods.
719         (TypeContainer.VerifyImplements): Make this virtual.
720         (ClassPart.VerifyImplements): Override and call VerifyImplements()
721         on our PartialContainer.
722
723 2004-07-25  Martin Baulig  <martin@ximian.com>
724
725         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
726
727         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
728         argument, we can just use the `Parent' field instead.
729
730         * class.cs
731         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
732         (MemberBase.DoDefine): Likewise.
733
734 2004-07-24  Martin Baulig  <martin@ximian.com>
735
736         * decl.cs (MemberCore.Parent): New public field.
737         (DeclSpace.Parent): Moved to MemberCore.
738
739         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
740         (MemberBase.ctor): Added TypeContainer argument, pass it to our
741         parent's .ctor.
742         (FieldBase, Field, Operator): Likewise.
743         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
744         (EventField, Event): Likewise.
745
746 2004-07-23  Martin Baulig  <martin@ximian.com>
747
748         * class.cs (PartialContainer): New public class.
749         (ClassPart): New public class.
750         (TypeContainer): Added support for partial classes.
751         (TypeContainer.GetClassBases): Splitted some of the functionality
752         out into GetNormalBases() and GetPartialBases().
753
754         * cs-tokenizer.cs (Token.PARTIAL): New token.
755         (Tokenizer.consume_identifier): Added some hacks to recognize
756         `partial', but only if it's immediately followed by `class',
757         `struct' or `interface'.
758
759         * cs-parser.jay: Added support for partial clases.
760
761 2004-07-23  Martin Baulig  <martin@ximian.com>
762
763         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
764         a `DeclSpace' and also made it readonly.
765         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
766         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
767         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
768
769         * cs-parser.jay: Pass the `current_class', not the
770         `current_container' (at the moment, this is still the same thing)
771         to a new Method, Property, Event, Indexer or Constructor.
772
773 2004-07-23  Martin Baulig  <martin@ximian.com>
774
775         * cs-parser.jay (CSharpParser): Added a new `current_class' field
776         and removed the `current_interface' one.
777         (struct_declaration, class_declaration, interface_declaration):
778         Set `current_class' to the newly created class/struct/interface;
779         set their `Bases' and call Register() before parsing their body.
780
781 2004-07-23  Martin Baulig  <martin@ximian.com>
782
783         * class.cs (Kind): New public enum.
784         (TypeContainer): Made this class abstract.
785         (TypeContainer.Kind): New public readonly field.
786         (TypeContainer.CheckDef): New public method; moved here from
787         cs-parser.jay.
788         (TypeContainer.Register): New public abstract method.
789         (TypeContainer.GetPendingImplementations): New public abstract
790         method.
791         (TypeContainer.GetClassBases): Removed the `is_class' and
792         `is_iface' parameters.
793         (TypeContainer.DefineNestedTypes): Formerly known as
794         DoDefineType().
795         (ClassOrStruct): Made this class abstract.
796
797         * tree.cs (RootTypes): New public type. 
798
799 2004-07-20  Martin Baulig  <martin@ximian.com>
800
801         * tree.cs (Tree.RecordNamespace): Removed.
802         (Tree.Namespaces): Removed.
803
804         * rootcontext.cs (RootContext.IsNamespace): Removed.
805
806         * cs-parser.jay (namespace_declaration): Just create a new
807         NamespaceEntry here.
808
809 2004-07-20  Martin Baulig  <martin@ximian.com>
810
811         * statement.cs (ExceptionStatement): New abstract class.  This is
812         now used as a base class for everyone who's using `finally'.
813         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
814         our local variables before using them.
815
816         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
817         virtual method.  This is used by Yield.Resolve() to "steal" an
818         outer block's `finally' clauses.
819         (FlowBranchingException): The .ctor now takes an ExceptionStatement
820         argument.
821
822         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
823         version which takes an ExceptionStatement.  This version must be
824         used to create exception branchings.
825
826         * iterator.cs
827         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
828         (Iterator.EmitMoveNext): Added exception support; protect the
829         block with a `fault' clause, properly handle 'finally' clauses.
830         (Iterator.EmitDispose): Run all the `finally' clauses here.
831
832 2004-07-20  Martin Baulig  <martin@ximian.com>
833
834         * iterator.cs: This is the first of a set of changes in the
835         iterator code.  Match the spec more closely: if we're an
836         IEnumerable, then GetEnumerator() must be called.  The first time
837         GetEnumerator() is called, it returns the current instance; all
838         subsequent invocations (if any) must create a copy.
839
840 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
841
842         * expression.cs: Resolve the constant expression before returning
843         it. 
844
845 2004-07-19  Martin Baulig  <martin@ximian.com>
846
847         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
848         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
849         the return type of the new EmitContext.
850
851 2004-07-18  Martin Baulig  <martin@ximian.com>
852
853         * class.cs (Property.Define): Fix iterators.
854
855         * iterators.cs (Iterator.Define): Moved the
856         `container.AddInterator (this)' call here from the .ctor; only do
857         it if we resolved successfully.
858
859 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
860
861         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
862         `true' for preprocessing directives that we parse.  The return
863         value indicates whether we should return to regular tokenizing or
864         not, not whether it was parsed successfully.
865
866         In the past if we were in: #if false ... #line #endif, we would
867         resume parsing after `#line'.  See bug 61604.
868
869         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
870         building: IsEnumType should return true only for enums, not for
871         enums or System.Enum itself.  This fixes #61593.
872
873         Likely what happened is that corlib was wrong: mcs depended on
874         this bug in some places.  The bug got fixed, we had to add the
875         hack, which caused bug 61593.
876
877         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
878         that was a workaround for the older conditions.
879
880 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
881
882         * assign.cs: IAssignMethod has a new interface, as documented
883         inline. All assignment code now uses this new api.
884
885         * ecore.cs, expression.cs: All classes which implement
886         IAssignMethod now use the new interface.
887
888         * expression.cs (Invocation): add a hack to EmitCall so that
889         IndexerAccess can be the target of a compound assignment without
890         evaluating its arguments twice.
891
892         * statement.cs: Handle changes in Invocation api.
893
894 2004-07-16  Martin Baulig  <martin@ximian.com>
895
896         * iterators.cs: Rewrote this.  We're now using one single Proxy
897         class for both the IEnumerable and the IEnumerator interface and
898         `Iterator' derives from Class so we can use the high-level API.
899
900         * class.cs (TypeContainer.AddIterator): New method.
901         (TypeContainer.DoDefineType): New protected virtual method, which
902         is called from DefineType().
903         (TypeContainer.DoDefineMembers): Call DefineType() and
904         DefineMembers() on all our iterators.
905         (TypeContainer.Emit): Call Emit() on all our iterators.
906         (TypeContainer.CloseType): Call CloseType() on all our iterators.
907
908         * codegen.cs (EmitContext.CurrentIterator): New public field.
909
910 2004-07-15  Martin Baulig  <martin@ximian.com>
911
912         * typemanager.cs
913         (TypeManager.not_supported_exception_type): New type.   
914
915 2004-07-14  Martin Baulig  <martin@ximian.com>
916
917         * iterators.cs: Use real error numbers.
918
919 2004-07-14  Martin Baulig  <martin@ximian.com>
920
921         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
922         requires this to be a System.Collection.IEnumerable and not a
923         class implementing that interface.
924         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
925
926 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
927
928         * class.cs: Fixed previous fix, it broke some error tests.
929
930 2004-07-12  Martin Baulig  <martin@ximian.com>
931
932         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
933         Fixes #61293.
934
935 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
936
937         * assign.cs (LocalTemporary): Add new argument: is_address,If
938         `is_address' is true, then the value that we store is the address
939         to the real value, and not the value itself.
940         
941         * ecore.cs (PropertyExpr): use the new local temporary
942         stuff to allow us to handle X.Y += z (where X is a struct)
943
944 2004-07-08  Martin Baulig  <martin@ximian.com>
945
946         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
947         not always return, just like we're doing in Using.Resolve().
948
949 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
950
951         * cs-parser.jay (fixed_statement): flag this as Pinned.
952
953 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
954
955         * typemanager.cs (TypeManager): Removed MakePinned method, this
956         mechanism is replaced with the .NET 2.x compatible mechanism of
957         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
958
959         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
960         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
961         `IsFixed' property which has a different meaning.
962
963 2004-07-02  Raja R Harinath  <rharinath@novell.com>
964
965         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
966         visible from inside a nested class, not just the names of the
967         immediately enclosing class.
968         Fix for bug #60730.
969
970 2004-06-24  Raja R Harinath  <rharinath@novell.com>
971
972         * expression.cs (BetterConversion): Remove buggy special-case
973         handling of "implicit constant expression conversions".  At this
974         point, we already know that the conversion is possible -- we're
975         only checking to see which is better.
976
977 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
978
979         * cs-parser.jay: Added error CS0210 test.
980
981 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
982
983         * cs-parser.jay: Added error CS0134 test.
984
985 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
986
987         Fix bug #52507
988         * cs-parser.jay: Added error CS0145 test.
989
990 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
991
992         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
993
994 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
995         
996         * expression.cs (StackAlloc.Resolve): The argument may not
997         be a constant; deal with this case.
998         
999 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
1000
1001         * attribute.cs (IndexerName_GetIndexerName): Renamed to
1002         GetIndexerAttributeValue.
1003         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
1004
1005         * class.cs (Indexer.Define): Added error tests for CS0415,
1006         CS0609.
1007
1008 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
1009
1010         * attribute.cs (Attribute.Resolve): Keep field code in sync with
1011         property code.
1012
1013 2004-06-23  Martin Baulig  <martin@ximian.com>
1014
1015         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
1016         neither return nor throw, reset the barrier as well.  Fixes #60457.
1017
1018 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
1019
1020         * class.cs : EventAttributes is now set to None by default.
1021           This fixes bug #60459.
1022
1023 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1024
1025         Fix bug #60219
1026         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1027         Don't throw exception but return null (it's sufficient now).
1028
1029 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1030
1031         * typemanager.cs (GetArgumentTypes): Faster implementation.
1032
1033 2004-06-18  Martin Baulig  <martin@ximian.com>
1034
1035         * attribute.cs (Attribute.Resolve): Check whether we're an
1036         EmptyCast which a Constant child.  Fixes #60333.
1037
1038 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
1039
1040         * statement.cs (EmitCollectionForeach): Account for the fact that
1041         not all valuetypes are in areas which we can take the address of.
1042         For these variables, we store to a temporary variable. Also, make
1043         sure that we dont emit a `callvirt' on a valuetype method.
1044
1045 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1046
1047         * expression.cs (StackAlloc.DoReSolve): Added test for
1048         negative parameter (CS0247).
1049
1050 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1051
1052         Fix bug #59792
1053         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
1054
1055 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1056
1057         Fix bug #59781
1058         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
1059         ulong.
1060
1061 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1062
1063         Fix bug #58254 & cs1555.cs, cs1556.cs
1064         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
1065
1066 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1067
1068         * cs-parser.jay: Added error CS1669 test for indexers.
1069
1070 2004-06-11  Martin Baulig  <martin@ximian.com>
1071
1072         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
1073         call this twice: for params and varargs methods.
1074
1075 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1076
1077         * class.cs:
1078         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
1079
1080 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1081
1082         * attribute.cs (Attribute.GetValidTargets): Made public.
1083
1084         * class.cs: 
1085         (AbstractPropertyEventMethod): New class for better code sharing.
1086         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
1087         CS1667 report.
1088         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
1089
1090 2004-06-11  Raja R Harinath  <rharinath@novell.com>
1091
1092         Fix bug #59477.
1093         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
1094         that the call to Resolve is part of a MemberAccess.
1095         (Expression.Resolve): Use it for SimpleName resolution.
1096         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
1097         Add 'intermediate' boolean argument.
1098         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
1099         error message when the SimpleName can be resolved ambiguously
1100         between an expression and a type.
1101         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
1102         public.
1103         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
1104         call on the left-side.
1105
1106 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1107
1108         * class.cs:
1109         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
1110
1111 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1112
1113         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
1114
1115 2004-06-11  Martin Baulig  <martin@ximian.com>
1116
1117         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
1118         varargs methods if applicable.
1119
1120 2004-06-11  Martin Baulig  <martin@ximian.com>
1121
1122         * expression.cs (Invocation.EmitCall): Don't use
1123         `method.CallingConvention == CallingConventions.VarArgs' since the
1124         method could also have `CallingConventions.HasThis'.
1125
1126 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1127
1128         * class.cs (Event.GetSignatureForError): Implemented.
1129         Fixed crash in error test cs3010.cs
1130
1131 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
1132
1133         * cs-tokenizer.cs: Change the way we track __arglist to be
1134         consistent with the other keywords.
1135
1136 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
1137
1138         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
1139         tomorrow.
1140
1141 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
1142
1143         * codegen.cs: Check that all referenced assemblies have a strongname
1144         before strongnaming the compiled assembly. If not report error CS1577.
1145         Fix bug #56563. Patch by Jackson Harper.
1146         * typemanager.cs: Added a method to return all referenced assemblies.
1147         Fix bug #56563. Patch by Jackson Harper.
1148
1149 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
1150
1151         * class.cs:
1152         (Method.ApplyAttributeBuilder): Moved and added conditional
1153         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
1154
1155         * delegate.cs:
1156         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
1157
1158 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
1159
1160         Fixed #59640
1161         * class.cs: (EventField.attribute_targets): Changed default target.
1162
1163 2004-06-08  Martin Baulig  <martin@ximian.com>
1164
1165         * expression.cs (Invocation.EmitCall): Enable varargs methods.
1166
1167 2004-06-08  Martin Baulig  <martin@ximian.com>
1168
1169         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
1170
1171 2004-06-07  Martin Baulig  <martin@ximian.com>
1172
1173         Added support for varargs methods.
1174
1175         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
1176         keyword.
1177
1178         * cs-parser.jay: Added support for `__arglist'.
1179
1180         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
1181
1182         * expression.cs (Argument.AType): Added `ArgList'.
1183         (Invocation): Added support for varargs methods.
1184         (ArglistAccess): New public class.
1185         (Arglist): New public class.
1186
1187         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
1188
1189         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
1190         a method's top-level block if the method has varargs.
1191
1192         * support.cs (ReflectionParameters, InternalParameters): Added
1193         support for varargs methods.    
1194
1195 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
1196
1197         * class.cs: Provide location in indexer error report.
1198
1199         * driver.cs: Use standard names.
1200
1201         * namespace.cs: Catch the use of using after a namespace has been
1202         declared also on using aliases.
1203
1204 2004-06-03  Raja R Harinath  <rharinath@novell.com>
1205
1206         Bug #50820.
1207         * typemanager.cs (closure_private_ok, closure_invocation_type)
1208         (closure_qualifier_type, closure_invocation_assembly)
1209         (FilterWithClosure): Move to ...
1210         (Closure): New internal nested class.
1211         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
1212         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
1213         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
1214         (MemberLookup, MemberLookupFailed): Use it.
1215         * expression.cs (New.DoResolve): Treat the lookup for the
1216         constructor as being qualified by the 'new'ed type.
1217         (Indexers.GetIndexersForTypeOrInterface): Update.
1218
1219 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
1220
1221         * attribute.cs
1222         (GetConditionalAttributeValue): New method. Returns
1223         condition of ConditionalAttribute.
1224         (SearchMulti): New method.  Returns all attributes of type 't'.
1225         Use it when attribute is AllowMultiple = true.
1226         (IsConditionalMethodExcluded): New method.
1227
1228         * class.cs
1229         (Method.IsExcluded): Implemented. Returns true if method has conditional
1230         attribute and the conditions is not defined (method is excluded).
1231         (IMethodData): Extended interface for ConditionalAttribute support.
1232         (PropertyMethod.IsExcluded): Implemented.
1233
1234         * decl.cs
1235         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
1236
1237         * expression.cs
1238         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
1239         on the method.
1240
1241 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
1242
1243         * expression.cs (ArrayCreationExpression): Make this just an
1244         `expression'. It can't be a statement, so the code here was
1245         dead.
1246
1247 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
1248
1249         Fixed #59072
1250         * typemanager.cs (GetFullNameSignature): New method for
1251         MethodBase types.
1252
1253 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
1254
1255         Fixed #56452
1256         * class.cs (MemberBase.GetSignatureForError): New virtual method.
1257         Use this method when MethodBuilder is null.
1258         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
1259         Added test for error CS0626 (MONO reports error for this situation).
1260         (IMethodData.GetSignatureForError): Extended interface.
1261
1262 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
1263
1264         * attribute.cs
1265         (AttributeTester.GetObsoleteAttribute): Returns instance of
1266         ObsoleteAttribute when type is obsolete.
1267
1268         * class.cs
1269         (TypeContainer.VerifyObsoleteAttribute): Override.
1270         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
1271         (MethodCode.VerifyObsoleteAttribute): Override.
1272         (MemberBase.VerifyObsoleteAttribute): Override.
1273
1274         * decl.cs
1275         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
1276         and report proper error.
1277
1278         *delegate.cs
1279         Delegate.VerifyObsoleteAttribute): Override.
1280
1281         * ecore.cs
1282         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
1283         and report proper error.
1284         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
1285
1286         * enum.cs
1287         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
1288         and enum member.
1289
1290         * expression.cs
1291         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
1292         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
1293         Added test for ObsoleteAttribute.
1294
1295         * statement.cs
1296         (Catch): Derived from Statement.
1297
1298 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
1299  
1300         Fixed bug #59071 & cs0160.cs
1301  
1302         * statement.cs (Try.Resolve): Check here whether order of catch
1303         clauses matches their dependencies.
1304
1305 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
1306
1307         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
1308         caused a regression: #59343.  Referencing nested classes from an
1309         assembly stopped working.
1310
1311 2004-05-31  Martin Baulig  <martin@ximian.com>
1312
1313         MCS is now frozen for beta 2.
1314
1315 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1316
1317         * convert.cs: add a trivial cache for overload operator resolution.
1318
1319 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1320
1321         * decl.cs: If possible, use lookuptypedirect here. We can only do
1322         this if there is no `.' after the namespace. Avoids using
1323         LookupType, which does lots of slow processing.
1324         (FindNestedType) New method, does what it says :-).
1325         * namespace.cs: use LookupTypeDirect.
1326         * rootcontext.cs: use membercache, if possible.
1327         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
1328
1329 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1330
1331         * expression.cs:
1332         According to the spec, 
1333
1334         In a member access of the form E.I, if E is a single identifier,
1335         and if the meaning of E as a simple-name (§7.5.2) is a constant,
1336         field, property, localvariable, or parameter with the same type as
1337         the meaning of E as a type-name (§3.8), then both possible
1338         meanings of E are permitted.
1339
1340         We did not check that E as a simple-name had the same type as E as
1341         a type name.
1342
1343         This trivial check gives us 5-7% on bootstrap time.
1344
1345 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1346
1347         * expression.cs (Invocation.OverloadResolve): Avoid the
1348         use of hashtables and boxing here by allocating on demand.
1349
1350 2004-05-30  Martin Baulig  <martin@ximian.com>
1351
1352         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1353         we're doing a silent lookup.  Don't try to lookup nested types in
1354         TypeManager.object_type (thanks to Ben Maurer).
1355
1356 2004-05-30  Martin Baulig  <martin@ximian.com>
1357
1358         Committing a patch from Ben Maurer.
1359
1360         * rootcontext.cs (RootContext.LookupType): Cache negative results.
1361
1362 2004-05-29  Martin Baulig  <martin@ximian.com>
1363
1364         * class.cs (IMethodData.ShouldIgnore): New method.
1365
1366         * typemanager.cs (TypeManager.MethodFlags): Don't take a
1367         `Location' argument, we don't need it anywhere.  Use
1368         `IMethodData.ShouldIgnore ()' instead of
1369         `MethodData.GetMethodFlags ()'.
1370         (TypeManager.AddMethod): Removed.
1371         (TypeManager.AddMethod2): Renamed to AddMethod.
1372
1373 2004-05-29  Martin Baulig  <martin@ximian.com>
1374
1375         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
1376
1377         * convert.cs (Convert.ImplicitReferenceConversion): If we're
1378         converting from a class type S to an interface type and we already
1379         have an object on the stack, don't box it again.  Fixes #52578.
1380
1381 2004-05-29  Martin Baulig  <martin@ximian.com>
1382
1383         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1384         Added support for `params' parameters.  Fixes #59267.
1385
1386 2004-05-29  Martin Baulig  <martin@ximian.com>
1387
1388         * literal.cs (NullPointer): Provide a private .ctor which sets
1389         `type' to TypeManager.object_type.  Fixes #59048.
1390
1391 2004-05-29  Martin Baulig  <martin@ximian.com>
1392
1393         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
1394         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
1395
1396         * ecore.cs (EventExpr.instance_expr): Make the field private.
1397
1398 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
1399
1400         Fixed bug #50080 & cs0214-2.cs
1401         * expression.cs (Cast.DoResolve): Check unsafe context here.
1402         
1403         * statement.cs (Resolve.DoResolve): Likewise.
1404
1405 2004-05-26  Martin Baulig  <martin@ximian.com>
1406
1407         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
1408
1409         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
1410         (RootContext.LookupType): Pass down the `silent' flag.
1411
1412 2004-05-25  Martin Baulig  <martin@ximian.com>
1413
1414         * expression.cs
1415         (MethodGroupExpr.IdenticalTypeName): New public property.
1416         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
1417         expression actually refers to a type.
1418
1419 2004-05-25  Martin Baulig  <martin@ximian.com>
1420
1421         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
1422         for #56176 and made it actually work.
1423
1424 2004-05-25  Martin Baulig  <martin@ximian.com>
1425
1426         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
1427         (FieldExpr, PropertyExpr): Override and implement
1428         CacheTemporaries.  Fixes #52279.
1429
1430 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
1431
1432         * location.cs: In the new compiler listing a file twice is a
1433         warning, not an error.
1434
1435 2004-05-24  Martin Baulig  <martin@ximian.com>
1436
1437         * enum.cs (Enum.DefineType): For the `BaseType' to be a
1438         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
1439
1440 2004-05-24  Martin Baulig  <martin@ximian.com>
1441
1442         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
1443         walking the `using' list.  Fixes #53921.
1444
1445 2004-05-24  Martin Baulig  <martin@ximian.com>
1446
1447         * const.cs (Const.LookupConstantValue): Added support for
1448         EmptyCast's; fixes #55251.
1449
1450 2004-05-24  Martin Baulig  <martin@ximian.com>
1451
1452         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
1453         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
1454         which does the CS0135 check.  The reason is that we first need to
1455         check whether the variable actually exists.
1456
1457 2004-05-24  Martin Baulig  <martin@ximian.com>
1458
1459         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
1460         than RootContext.LookupType() to find the explicit interface
1461         type.  Fixes #58584.
1462
1463 2004-05-24  Raja R Harinath  <rharinath@novell.com>
1464
1465         * Makefile: Simplify.  Use executable.make.
1466         * mcs.exe.sources: New file.  List of sources of mcs.exe.
1467
1468 2004-05-24  Anders Carlsson  <andersca@gnome.org>
1469
1470         * decl.cs:
1471         * enum.cs:
1472         Use the invariant culture when doing String.Compare for CLS case
1473         sensitivity.
1474         
1475 2004-05-23  Martin Baulig  <martin@ximian.com>
1476
1477         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
1478         don't have any dots.  Fixes #52622, added cs0246-8.cs.
1479
1480         * namespace.cs (NamespaceEntry.Lookup): Likewise.
1481         
1482 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1483
1484         * class.cs (MemberBase.Define): Reuse MemberType member for 
1485         resolved type. Other methods can use it too.
1486
1487 2004-05-23  Martin Baulig  <martin@ximian.com>
1488
1489         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
1490         the variable also exists in the current block (otherwise, we need
1491         to report a CS0103).  Fixes #58670.
1492
1493 2004-05-23  Martin Baulig  <martin@ximian.com>
1494
1495         * flowanalysis.cs (Reachability.Reachable): Compute this
1496         on-the-fly rather than storing it as a field.
1497
1498 2004-05-23  Martin Baulig  <martin@ximian.com>
1499
1500         * flowanalysis.cs (Reachability.And): Manually compute the
1501         resulting `barrier' from the reachability.      
1502        
1503 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1504
1505         Fix bug #57835
1506         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
1507         instance of ObsoleteAttribute when symbol is obsolete.
1508
1509         * class.cs
1510         (IMethodData): Extended interface for ObsoleteAttribute support.
1511
1512 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1513
1514         * attribute.cs: Fix bug #55970
1515
1516 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1517
1518         Fix bug #52705
1519         * attribute.cs
1520         (GetObsoleteAttribute): New method. Creates the instance of
1521         ObsoleteAttribute.
1522         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
1523         ObsoleteAttribute when member is obsolete.
1524         (AttributeTester.Report_ObsoleteMessage): Common method for
1525         Obsolete error/warning reporting.
1526
1527         * class.cs
1528         (TypeContainer.base_classs_type): New member for storing parent type.
1529
1530         * decl.cs
1531         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
1532         for this MemberCore.
1533
1534 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1535
1536         * attribute.cs, const.cs: Fix bug #58590
1537
1538 2004-05-21  Martin Baulig  <martin@ximian.com>
1539
1540         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
1541         out parameters if the end of the method is unreachable.  Fixes
1542         #58098. 
1543
1544 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1545
1546         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
1547         Hari was right, why extra method.
1548
1549 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1550
1551         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
1552
1553 2004-05-20  Martin Baulig  <martin@ximian.com>
1554
1555         Merged this back from gmcs to keep the differences to a minumum.
1556
1557         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
1558         instead of a Declspace.
1559         (Attribute.ResolveType): Likewise.
1560         (Attributes.Search): Likewise.
1561         (Attributes.Contains): Likewise.
1562         (Attributes.GetClsCompliantAttribute): Likewise.
1563
1564         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
1565         argument.
1566         (MethodData.ApplyAttributes): Take an EmitContext instead of a
1567         DeclSpace.
1568
1569 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
1570
1571         Fix bug #58688 (MCS does not report error when the same attribute
1572         is assigned twice)
1573
1574         * attribute.cs (Attribute.Emit): Distinction between null and default.
1575
1576 2004-05-19  Raja R Harinath  <rharinath@novell.com>
1577
1578         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
1579         of a top-level attribute without an attribute target.
1580         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
1581         Make non-static.
1582         (Attribute.Conditional_GetConditionName), 
1583         (Attribute.Obsolete_GetObsoleteMessage): Update.
1584         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
1585         part of ScanForIndexerName.
1586         (Attribute.CanIgnoreInvalidAttribute): New function.
1587         (Attribute.ScanForIndexerName): Move to ...
1588         (Attributes.ScanForIndexerName): ... here.
1589         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
1590         (Attributes.Search): New internal variant that can choose not to
1591         complain if types aren't resolved.  The original signature now
1592         complains.
1593         (Attributes.GetClsCompliantAttribute): Use internal variant, with
1594         complaints suppressed.
1595         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
1596         only if it not useful.
1597         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
1598         top-level for attributes that are shared between the assembly
1599         and a top-level class.
1600         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
1601         * class.cs: Update to reflect changes.
1602         (DefineIndexers): Fuse loops.
1603         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
1604         a couple more variants of attribute names.
1605
1606 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
1607
1608         Fix bug #52585 (Implemented explicit attribute declaration)
1609
1610         * attribute.cs:
1611         (Attributable.ValidAttributeTargets): New abstract method. It gets
1612         list of valid attribute targets for explicit target declaration.
1613         (Attribute.Target): It holds target itself.
1614         (AttributeSection): Removed.
1615         (Attribute.CheckTargets): New method. It checks whether attribute
1616         target is valid for the current element.
1617
1618         * class.cs:
1619         (EventProperty): New class. For events that are declared like
1620         property (with add and remove accessors).
1621         (EventField): New class. For events that are declared like field.
1622         class.cs
1623
1624         * cs-parser.jay: Implemented explicit attribute target declaration.
1625
1626         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
1627         Override ValidAttributeTargets.
1628
1629         * parameter.cs:
1630         (ReturnParameter): Class for applying custom attributes on 
1631         the return type.
1632         (ParameterAtribute): New class. Class for applying custom
1633         attributes on the parameter type.
1634
1635 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
1636
1637         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
1638         definitions. 
1639
1640         (Method): Allow UNSAFE here.
1641
1642         * modifiers.cs: Support unsafe reporting.
1643
1644 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
1645
1646         * decl.cs: Fix bug #58478.
1647
1648 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1649
1650         * statement.cs: When checking for unreachable code on an EmptyStatement,
1651         set the location. Fixes bug #58488.
1652
1653 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
1654
1655         * driver.cs: Add -pkg handling.
1656
1657         From Gonzalo: UseShelLExecute=false
1658
1659 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
1660
1661         * attribute.cs:
1662         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
1663         for attribute.
1664         (Attribute.IsClsCompliaceRequired): Moved to base for better
1665         accesibility.
1666         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
1667         when attribute is AttributeUsageAttribute.
1668         (Attribute.GetValidTargets): Simplified.
1669         (Attribute.GetAttributeUsage): New method returns AttributeUsage
1670         attribute for this type.
1671         (Attribute.ApplyAttributes): Method renamed to Emit and make
1672         non-static.
1673         (GlobalAttributeSection): New class for special handling of global
1674         attributes (assembly, module).
1675         (AttributeSection.Emit): New method.
1676
1677         * class.cs: Implemented Attributable abstract methods.
1678         (MethodCore.LabelParameters): Moved to Parameter class.
1679         (Accessor): Is back simple class.
1680         (PropertyMethod): Implemented Attributable abstract class.
1681         (DelegateMethod): Implemented Attributable abstract class.
1682         (Event): New constructor for disctintion between normal Event
1683         and Event with accessors.
1684
1685         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
1686
1687         * codegen.cs, const.cs, decl.cs, delegate.cs:
1688         (CommonAssemblyModulClass): Implemented Attributable abstract class
1689         and simplified.
1690
1691         * enum.cs: Implement IAttributeSupport interface.
1692         (EnumMember): New class for emum members. Implemented Attributable
1693         abstract class
1694
1695         * parameter.cs:
1696         (ParameterBase): Is abstract.
1697         (ReturnParameter): New class for easier [return:] attribute handling.
1698
1699         * typemanager.cs: Removed builder_to_attr.
1700
1701 2004-05-11  Raja R Harinath  <rharinath@novell.com>
1702
1703         Fix bug #57151.
1704         * attribute.cs (Attribute.GetPositionalValue): New function.
1705         * class.cs (TypeContainer.VerifyMembers): New function.
1706         (TypeContainer.Emit): Use it.
1707         (ClassOrStruct): New base class for Class and Struct.
1708         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
1709         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
1710         class.
1711         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
1712         then each non-static field should have a FieldOffset attribute.
1713         Otherwise, none of the fields should have a FieldOffset attribute.
1714         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
1715         and FieldOffset attributes.
1716         * typemanager.cs (TypeManager.struct_layout_attribute_type)
1717         (TypeManager.field_offset_attribute_type): New core types.
1718         (TypeManager.InitCoreTypes): Initialize them.
1719
1720 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
1721
1722         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
1723         Return correct type.
1724         From bug #58270.
1725
1726 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
1727
1728         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
1729         be implicitly converted to ulong.
1730         
1731         * expression.cs: The logic for allowing operator &, | and ^ worked
1732         was wrong, it worked before because we did not report an error in
1733         an else branch.  Fixes 57895.
1734
1735         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
1736         allow volatile fields to be reference types.
1737
1738 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
1739
1740         * driver.cs: Add support for /debug-
1741
1742 2004-05-07  Raja R Harinath  <rharinath@novell.com>
1743
1744         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
1745         Add a 'complain' parameter to silence errors.
1746         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
1747         silently overlooked type-resolutions.
1748         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
1749         to reflect changes.
1750         (Attributes.Search): New function.
1751         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
1752         (Attributes.GetAttributeFullName): Remove hack.
1753         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
1754         Update to reflect changes.
1755         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
1756         Use Attributes.Search instead of nested loops.
1757
1758 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
1759
1760         * decl.cs:
1761         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
1762         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
1763         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
1764
1765         * report.cs: (Report.Warning): Renamed to Warning_T because of
1766         parameter collision.
1767
1768 2004-05-05  Raja R Harinath  <rharinath@novell.com>
1769
1770         * expression.cs (MemberAccess.ResolveMemberAccess):
1771         Exit with non-zero status after Report.Error.
1772         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
1773         Likewise.
1774         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
1775
1776 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1777
1778         * support.cs: Don't hang when the file is empty.
1779
1780 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1781
1782         * support.cs: In SeekableStreamReader, compute the preamble size of the
1783           underlying stream. Position changes should take into account that initial
1784           count of bytes.
1785
1786 2004-05-03  Todd Berman  <tberman@sevenl.net>
1787
1788         * driver.cs: remove unused GetSysVersion function.
1789
1790 2004-05-03  Todd Berman  <tberman@sevenl.net>
1791
1792         * driver.cs: Remove the hack from saturday, as well as the hack
1793         from jackson (LoadAssemblyFromGac), also adds the CWD to the
1794         link_paths to get that bit proper.
1795
1796 2004-05-01  Todd Berman  <tberman@sevenl.net>
1797
1798         * driver.cs: Try a LoadFrom before a Load, this checks the current
1799         path. This is currently a bug in mono that is be fixed, however, this
1800         provides a workaround for now. This will be removed when the bug
1801         is fixed.
1802
1803 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
1804
1805         * CryptoConvert.cs: Updated to latest version. Fix issue with 
1806         incomplete key pairs (#57941).
1807
1808 2004-05-01  Todd Berman  <tberman@sevenl.net>
1809
1810         * driver.cs: Remove '.' from path_chars, now System.* loads properly
1811         from the GAC
1812
1813 2004-04-30  Jackson Harper  <jackson@ximian.com>
1814
1815         * codegen.cs: Open keys readonly.
1816         
1817 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1818
1819         * typemanager.cs: don't report cyclic struct layout when a struct
1820         contains 2 or more fields of the same type. Failed for Pango.AttrShape
1821         which has 2 Pango.Rectangle fields.
1822
1823 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1824
1825         * expression.cs: Handle IntPtr comparisons with IL code
1826         rather than a method call.
1827
1828 2004-04-29  Martin Baulig  <martin@ximian.com>
1829
1830         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
1831         the list of PropertyInfo's in class hierarchy and find the
1832         accessor.  Fixes #56013.
1833
1834 2004-04-29  Martin Baulig  <martin@ximian.com>
1835
1836         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
1837
1838 2004-04-29  Martin Baulig  <martin@ximian.com>
1839
1840         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
1841
1842         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
1843
1844 2004-04-29  Martin Baulig  <martin@ximian.com>
1845
1846         * class.cs (ConstructorInitializer.Resolve): Check whether the
1847         parent .ctor is accessible.  Fixes #52146.
1848
1849 2004-04-29  Martin Baulig  <martin@ximian.com>
1850
1851         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
1852
1853         * statement.cs (Using.EmitLocalVariableDecls): Use
1854         TypeManager.idisposable_type, not typeof (IDisposable).
1855         (Foreach.EmitCollectionForeach): Added support for valuetypes.
1856
1857 2004-04-29  Martin Baulig  <martin@ximian.com>
1858
1859         * class.cs (Event.Define): Don't emit the field and don't set
1860         RTSpecialName and SpecialName for events on interfaces.  Fixes
1861         #57703. 
1862
1863 2004-04-29  Raja R Harinath  <rharinath@novell.com>
1864
1865         Refactor Attribute.ApplyAttributes.
1866         * attribute.cs (Attributable): New base class for objects that can
1867         have Attributes applied on them.
1868         (Attribute): Make AttributeUsage fields public.
1869         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
1870         (Attribute.IsInternalCall): New property.
1871         (Attribute.UsageAttr): Convert to a public read-only property.
1872         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
1873         (Attribute.ResolveType, Attribute.Resolve)
1874         (Attribute.ScanForIndexerName): Update to reflect changes.
1875         (Attribute.CheckAttributeTarget): Re-format.
1876         (Attribute.ApplyAttributes): Refactor, to various
1877         Attributable.ApplyAttributeBuilder methods.
1878         * decl.cs (MemberCore): Make Attributable.
1879         * class.cs (Accessor): Make Attributable.
1880         (MethodData.ApplyAttributes): Use proper attribute types, not
1881         attribute names.
1882         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
1883         (TypeContainer.ApplyAttributeBuilder)
1884         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
1885         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
1886         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
1887         (Operator.ApplyAttributeBuilder): New factored-out methods.
1888         * const.cs (Const.ApplyAttributeBuilder): Likewise.
1889         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
1890         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
1891         * parameter.cs (ParameterBase): New Attributable base class
1892         that can also represent Return types.
1893         (Parameter): Update to the changes.
1894
1895 2004-04-29  Jackson Harper  <jackson@ximian.com>
1896
1897         * driver.cs: Prefer the corlib system version when looking for
1898         assemblies in the GAC. This is still a hack, but its a better hack
1899         now.
1900         
1901 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
1902
1903         * decl.cs, enum.cs: Improved error 3005 reporting.
1904   
1905         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
1906         (related_symbols): New private member for list of symbols
1907         related to reported error/warning.
1908         
1909         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
1910
1911 2004-04-29  Martin Baulig  <martin@ximian.com>
1912
1913         * ecore.cs (Expression.Constantify): If we're an enum and
1914         TypeManager.TypeToCoreType() doesn't give us another type, use
1915         t.UnderlyingSystemType.  Fixes #56178.  
1916
1917 2004-04-29  Martin Baulig  <martin@ximian.com>
1918
1919         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
1920         interfaces and for each interface, only add members directly
1921         declared in that interface.  Fixes #53255.
1922
1923 2004-04-28  Martin Baulig  <martin@ximian.com>
1924
1925         * expression.cs (ConditionalLogicalOperator): Use a temporary
1926         variable for `left' to avoid that we evaluate it more than once;
1927         bug #52588.
1928
1929 2004-04-28  Martin Baulig  <martin@ximian.com>
1930
1931         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
1932         `void[]' (CS1547).
1933
1934 2004-04-28  Martin Baulig  <martin@ximian.com>
1935
1936         * statement.cs (LocalInfo.Resolve): Check whether the type is not
1937         void (CS1547).
1938
1939         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
1940         whether the type is not void (CS1547).
1941
1942 2004-04-28  Martin Baulig  <martin@ximian.com>
1943
1944         * expression.cs (Unary.DoResolveLValue): Override this and report
1945         CS0131 for anything but Operator.Indirection.
1946
1947 2004-04-28  Martin Baulig  <martin@ximian.com>
1948
1949         Committing a patch from Ben Maurer; see bug #50820.
1950
1951         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
1952         check for classes.
1953
1954         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
1955         classes.        
1956
1957 2004-04-28  Martin Baulig  <martin@ximian.com>
1958
1959         Committing a patch from Ben Maurer; see bug #50820.
1960
1961         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
1962         check for classes.
1963
1964         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
1965         classes.        
1966
1967 2004-04-28  Martin Baulig  <martin@ximian.com>
1968
1969         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
1970         (Block.AddLabel): Call DoLookupLabel() to only search in the
1971         current block.
1972
1973 2004-04-28  Martin Baulig  <martin@ximian.com>
1974
1975         * cfold.cs (ConstantFold.BinaryFold): Added special support for
1976         comparing StringConstants and NullLiterals in Equality and Inequality.
1977
1978 2004-04-28  Jackson Harper  <jackson@ximian.com>
1979
1980         * driver.cs: Attempt to load referenced assemblies from the
1981         GAC. This is the quick and dirty version of this method that
1982         doesnt take into account versions and just takes the first
1983         canidate found. Will be good enough for now as we will not have more
1984         then one version installed into the GAC until I update this method.
1985
1986 2004-04-28  Martin Baulig  <martin@ximian.com>
1987
1988         * typemanager.cs (TypeManager.CheckStructCycles): New public
1989         static method to check for cycles in the struct layout.
1990
1991         * rootcontext.cs (RootContext.PopulateTypes): Call
1992         TypeManager.CheckStructCycles() for each TypeContainer.
1993         [Note: We only need to visit each type once.]
1994
1995 2004-04-28  Martin Baulig  <martin@ximian.com>
1996
1997         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
1998
1999         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
2000         success and added `out object value'.  Use a `bool resolved' field
2001         to check whether we've already been called rather than
2002         `ConstantValue != null' since this breaks for NullLiterals.
2003
2004 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2005
2006         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
2007         setting of this flag, since the 'set' method may be non-public.
2008
2009 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2010
2011         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
2012         check on current_vector.Block.
2013
2014 2004-04-27  Martin Baulig  <martin@ximian.com>
2015
2016         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
2017         a field initializer.  Fixes #56459.
2018
2019 2004-04-27  Martin Baulig  <martin@ximian.com>
2020
2021         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
2022         we're not attempting to use an indexer.  Fixes #52154.
2023
2024 2004-04-27  Martin Baulig  <martin@ximian.com>
2025
2026         * statement.cs (Return): Don't create a return label if we don't
2027         need it; reverts my change from January 20th.  Thanks to Ben
2028         Maurer for this.
2029
2030 2004-04-27  Martin Baulig  <martin@ximian.com>
2031
2032         According to the spec, `goto' can only leave a nested scope, but
2033         never enter it.
2034
2035         * statement.cs (Block.LookupLabel): Only lookup in the current
2036         block, don't recurse into parent or child blocks.
2037         (Block.AddLabel): Check in parent and child blocks, report
2038         CS0140/CS0158 if we find a duplicate.
2039         (Block): Removed this indexer for label lookups.
2040         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
2041         this already does the error reporting for us.
2042
2043         * flowanalysis.cs
2044         (FlowBranching.UsageVector.Block): New public variable; may be null.
2045         (FlowBranching.CreateSibling): Added `Block' argument.
2046         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
2047         label for the target of a `goto' and check whether we're not
2048         leaving a `finally'.
2049
2050 2004-04-27  Martin Baulig  <martin@ximian.com>
2051
2052         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2053         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
2054         just for returns).
2055
2056 2004-04-27  Martin Baulig  <martin@ximian.com>
2057
2058         * statement.cs (Block.AddLabel): Also check for implicit blocks
2059         and added a CS0158 check.
2060
2061 2004-04-27  Martin Baulig  <martin@ximian.com>
2062
2063         * flowanalysis.cs (FlowBranchingLoop): New class.
2064         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
2065         UsageVector's instead of an ArrayList.
2066         (FlowBranching.Label): Likewise.
2067         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
2068         (FlowBranching.AddBreakVector): New method.
2069
2070 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
2071
2072         * attribute.cs: Small regression fix: only convert the type if we
2073         the type is different, fixes System.Drawing build.
2074
2075 2004-04-27  Martin Baulig  <martin@ximian.com>
2076
2077         * attribute.cs (Attribute.Resolve): If we have a constant value
2078         for a named field or property, implicity convert it to the correct
2079         type.
2080
2081 2004-04-27  Raja R Harinath  <rharinath@novell.com>
2082
2083         * statement.cs (Block.Block): Implicit blocks share
2084         'child_variable_names' fields with parent blocks.
2085         (Block.AddChildVariableNames): Remove.
2086         (Block.AddVariable): Mark variable as "used by a child block" in
2087         every surrounding block.
2088         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
2089         been used in a child block, complain about violation of "Invariant
2090         meaning in blocks" rule.
2091         * cs-parser.jay (declare_local_variables): Don't use
2092         AddChildVariableNames.
2093         (foreach_statement): Don't create an implicit block: 'foreach'
2094         introduces a scope.
2095
2096 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
2097
2098         * convert.cs (ImplicitNumericConversion): 0 is also positive when
2099         converting from 0L to ulong.  Fixes 57522.
2100
2101 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2102
2103         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
2104         derived class hides via 'new' keyword field from base class (test-242.cs).
2105         TODO: Handle this in the more general way.
2106         
2107         * class.cs (CheckBase): Ditto.
2108
2109 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2110
2111         * decl.cs (caching_flags): New member for storing cached values
2112         as bit flags.
2113         (MemberCore.Flags): New enum where bit flags for caching_flags
2114         are defined.
2115         (MemberCore.cls_compliance): Moved to caching_flags.
2116         (DeclSpace.Created): Moved to caching_flags.
2117
2118         * class.cs: Use caching_flags instead of DeclSpace.Created
2119         
2120 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
2121
2122         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
2123         if we are only a derived class, not a nested class.
2124
2125         * typemanager.cs: Same as above, but do this at the MemberLookup
2126         level (used by field and methods, properties are handled in
2127         PropertyExpr).   Allow for the qualified access if we are a nested
2128         method. 
2129
2130 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
2131
2132         * class.cs: Refactoring.
2133         (IMethodData): New inteface; Holds links to parent members
2134         to avoid member duplication (reduced memory allocation).
2135         (Method): Implemented IMethodData interface.
2136         (PropertyBase): New inner classes for get/set methods.
2137         (PropertyBase.PropertyMethod): Implemented IMethodData interface
2138         (Event): New inner classes for add/remove methods.
2139         (Event.DelegateMethod): Implemented IMethodData interface.
2140
2141         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
2142         EmitContext (related to class.cs refactoring).
2143
2144 2004-04-21  Raja R Harinath  <rharinath@novell.com>
2145
2146         * delegate.cs (Delegate.VerifyApplicability): If the number of
2147         arguments are the same as the number of parameters, first try to
2148         verify applicability ignoring  any 'params' modifier on the last
2149         parameter.
2150         Fixes #56442.
2151
2152 2004-04-16  Raja R Harinath  <rharinath@novell.com>
2153
2154         * class.cs (TypeContainer.AddIndexer): Use
2155         'ExplicitInterfaceName' to determine if interface name was
2156         explicitly specified.  'InterfaceType' is not initialized at this time.
2157         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
2158         Indexers array is already in the required order.  Initialize
2159         'IndexerName' only if there are normal indexers.
2160         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
2161         (TypeContainer.Emit): Emit DefaultMember attribute only if
2162         IndexerName is initialized.
2163         Fixes #56300.
2164
2165 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
2166
2167         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
2168         Fixes #57007
2169
2170 2004-04-15  Raja R Harinath  <rharinath@novell.com>
2171
2172         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
2173         attributes.
2174         Fix for #56456.
2175
2176         * attribute.cs (Attribute.Resolve): Check for duplicate named
2177         attributes.
2178         Fix for #56463.
2179
2180 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
2181
2182         * iterators.cs (MarkYield): track whether we are in an exception,
2183         and generate code accordingly.  Use a temporary value to store the
2184         result for our state.
2185
2186         I had ignored a bit the interaction of try/catch with iterators
2187         since their behavior was not entirely obvious, but now it is
2188         possible to verify that our behavior is the same as MS .NET 2.0
2189
2190         Fixes 54814
2191
2192 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
2193
2194         * iterators.cs: Avoid creating temporaries if there is no work to
2195         do. 
2196
2197         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
2198         Enumerations, use TypeManager.EnumToUnderlying and call
2199         recursively. 
2200
2201         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
2202         bug #57013
2203
2204         (This.Emit): Use EmitContext.EmitThis to emit our
2205         instance variable.
2206
2207         (This.EmitAssign): Ditto.
2208
2209         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
2210         codepaths, we will move all the functionality into
2211         Mono.CSharp.This 
2212
2213         (FieldExpr.EmitAssign): Ditto.
2214
2215         This fixes several hidden bugs that I uncovered while doing a code
2216         review of this today.
2217
2218         * codegen.cs (EmitThis): reworked so the semantics are more clear
2219         and also support value types "this" instances.
2220
2221         * iterators.cs: Changed so that for iterators in value types, we
2222         do not pass the value type as a parameter.  
2223
2224         Initialization of the enumerator helpers is now done in the caller
2225         instead of passing the parameters to the constructors and having
2226         the constructor set the fields.
2227
2228         The fields have now `assembly' visibility instead of private.
2229
2230 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
2231
2232         * expression.cs (Argument.Resolve): Check if fields passed as ref
2233         or out are contained in a MarshalByRefObject.
2234
2235         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
2236         another compiler type.
2237
2238 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2239
2240         * class.cs (Indexer.Define): use the new name checking method.
2241         Also, return false on an error.
2242         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
2243         (is_identifier_[start/part]_character): make static.
2244
2245 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
2246
2247         * expression.cs (Binary.ResolveOperator): Do no append strings
2248         twice: since we can be invoked more than once (array evaluation)
2249         on the same concatenation, take care of this here.  Based on a fix
2250         from Ben (bug #56454)
2251
2252 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2253
2254         * codegen.cs: Fix another case where CS1548 must be reported (when 
2255         delay-sign isn't specified and no private is available #56564). Fix
2256         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2257         error when MCS is used on the MS runtime and we need to delay-sign 
2258         (which seems unsupported by AssemblyBuilder - see #56621).
2259
2260 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
2261
2262         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
2263         (TypeManager.ComputeNamespaces): Faster implementation for
2264         Microsoft runtime.
2265
2266         * compiler.csproj: Updated AssemblyName to mcs.
2267
2268 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
2269
2270         * rootcontext.cs: Add new types to the boot resolution.
2271
2272         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
2273         MulticastDelegate is not allowed.
2274
2275         * typemanager.cs: Add new types to lookup: System.TypedReference
2276         and ArgIterator.
2277
2278         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
2279         check for TypedReference or ArgIterator, they are not allowed. 
2280
2281         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
2282         makes us properly catch 1510 in some conditions (see bug 56016 for
2283         details). 
2284
2285 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
2286
2287         * CryptoConvert.cs: update from corlib version
2288         with endian fixes.
2289
2290 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
2291
2292         * class.cs (Indexer.Define): Check indexername declaration
2293
2294 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
2295
2296         * attribute.cs (IsClsCompliant): Fixed problem with handling
2297         all three states (compliant, not-compliant, undetected).
2298
2299 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
2300
2301         * attribute.cs (Attribute): Location is now public.
2302         (Resolve): Store resolved arguments (pos_values) in attribute class.
2303         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
2304         (GetClsCompliantAttributeValue): New method that gets
2305         CLSCompliantAttribute value.
2306         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
2307         if exists else null.
2308         (AttributeTester): New class for CLS-Compliant verification routines.
2309
2310         * class.cs (Emit): Add CLS-Compliant verification.
2311         (Method.GetSignatureForError): Implemented.
2312         (Constructor.GetSignatureForError): Implemented
2313         (Constructor.HasCompliantArgs): Returns if constructor has
2314         CLS-Compliant arguments.
2315         (Constructor.Emit): Override.
2316         (Construcor.IsIdentifierClsCompliant): New method; For constructors
2317         is needed to test only parameters.
2318         (FieldBase.GetSignatureForError): Implemented.
2319         (TypeContainer): New member for storing base interfaces.
2320         (TypeContainer.FindMembers): Search in base interfaces too.
2321
2322         * codegen.cs (GetClsComplianceAttribute): New method that gets
2323         assembly or module CLSCompliantAttribute value.
2324         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
2325         for assembly.
2326         (ModuleClass.Emit): Add error 3012 test.
2327
2328         * const.cs (Emit): Override and call base for CLS-Compliant tests.
2329
2330         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
2331         state for all decl types.
2332         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
2333         if CLS-Compliant tests are required.
2334         (IsClsCompliaceRequired): New method. Analyze whether code
2335         must be CLS-Compliant.
2336         (IsExposedFromAssembly): New method. Returns true when MemberCore
2337         is exposed from assembly.
2338         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
2339         value or gets cached value.
2340         (HasClsCompliantAttribute): New method. Returns true if MemberCore
2341         is explicitly marked with CLSCompliantAttribute.
2342         (IsIdentifierClsCompliant): New abstract method. This method is
2343         used to testing error 3005.
2344         (IsIdentifierAndParamClsCompliant): New method. Common helper method
2345         for identifier and parameters CLS-Compliant testing.
2346         (VerifyClsCompliance): New method. The main virtual method for
2347         CLS-Compliant verifications.
2348         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
2349         null. I don't know why is null (too many public members !).
2350         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
2351         and get value of first CLSCompliantAttribute that found.
2352
2353         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
2354         (VerifyClsCompliance): Override and add extra tests.
2355
2356         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
2357         clscheck- disable CLS-Compliant verification event if assembly is has
2358         CLSCompliantAttribute(true).
2359
2360         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
2361         ApllyAttribute is now called in emit section as in the other cases.
2362         Possible future Emit integration.
2363         (IsIdentifierClsCompliant): New override.
2364         (VerifyClsCompliance): New override.
2365         (GetEnumeratorName): Returns full enum name.
2366
2367         * parameter.cs (GetSignatureForError): Implemented.
2368
2369         * report.cs (WarningData): New struct for Warning message information.
2370         (LocationOfPreviousError): New method.
2371         (Warning): New method. Reports warning based on the warning table.
2372         (Error_T): New method. Reports error based on the error table.
2373
2374         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
2375         verifications are done here.
2376
2377         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
2378
2379         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
2380         CLSCompliantAttribute.
2381         (all_imported_types): New member holds all imported types from other
2382         assemblies.
2383         (LoadAllImportedTypes): New method fills static table with exported types
2384         from all referenced assemblies.
2385         (Modules): New property returns all assembly modules.
2386
2387 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
2388
2389         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
2390         throwing a parser error.
2391
2392         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
2393         which removes the hardcoded get_/set_ prefixes for properties, as
2394         IL allows for the properties to be named something else.  
2395
2396         Bug #56013
2397
2398         * expression.cs: Do not override operand before we know if it is
2399         non-null.  Fix 56207
2400
2401 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2402
2403         * typemanager.cs: support for pinned variables.
2404
2405 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2406
2407         * decl.cs, typemanager.cs: Avoid using an arraylist
2408         as a buffer if there is only one result set.
2409
2410 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2411
2412         * expression.cs: Make sure you cant call a static method
2413         with an instance expression, bug #56174.
2414
2415 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
2416
2417         * class.cs (IsDuplicateImplementation): Improve error reporting to
2418         flag 663 (method only differs in parameter modifier).
2419
2420         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
2421         in preprocessor directives.
2422
2423         * location.cs (LookupFile): Allow for the empty path.
2424
2425         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
2426         better approach for some of that patch, but its failing with the
2427         CharSet enumeration.  For now try/catch will do.
2428
2429         * typemanager.cs: Do not crash if a struct does not have fields.
2430         Fixes 56150.
2431
2432 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2433
2434         * expression.cs: cs0213, cant fix a fixed expression.
2435         fixes 50231.
2436
2437 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2438
2439         * cs-parser.jay: detect invalid embeded statements gracefully.
2440         bug #51113.
2441
2442 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2443
2444         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
2445         As a regex:
2446         s/
2447         the invocation type may not be a subclass of the tye of the item/
2448         The type of the item must be a subclass of the invocation item.
2449         /g
2450
2451         Fixes bug #50820.
2452
2453 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
2454
2455         * attribute.cs: Added methods to get a string and a bool from an
2456         attribute. Required to information from AssemblyKeyFileAttribute,
2457         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
2458         * codegen.cs: Modified AssemblyName creation to include support for
2459         strongnames. Catch additional exceptions to report them as CS1548.
2460         * compiler.csproj: Updated include CryptoConvert.cs.
2461         * compiler.csproj.user: Removed file - user specific configuration.
2462         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
2463         Mono.Security assembly. The original class is maintained and tested in
2464         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
2465         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
2466         like CSC 8.0 (C# v2) supports.
2467         * Makefile: Added CryptoConvert.cs to mcs sources.
2468         * rootcontext.cs: Added new options for strongnames.
2469
2470 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
2471
2472         * driver.cs: For --expect-error, report error code `2'
2473         if the program compiled with no errors, error code `1' if
2474         it compiled with an error other than the one expected.
2475
2476 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
2477
2478         * compiler.csproj: Updated for Visual Studio .NET 2003.
2479         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
2480         * compiler.sln: Updated for Visual Studio .NET 2003.
2481
2482 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
2483
2484         * expression.cs: Fix bug #47234. We basically need to apply the
2485         rule that we prefer the conversion of null to a reference type
2486         when faced with a conversion to 'object' (csc behaviour).
2487
2488 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2489
2490         * statement.cs: Shorter form for foreach, eliminates
2491         a local variable. r=Martin.
2492
2493 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2494
2495         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
2496         checks if we can use brtrue/brfalse to test for 0.
2497         * expression.cs: use the above in the test for using brtrue/brfalse.
2498         cleanup code a bit.
2499
2500 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2501
2502         * expression.cs: Rewrite string concat stuff. Benefits:
2503
2504         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
2505         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
2506         rather than a concat chain.
2507
2508         * typemanager.cs: Add lookups for more concat overloads.
2509
2510 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2511
2512         * expression.cs: Emit shorter il code for array init.
2513
2514         newarr
2515         dup
2516         // set 1
2517
2518         // set 2
2519
2520         newarr
2521         stloc.x
2522
2523         ldloc.x
2524         // set 1
2525
2526         ldloc.x
2527         // set 2
2528
2529 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
2530
2531         * statement.cs: Before, two switch blocks would be merged if the
2532         total size of the blocks (end_item - begin_item + 1) was less than
2533         two times the combined sizes of the blocks.
2534
2535         Now, it will only merge if after the merge at least half of the
2536         slots are filled.
2537
2538         fixes 55885.
2539
2540 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
2541
2542         * class.cs : csc build fix for GetMethods(). See bug #52503.
2543
2544 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
2545
2546         * expression.cs: Make sure fp comparisons work with NaN.
2547         This fixes bug #54303. Mig approved this patch a long
2548         time ago, but we were not able to test b/c the runtime
2549         had a related bug.
2550
2551 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
2552
2553         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
2554
2555 2004-03-19  Martin Baulig  <martin@ximian.com>
2556
2557         * class.cs (MemberCore.IsDuplicateImplementation): Report the
2558         error here and not in our caller.
2559
2560 2004-03-19  Martin Baulig  <martin@ximian.com>
2561
2562         * interface.cs: Completely killed this file.
2563         (Interface): We're now a TypeContainer and live in class.cs.
2564
2565         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
2566         argument; we're now also called for interfaces.
2567         (TypeContainer.DefineMembers): Allow this method being called
2568         multiple times.
2569         (TypeContainer.GetMethods): New public method; formerly known as
2570         Interface.GetMethod().  This is used by PendingImplementation.
2571         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
2572         it's now private and non-static.
2573         (Interface): Moved this here; it's now implemented similar to
2574         Class and Struct.
2575         (Method, Property, Event, Indexer): Added `bool is_interface'
2576         argument to their .ctor's.
2577         (MemberBase.IsInterface): New public field.
2578
2579         * cs-parser.jay: Create normal Method, Property, Event, Indexer
2580         instances instead of InterfaceMethod, InterfaceProperty, etc.
2581         (opt_interface_base): Removed; we now use `opt_class_base' instead.
2582         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
2583
2584 2004-03-19  Martin Baulig  <martin@ximian.com>
2585
2586         * class.cs (MethodCore.IsDuplicateImplementation): New private
2587         method which does the CS0111 checking.
2588         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
2589         Use IsDuplicateImplementation().
2590
2591 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
2592
2593         * decl.cs (FindMemberToOverride): New method to find the correct
2594         method or property to override in the base class.
2595         * class.cs
2596             - Make Method/Property use the above method to find the
2597               version in the base class.
2598             - Remove the InheritableMemberSignatureCompare as it is now
2599               dead code.
2600
2601         This patch makes large code bases much faster to compile, as it is
2602         O(n) rather than O(n^2) to do this validation.
2603
2604         Also, it fixes bug 52458 which is that nested classes are not
2605         taken into account when finding the base class member.
2606
2607         Reviewed/Approved by Martin.
2608
2609 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
2610
2611         * interface.cs: In all interface classes removed redundant
2612         member initialization.
2613
2614 2004-03-16  Martin Baulig  <martin@ximian.com>
2615
2616         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
2617
2618 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
2619
2620         * decl.cs (DefineTypeAndParents): New helper method to define a
2621         type's containers before the type itself is defined;  This is a
2622         bug exposed by the recent changes to Windows.Forms when an
2623         implemented interface was defined inside a class that had not been
2624         built yet.   
2625
2626         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
2627
2628         (Check): Loop correctly to report errors modifiers
2629         (UNSAFE was not in the loop, since it was the same as TOP).
2630
2631         * interface.cs: Every interface member now takes a ModFlags,
2632         instead of a "is_new" bool, which we set on the base MemberCore. 
2633
2634         Every place where we called "UnsafeOk" in the interface, now we
2635         call the proper member (InterfaceMethod.UnsafeOK) instead to get
2636         the unsafe settings from the member declaration instead of the
2637         container interface. 
2638
2639         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
2640
2641         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
2642         `set_indexer_name' to the pending bits (one per type).
2643
2644         We fixed a bug today that was picking the wrong method to
2645         override, since for properties the existing InterfaceMethod code
2646         basically ignored the method name.  Now we make sure that the
2647         method name is one of the valid indexer names.
2648
2649 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
2650  
2651         * support.cs (SeekableStreamReader): Keep track of stream byte
2652         positions and don't mix them with character offsets to the buffer.
2653
2654         Patch from Gustavo Giráldez
2655
2656 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
2657
2658         * interface.cs (InterfaceSetGetBase): Removed double member
2659         initialization, base class does it as well.
2660
2661 2004-03-13  Martin Baulig  <martin@ximian.com>
2662
2663         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
2664         when compiling corlib.
2665
2666 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
2667
2668         * convert.cs (ExplicitConversion): We were reporting an error on
2669         certain conversions (object_type source to a value type, when the
2670         expression was `null') before we had a chance to pass it through
2671         the user defined conversions.
2672
2673         * driver.cs: Replace / and \ in resource specifications to dots.
2674         Fixes 50752
2675
2676         * class.cs: Add check for duplicate operators.  Fixes 52477
2677
2678 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
2679
2680         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
2681         that are in the middle of the statements, not only at the end.
2682         Fixes #54987
2683
2684         * class.cs (TypeContainer.AddField): No longer set the
2685         `HaveStaticConstructor' flag, now we call it
2686         `UserDefineStaticConstructor' to diferentiate the slightly
2687         semantic difference.
2688
2689         The situation is that we were not adding BeforeFieldInit (from
2690         Modifiers.TypeAttr) to classes that could have it.
2691         BeforeFieldInit should be set to classes that have no static
2692         constructor. 
2693
2694         See:
2695
2696         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
2697
2698         And most importantly Zoltan's comment:
2699
2700         http://bugzilla.ximian.com/show_bug.cgi?id=44229
2701
2702         "I think beforefieldinit means 'it's ok to initialize the type sometime 
2703          before its static fields are used', i.e. initialization does not need
2704          to be triggered by the first access to the type. Setting this flag
2705          helps the JIT to compile better code, since it can run the static
2706          constructor at JIT time, and does not need to generate code to call it
2707          (possibly lots of times) at runtime. Unfortunately, mcs does not set
2708          this flag for lots of classes like String. 
2709          
2710          csc sets this flag if the type does not have an explicit static 
2711          constructor. The reasoning seems to be that if there are only static
2712          initalizers for a type, and no static constructor, then the programmer
2713          does not care when this initialization happens, so beforefieldinit
2714          can be used.
2715          
2716          This bug prevents the AOT compiler from being usable, since it 
2717          generates so many calls to mono_runtime_class_init that the AOT code
2718          is much slower than the JITted code. The JITted code is faster, 
2719          because it does not generate these calls if the vtable is type is
2720          already initialized, which is true in the majority of cases. But the
2721          AOT compiler can't do this."
2722
2723 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
2724
2725         * class.cs (MethodData.Emit): Refactor the code so symbolic
2726         information is generated for destructors;  For some reasons we
2727         were taking a code path that did not generate symbolic information
2728         before. 
2729
2730 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
2731
2732         * class.cs: Create a Constructor.CheckBase method that
2733         takes care of all validation type code. The method
2734         contains some code that was moved from Define.
2735
2736         It also includes new code that checks for duplicate ctors.
2737         This fixes bug #55148.
2738
2739 2004-03-09  Joshua Tauberer <tauberer@for.net>
2740
2741         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
2742         a { ... }-style array creation invokes EmitStaticInitializers
2743         which is not good for reference-type arrays.  String, decimal
2744         and now null constants (NullCast) are not counted toward
2745         static initializers.
2746
2747 2004-03-05  Martin Baulig  <martin@ximian.com>
2748
2749         * location.cs (SourceFile.HasLineDirective): New public field;
2750         specifies whether the file contains or is referenced by a "#line"
2751         directive.
2752         (Location.DefineSymbolDocuments): Ignore source files which
2753         either contain or are referenced by a "#line" directive.        
2754
2755 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
2756
2757         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
2758         direct access to our parent, so check the method inline there.
2759
2760 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
2761
2762         * expression.cs (Invocation.EmitCall): Miguel's last commit
2763         caused a regression. If you had:
2764
2765             T t = null;
2766             t.Foo ();
2767
2768         In Foo the implict this would be null.
2769
2770 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
2771
2772         * expression.cs (Invocation.EmitCall): If the method is not
2773         virtual, do not emit a CallVirt to it, use Call.
2774
2775         * typemanager.cs (GetFullNameSignature): Improve the method to
2776         cope with ".ctor" and replace it with the type name.
2777
2778         * class.cs (ConstructorInitializer.Resolve): Now the method takes
2779         as an argument the ConstructorBuilder where it is being defined,
2780         to catch the recursive constructor invocations.
2781
2782 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
2783
2784         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
2785         routines to check if a type is an enumerable/enumerator allow
2786         classes that implement the IEnumerable or IEnumerator interfaces.
2787
2788         * class.cs (Property, Operator): Implement IIteratorContainer, and
2789         implement SetYields.
2790
2791         (Property.Define): Do the block swapping for get_methods in the
2792         context of iterators.   We need to check if Properties also
2793         include indexers or not.
2794
2795         (Operator): Assign the Block before invoking the
2796         OperatorMethod.Define, so we can trigger the Iterator code
2797         replacement. 
2798
2799         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
2800         Property and Operator classes are not created when we parse the
2801         declarator but until we have the block completed, so we use a
2802         singleton SimpleIteratorContainer.Simple to flag whether the
2803         SetYields has been invoked.
2804
2805         We propagate this setting then to the Property or the Operator to
2806         allow the `yield' to function.
2807
2808 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
2809
2810         * codegen.cs: Implemented attribute support for modules.
2811         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
2812         Assembly/Module functionality.
2813
2814         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
2815         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
2816         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
2817
2818 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
2819
2820         * interface.cs (FindMembers): The operation is performed on all base
2821         interfaces and not only on the first. It is required for future CLS Compliance patch.
2822
2823 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
2824
2825         * statement.cs, codegen.cs:
2826         This patch deals with patterns such as:
2827
2828         public class List : IEnumerable {
2829
2830                 public MyEnumerator GetEnumerator () {
2831                         return new MyEnumerator(this);
2832                 }
2833
2834                 IEnumerator IEnumerable.GetEnumerator () {
2835                         ...
2836                 }
2837                 
2838                 public struct MyEnumerator : IEnumerator {
2839                         ...
2840                 }
2841         }
2842
2843         Before, there were a few things we did wrong:
2844         1) we would emit callvirt on a struct, which is illegal
2845         2) we emited ldarg when we needed to emit ldarga
2846         3) we would mistakenly call the interface methods on an enumerator
2847         type that derived from IEnumerator and was in another assembly. For example:
2848
2849         public class MyEnumerator : IEnumerator
2850
2851         Would have the interface methods called, even if there were public impls of the
2852         method. In a struct, this lead to invalid IL code.
2853
2854 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
2855
2856         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
2857           renamed to Emit.
2858
2859         * delegate.cs (Define): Fixed crash when delegate type is undefined.
2860
2861 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
2862
2863         * cs-parser.jay: Fix small regression: we were not testing V2
2864         compiler features correctly.
2865
2866         * interface.cs: If the emit context is null, then create one
2867
2868 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
2869
2870         * decl.cs (GetSignatureForError): New virtual method to get full name
2871           for error messages.
2872
2873         * attribute.cs (IAttributeSupport): New interface for attribute setting.
2874           Now it is possible to rewrite ApplyAttributes method to be less if/else.
2875
2876         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
2877           Duplicated members and code in these classes has been removed.
2878           Better encapsulation in these classes.
2879
2880 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
2881
2882         * assign.cs (Assign.DoResolve): When dealing with compound
2883         assignments, there is a new rule in ECMA C# 2.4 (might have been
2884         there before, but it is documented here) that states that in:
2885
2886         a op= b;
2887
2888         If b is of type int, and the `op' is a shift-operator, then the
2889         above is evaluated as:
2890
2891         a = (int) a op b 
2892
2893         * expression.cs (Binary.ResolveOperator): Instead of testing for
2894         int/uint/long/ulong, try to implicitly convert to any of those
2895         types and use that in pointer arithmetic.
2896
2897         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
2898         method to print information for from the type, not from the
2899         null-method we were given.
2900
2901 2004-02-01  Duncan Mak  <duncan@ximian.com>
2902
2903         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
2904         parsing for cmd, fixes bug #53694.
2905
2906 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
2907
2908         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
2909         in the member name duplication tests. Property and operator name duplication
2910         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
2911
2912 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
2913
2914         * interface.cs (PopulateMethod): Fixed crash when interface method
2915         returns not existing type (error test cs0246-3.cs).
2916
2917 2004-02-02  Ravi Pratap M <ravi@ximian.com>
2918
2919         * cs-parser.jay (interface_accessors): Re-write actions to also
2920         store attributes attached to get and set methods. Fix spelling
2921         while at it.
2922
2923         (inteface_property_declaration): Modify accordingly.
2924
2925         (InterfaceAccessorInfo): New helper class to store information to pass
2926         around between rules that use interface_accessors.
2927
2928         * interface.cs (Emit): Apply attributes on the get and set
2929         accessors of properties and indexers too.
2930
2931         * attribute.cs (ApplyAttributes): Modify accordingly to use the
2932         right MethodBuilder when applying attributes to the get and set accessors.
2933
2934 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
2935
2936         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
2937
2938 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
2939
2940         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
2941
2942 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
2943
2944         * cs-parser.jay: Remove YIELD token, instead use the new grammar
2945         changes that treat `yield' specially when present before `break'
2946         or `return' tokens.
2947
2948         * cs-tokenizer.cs: yield is no longer a keyword.
2949
2950 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
2951
2952         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
2953         setting for default constructors.
2954         For default constructors are almost every time set wrong Modifier. The
2955         generated IL code has been alright. But inside mcs this values was
2956         wrong and this was reason why several of my CLS Compliance tests
2957         failed.
2958
2959 2004-01-22  Martin Baulig  <martin@ximian.com>
2960
2961         * cs-parser.jay (namespace_or_type_name): Return an Expression,
2962         not a QualifiedIdentifier.  This is what `type_name_expression'
2963         was previously doing.
2964         (type_name_expression): Removed; the code is now in
2965         `namespace_or_type_name'.
2966         (qualified_identifier): Removed, use `namespace_or_type_name'
2967         instead.
2968         (QualifiedIdentifier): Removed this class.      
2969
2970 2004-01-22  Martin Baulig  <martin@ximian.com>
2971
2972         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
2973         not a string as alias name.
2974
2975 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
2976
2977         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
2978         #52730 bug, and instead compute correctly the need to use a
2979         temporary variable when requesting an address based on the
2980         static/instace modified of the field and the constructor.
2981  
2982 2004-01-21  Martin Baulig  <martin@ximian.com>
2983
2984         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
2985         class and namespace before looking up aliases.  Fixes #52517.
2986
2987 2004-01-21  Martin Baulig  <martin@ximian.com>
2988
2989         * flowanalysis.cs (UsageVector.Merge): Allow variables being
2990         assinged in a 'try'; fixes exception4.cs.
2991
2992 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
2993         * class.cs : Implemented parameter-less constructor for TypeContainer
2994
2995         * decl.cs: Attributes are now stored here. New property OptAttributes
2996
2997         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
2998
2999         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
3000
3001 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3002
3003         * typemanager.cs (CSharpSignature): Now reports also inner class name.
3004           (CSharpSignature): New method for indexer and property signature.
3005
3006 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3007
3008         * pending.cs (IsVirtualFilter): Faster implementation.
3009
3010 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3011
3012         * typemanager.cs: Avoid inclusion of same assembly more than once.
3013
3014 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3015
3016         * cs-parser.jay: Fixed problem where the last assembly attribute
3017           has been applied also to following declaration (class, struct, etc.)
3018           
3019 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3020
3021         * class.cs: Added error CS0538, CS0539 reporting.
3022         Fixed crash on Microsoft runtime when field type is void.
3023
3024         * cs-parser.jay: Added error CS0537 reporting.
3025
3026         * pending.cs: Added error CS0535 reporting.
3027         Improved error report for errors CS0536, CS0534.
3028
3029 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
3030
3031         Merge a few bits from the Anonymous Method MCS tree.
3032
3033         * statement.cs (ToplevelBlock): New class for toplevel methods,
3034         will hold anonymous methods, lifted variables.
3035
3036         * cs-parser.jay: Create toplevel blocks for delegates and for
3037         regular blocks of code. 
3038
3039 2004-01-20  Martin Baulig  <martin@ximian.com>
3040
3041         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
3042         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
3043         and `NeedExplicitReturn'; added `IsLastStatement'.
3044         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
3045         have a `ReturnLabel' or we're not unreachable.
3046
3047         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
3048         child's reachability; don't just override ours with it.  Fixes
3049         #58058 (lluis's example).
3050         (FlowBranching): Added public InTryOrCatch(), InCatch(),
3051         InFinally(), InLoop(), InSwitch() and
3052         BreakCrossesTryCatchBoundary() methods.
3053
3054         * statement.cs (Return): Do all error checking in Resolve().
3055         Unless we are the last statement in a top-level block, always
3056         create a return label and jump to it.
3057         (Break, Continue): Do all error checking in Resolve(); also make
3058         sure we aren't leaving a `finally'.
3059         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
3060         statement in a top-level block.
3061         (Block.Flags): Added `IsDestructor'.
3062         (Block.IsDestructor): New public property.
3063
3064 2004-01-20  Martin Baulig  <martin@ximian.com>
3065
3066         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
3067
3068 2004-01-20  Martin Baulig  <martin@ximian.com>
3069
3070         * statement.cs (Statement.ResolveUnreachable): New public method.
3071         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
3072         (Block.Resolve): Resolve unreachable statements.
3073
3074 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3075
3076         * expression.cs: We need to fix the case where we do
3077         not have a temp variable here.
3078
3079         * assign.cs: Only expression compound assignments need
3080         temporary variables.
3081
3082 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3083
3084         * flowanalysis.cs: Reduce memory allocation in a few ways:
3085           - A block with no variables should not allocate a bit
3086             vector for itself.
3087           - A method with no out parameters does not need any tracking
3088             for assignment of the parameters, so we need not allocate
3089             any data for it.
3090           - The arrays:
3091                 public readonly Type[] VariableTypes;
3092                 public readonly string[] VariableNames;
3093             Are redundant. The data is already stored in the variable
3094             map, so we need not allocate another array for it.
3095           - We need to add alot of checks for if (params | locals) == null
3096             due to the first two changes.
3097
3098 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
3099
3100         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
3101         implement IMemoryLocation, we store a copy on a local variable and
3102         take the address of it.  Patch from Benjamin Jemlich
3103
3104         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
3105         to use a special "type_name_expression" rule which reduces the
3106         number of "QualifiedIdentifier" classes created, and instead
3107         directly creates MemberAccess expressions.
3108
3109 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
3110
3111         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
3112         that fixes #52853.  Null literal assignment to ValueType
3113
3114         * class.cs (MethodData.Emit): Instead of checking the name of the
3115         method to determine if its a destructor, create a new derived
3116         class from Method called Destructor, and test for that.  
3117
3118         * cs-parser.jay: Create a Destructor object instead of a Method.  
3119
3120         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
3121
3122         Fixes: 52933
3123
3124 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
3125
3126         * expression.cs (Binary.ResolveOperator): Perform an implicit
3127         conversion from MethodGroups to their delegate types on the
3128         Addition operation.
3129
3130         * delegate.cs: Introduce a new class DelegateCreation that is the
3131         base class for `NewDelegate' and `ImplicitDelegateCreation',
3132         factor some code in here.
3133
3134         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
3135         conversion from MethodGroups to compatible delegate types. 
3136
3137         * ecore.cs (Expression.Resolve): Do not flag error 654
3138         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
3139         we allow conversions from MethodGroups to delegate types now.
3140
3141         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
3142         assignments in v2 either.
3143
3144 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
3145
3146         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
3147         static read-only fields in ctors.
3148
3149         Applied patch from Benjamin Jemlich 
3150
3151         * expression.cs (UnaryMutator): Avoid leaking local variables. 
3152
3153 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
3154
3155         * cs-tokenizer.cs (IsCastToken): Allow the various native types
3156         here to return true, as they can be used like this:
3157
3158                 (XXX) int.MEMBER ()
3159
3160         Fixed 49836 and all the other dups
3161
3162 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
3163
3164         * driver.cs: Implement /win32res and /win32icon.
3165
3166 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
3167
3168         * cs-parser.jay: Add a rule to improve error handling for the
3169         common mistake of placing modifiers after the type.
3170
3171 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
3172
3173         * cs-parser.jay (interface_event_declaration): Catch
3174         initialization of events on interfaces, and report cs0068
3175
3176         * cs-parser.jay (interface_event_declaration): Catch
3177         initialization of events. 
3178
3179         * ecore.cs: Better report missing constructors.
3180
3181         * expression.cs (Binary.ResolveOperator): My previous bug fix had
3182         the error reporting done in the wrong place.  Fix.
3183
3184         * expression.cs (Binary.ResolveOperator): Catch the 
3185         operator + (E x, E y) error earlier, and later allow for implicit
3186         conversions in operator +/- (E e, U x) from U to the underlying
3187         type of E.
3188
3189         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
3190         52596, if the container class is abstract, the default constructor
3191         is protected otherwise its public (before, we were always public).
3192
3193         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
3194         fixed statement.
3195
3196         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
3197         Jemlich that fixes bug #52597, MCS was generating invalid code for
3198         idisposable structs.   Thanks to Ben for following up with this
3199         bug as well.
3200
3201 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
3202
3203         * driver.cs: Allow assemblies without code to be generated, fixes
3204         52230.
3205
3206 2004-01-07  Nick Drochak <ndrochak@gol.com>
3207
3208         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
3209
3210 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
3211
3212         * cs-parser.jay: Add rules to improve error reporting if fields or
3213         methods are declared at the namespace level (error 116)
3214
3215         * Add rules to catch event add/remove
3216
3217 2004-01-04  David Sheldon <dave-mono@earth.li>
3218
3219   * expression.cs: Added matching ")" to error message for 
3220   CS0077
3221
3222 2004-01-03 Todd Berman <tberman@gentoo.org>
3223
3224         * ecore.cs, attribute.cs:
3225         Applying fix from #52429.
3226
3227 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3228
3229         * ecore.cs, expression.cs, statement.cs:
3230         Total rewrite of how we handle branching. We
3231         now handle complex boolean expressions with fewer
3232         jumps. As well if (x == 0) no longer emits a ceq.
3233
3234         if (x is Foo) is much faster now, because we generate
3235         better code.
3236
3237         Overall, we get a pretty big improvement on our benchmark
3238         tests. The code we generate is smaller and more readable.
3239
3240         I did a full two-stage bootstrap. The patch was reviewed
3241         by Martin and Miguel.
3242
3243 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3244
3245         * cs-parser.jay: Make primary_expression not take a QI.
3246         we dont need this because the member_access rule covers
3247         us here. So we replace the rule with just IDENTIFIER.
3248
3249         This has two good effects. First, we remove a s/r conflict.
3250         Second, we allocate many fewer QualifiedIdentifier objects.
3251
3252 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3253
3254         * attribute.cs: Handle MarshalAs attributes as pseudo, and
3255         set the correct information via SRE. This prevents
3256         hanging on the MS runtime. Fixes #29374.
3257
3258 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3259
3260         * convert.cs: correctly handle conversions to value types
3261         from Enum and ValueType as unboxing conversions.
3262
3263         Fixes bug #52569. Patch by Benjamin Jemlich.
3264
3265 2004-01-02  Ravi Pratap  <ravi@ximian.com>
3266
3267         * expression.cs (BetterConversion): Prefer int -> uint
3268         over int -> ulong (csc's behaviour). This fixed bug #52046.
3269
3270 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
3271
3272         * decl.cs (MemberCache.FindMembers): now returns a
3273         MemberInfo [].
3274
3275         * typemanager.cs: In general, go with with ^^.
3276         (CopyNewMethods): take an IList.
3277         (RealMemberLookup): Only allocate an arraylist
3278         if we copy from two sets of methods.
3279
3280         This change basically does two things:
3281         1) Fewer array lists allocated due to CopyNewMethods.
3282         2) the explicit cast in MemberList costed ALOT.
3283
3284 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
3285
3286         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
3287         a hashtable to avoid needless string allocations when an identifier is
3288         used more than once (the common case).
3289
3290 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
3291
3292         * pending.cs: MS's TypeBuilder.GetInterfaces ()
3293         is broken, it will not return anything. So, we
3294         have to use the information we have in mcs to
3295         do the task.
3296
3297         * typemanager.cs: Add a cache for GetInterfaces,
3298         since this will now be used more often (due to ^^)
3299
3300         (GetExplicitInterfaces) New method that gets the
3301         declared, not effective, interfaces on a type
3302         builder (eg, if you have interface IFoo, interface
3303         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
3304         { IBar }.
3305
3306         This patch makes MCS able to bootstrap itself on
3307         Windows again.
3308
3309 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
3310
3311         * expression.cs: Remove the Nop's that Miguel put
3312         in by mistake.
3313
3314 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
3315
3316         * report.cs, codegen.cs: Give the real stack trace to
3317         the error when an exception is thrown.
3318
3319 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
3320
3321         * decl.cs: only allocate hashtables for ifaces if 
3322         it is an iface!
3323
3324 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
3325
3326         * expression.cs: fix the error from cs0121-2.cs
3327         (a parent interface has two child interfaces that
3328         have a function with the same name and 0 params
3329         and the function is called through the parent).
3330
3331 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3332
3333         * class.cs, rootcontext.cs, typmanager.cs: do not
3334         leak pointers.
3335
3336 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3337
3338         * codegen.cs: remove stack for the ec flow branching.
3339         It is already a linked list, so no need.
3340
3341 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
3342
3343         * Makefile: Allow custom profiler here.
3344
3345 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
3346
3347         * typemanager.cs (LookupType):
3348           - Use a static char [], because split takes
3349             a param array for args, so it was allocating
3350             every time.
3351           - Do not store true in a hashtable, it boxes.
3352
3353 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
3354
3355         * flowanalysis.cs: bytify common enums.
3356
3357 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
3358
3359         * modifiers.cs: Add a new set of flags for the
3360         flags allowed on explicit interface impls.
3361         * cs-parser.jay: catch the use of modifiers in
3362         interfaces correctly.
3363         * class.cs: catch private void IFoo.Blah ().
3364
3365         All related to bug #50572.
3366
3367 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
3368
3369         * decl.cs: Rewrite the consistant accessability checking.
3370         Accessability is not linear, it must be implemented in
3371         a tableish way. Fixes #49704.
3372
3373 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
3374
3375         * expression.cs: Handle negation in a checked context.
3376         We must use subtraction from zero. Fixes #38674.
3377
3378 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3379
3380         * class.cs: Ignore static void main in DLLs.
3381         * rootcontext.cs: Handle the target type here,
3382         since we are have to access it from class.cs
3383         * driver.cs: account for the above.
3384
3385 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3386
3387         * report.cs: Give line numbers and files if available.
3388
3389 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
3390
3391         * driver.cs: Implement /addmodule.
3392
3393         * typemanager.cs:  Change 'modules' field so it now contains Modules not
3394         ModuleBuilders.
3395
3396 2003-12-20  Martin Baulig  <martin@ximian.com>
3397
3398         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
3399         (FieldBase.IsAssigned): Removed this field.
3400         (FieldBase.SetAssigned): New public method.
3401         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
3402
3403 2003-12-20  Martin Baulig  <martin@ximian.com>
3404
3405         * expression.cs (LocalVariableReference.DoResolve): Don't set
3406         `vi.Used' if we're called from DoResolveLValue().
3407
3408         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
3409         returns the usage vector it just merged into the current one -
3410         pass this one to UsageWarning().
3411         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
3412         of the `EmitContext', don't call this recursively on our children.
3413
3414 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
3415
3416         * driver.cs: Implement /target:module.
3417
3418 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
3419
3420         * support.cs (CharArrayHashtable): New helper class.
3421
3422         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
3423         char arrays, not strings, so we can avoid creating a string in
3424         consume_identifier if the identifier is a keyword.
3425
3426 2003-12-16  Martin Baulig  <martin@ximian.com>
3427
3428         * statement.cs (LocalInfo.Assigned): Removed this property.
3429         (LocalInfo.Flags): Removed `Assigned'.
3430         (LocalInfo.IsAssigned): New public method; takes the EmitContext
3431         and uses flow analysis.
3432         (Block.UsageWarning): Made this method private.
3433         (Block.Resolve): Call UsageWarning() if appropriate.
3434
3435         * expression.cs (LocalVariableReference.DoResolve): Always set
3436         LocalInfo.Used here.
3437
3438 2003-12-13  Martin Baulig  <martin@ximian.com>
3439
3440         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
3441         any value here; we're now using flow analysis to figure out
3442         whether a statement/block returns a value.
3443
3444 2003-12-13  Martin Baulig  <martin@ximian.com>
3445
3446         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
3447         working again.
3448         (FlowBranching.MergeFinally): Don't call
3449         `branching.CheckOutParameters()' here, this is called in
3450         MergeTopBlock().
3451         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
3452         when adding the `finally' vector.       
3453
3454 2003-12-13  Martin Baulig  <martin@ximian.com>
3455
3456         * flowanalysis.cs
3457         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
3458         actually work and also fix #48962.
3459
3460 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
3461
3462         * decl.cs: Do not check System.Object for nested types,
3463         since we know it does not have any. Big bang for buck:
3464
3465         BEFORE:
3466            Run 1:   8.35 seconds
3467            Run 2:   8.32 seconds
3468            corlib:  17.99 seconds
3469         AFTER:
3470            Run 1:   8.17 seconds
3471            Run 2:   8.17 seconds
3472            corlib:  17.39 seconds
3473
3474 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
3475
3476         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
3477         time we are returning 0 members, so we save alot here.
3478
3479 2003-12-11  Martin Baulig  <martin@ximian.com>
3480
3481         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
3482         `MergeChild()', also just take the `FlowBranching' as argument;
3483         call Merge() on it and return the result.
3484         (FlowBranching.Merge): We don't need to do anything if we just
3485         have one sibling.
3486
3487 2003-12-11  Martin Baulig  <martin@ximian.com>
3488
3489         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
3490         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
3491         Maurer for this idea.
3492
3493 2003-12-11  Martin Baulig  <martin@ximian.com>
3494
3495         * flowanalysis.cs (MergeResult): This class is now gone; we now
3496         use the `UsageVector' for this.  The reason for this is that if a
3497         branching just has one sibling, we don't need to "merge" them at
3498         all - that's the next step to do.
3499         (FlowBranching.Merge): We now return a `UsageVector' instead of a
3500         `MergeResult'.
3501
3502 2003-12-11  Martin Baulig  <martin@ximian.com>
3503
3504         Reworked flow analyis and made it more precise and bug-free.  The
3505         most important change is that we're now using a special `Reachability'
3506         class instead of having "magic" meanings of `FlowReturns'.  I'll
3507         do some more cleanups and optimizations and also add some more
3508         documentation this week.
3509
3510         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
3511         largely reworked this class.
3512         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
3513         the new `Reachability' class instead of having "magic" values here.
3514         (FlowBranching): We're now using an instance of `Reachability'
3515         instead of having separate `Returns', `Breaks' etc. fields.
3516
3517         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
3518         based on flow analysis; ignore the return value of block.Emit ().
3519
3520 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
3521
3522         * driver.cs typemanager.cs: Find the mono extensions to corlib even
3523         if they are private.
3524
3525 2003-12-09  Martin Baulig  <martin@ximian.com>
3526
3527         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
3528         call them directly on the UsageVector.
3529
3530 2003-12-09  Martin Baulig  <martin@ximian.com>
3531
3532         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
3533         Changed return type from `FlowReturns' to `Reachability'.
3534
3535 2003-12-09  Martin Baulig  <martin@ximian.com>
3536
3537         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
3538         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
3539         `Reachable' fields with a single `Reachability' one.
3540
3541 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3542
3543         * class.cs (FindMembers): Remove foreach's.
3544
3545         Bootstrap times:
3546
3547         BEFORE
3548                 Run 1:   8.74 seconds
3549                 Run 2:   8.71 seconds
3550
3551         AFTER
3552                 Run 1:   8.64 seconds
3553                 Run 2:   8.58 seconds
3554
3555
3556 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3557
3558         * cs-parser.jay:
3559         * gen-treedump.cs:
3560         * statement.cs:
3561         This patch does a few things:
3562                 1. EmptyStatement is now a singleton, so it is never reallocated.
3563                 2. All blah is EmptyStatement constructs have been changed to
3564                    blah == EmptyStatement.Value, which is much faster and valid
3565                    now that EmptyStatement is a singleton.
3566                 3. When resolving a block, rather than allocating a new array for
3567                    the non-empty statements, empty statements are replaced with
3568                    EmptyStatement.Value
3569                 4. Some recursive functions have been made non-recursive.
3570         Mainly the performance impact is from (3), however (1) and (2) are needed for
3571         this to work. (4) does not make a big difference in normal situations, however
3572         it makes the profile look saner.
3573
3574         Bootstrap times:
3575
3576         BEFORE
3577         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
3578         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
3579         Total memory allocated: 56397 KB
3580
3581         AFTER
3582         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
3583         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
3584         Total memory allocated: 55666 KB
3585
3586 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3587
3588         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
3589         than the hashtable in a hashtable version
3590
3591         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
3592         we always end up concating a string. This results in a huge perf
3593         loss, because many strings have to be tracked by the GC. In this
3594         patch, we first use a hashtable that works with two keys, so that
3595         the strings do not need to be concat'ed.
3596
3597         Bootstrap times:
3598         BEFORE
3599                 Run 1:   8.74 seconds
3600                 Run 2:   8.71 seconds
3601
3602         AFTER
3603                 Run 1:   8.65 seconds
3604                 Run 2:   8.56 seconds
3605
3606 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3607
3608         * Makefile: Add a new target `do-time' that does a quick and simple
3609         profile, leaving easy to parse output.
3610
3611 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
3612
3613         * codegen.cs (Init): Create the dynamic assembly with 
3614         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
3615
3616 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
3617
3618         * support.cs: Make the PtrHashtable use only one
3619         instance of its comparer.
3620
3621 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
3622
3623         * typemanager.cs: Fix lookup of GetNamespaces.
3624
3625 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
3626
3627         * expression.cs: Removed redundant line.
3628
3629         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
3630         ArrayLists, use for loops with bounds.  
3631
3632         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
3633         arraylist.
3634
3635         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
3636         arraylists, use for loop with bounds.
3637
3638         The above three changes give us a 0.071 second performance
3639         improvement out of 3.294 seconds down to 3.223.  On my machine
3640         the above changes reduced the memory usage by 1,387 KB during
3641         compiler bootstrap.
3642
3643         * cs-parser.jay (QualifiedIdentifier): New class used to represent
3644         QualifiedIdentifiers.  Before we created a new string through
3645         concatenation, and mostly later on, the result would be
3646         manipulated by DecomposeQI through string manipulation.
3647
3648         This reduced the compiler memory usage for bootstrapping from
3649         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
3650         compile times in 0.05 seconds.
3651
3652 2003-11-28  Dick Porter  <dick@ximian.com>
3653
3654         * support.cs: Do string compares with the Invariant culture.
3655
3656         * rootcontext.cs: 
3657         * gen-treedump.cs: 
3658         * expression.cs: 
3659         * driver.cs: 
3660         * decl.cs: 
3661         * codegen.cs: 
3662         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
3663         the comparison is done with the Invariant culture.
3664
3665 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
3666
3667         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
3668         GetEnumerator method.
3669
3670         (ProbeCollectionType): Iterate starting at the most specific type
3671         upwards looking for a GetEnumerator
3672
3673         * expression.cs: Shift count can be up to 31 for int/uint and 63
3674         for long/ulong.
3675
3676 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
3677
3678         * statement.cs (Block.LookupLabel): Also look for the label on the
3679         children blocks.  Use a hash table to keep track of visited
3680         nodes. 
3681
3682         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
3683         we actually did transform the other operand, otherwise fall back
3684         to the common codepath that casts to long.
3685
3686         * cs-tokenizer.cs: Use the same code pattern as the int case.
3687         Maybe I should do the parsing myself, and avoid depending on the
3688         Parse routines to get this done.
3689
3690 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
3691
3692         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
3693         which fixes bug 51347.  This time test it.
3694
3695         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
3696         attributes for example can not tell the difference between these.
3697         The difference was only a syntax feature of the language. 
3698
3699         * attribute.cs: Apply attributes to delegates.
3700
3701         * delegate.cs: Call the apply attributes method.
3702
3703 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
3704
3705         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
3706         comparing 0 vs Byte.MinValue, not the value
3707
3708         (ImplicitConversionRequired): When reporting a conversion error,
3709         use error 31 to print out the constant error instead of the
3710         simpler 29.
3711
3712         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
3713         which fixes bug 51347.
3714
3715 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
3716
3717         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
3718         which fixes the -warnaserror command line option.
3719
3720 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
3721
3722         * cfold.cs (DoNumericPromotions): During constant folding of
3723         additions on UIntConstant, special case intconstants with
3724         IntConstants like we do on the expression binary operator. 
3725
3726 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
3727
3728         * convert.cs (ImplicitReferenceConversion): We were missing a case
3729         (System.Enum are not value types or class types, so we need to
3730         classify them separatedly).
3731
3732         * driver.cs: We do not support error 2007.
3733
3734 2003-11-12 Jackson Harper <jackson@ximian.com>
3735
3736         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
3737         system directory. Also use the full file name so users can
3738         libraries names mscorlib-o-tron.dll in a non system dir.
3739
3740 2003-11-10  Martin Baulig  <martin@ximian.com>
3741
3742         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
3743         (TypeManager.InitCoreTypes): Initialize them here, but instead of
3744         calling `ResolveType()' on them, directly assign their `Type'.
3745
3746 2003-11-08  Martin Baulig  <martin@ximian.com>
3747
3748         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
3749         return value and the `out parent' parameter.
3750         (TypeContainer.DefineType): Moved the CS0644 check into
3751         GetClassBases().  Don't pass the interface types to the
3752         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
3753         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
3754
3755         * ecore.cs (TypeExpr.IsAttribute): New property.
3756         (TypeExpr.GetInterfaces): New method.
3757
3758         * interface.cs (Interface.GetInterfaceTypeByName): Return a
3759         TypeExpr instead of a Type.
3760         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
3761         (Interface.DefineType): Don't pass the interface types to the
3762         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
3763         them later and then call `TypeBulider.AddInterfaceImplementation()'.
3764
3765         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
3766         instead of a `Type[]'.
3767         (TypeManager.RegisterBuilder): Likewise.
3768         (TypeManager.AddUserInterface): Likewise.
3769         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
3770         `Type[]' and also return a `TypeExpr[]'.
3771         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
3772
3773 2003-11-08  Martin Baulig  <martin@ximian.com>
3774
3775         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
3776         Expression.     
3777
3778 2003-11-08  Martin Baulig  <martin@ximian.com>
3779
3780         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
3781         TypeManager.ResolveExpressionTypes().
3782
3783         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
3784         instead of an Expression.
3785         (TypeExpr): This is now an abstract base class for `TypeExpression'.
3786         (TypeExpression): New public class; formerly known as `TypeExpr'.
3787
3788         * expression.cs (ComposedCast): Derive from TypeExpr.
3789
3790         * typemanager.cs (TypeManager.system_*_expr): These are now
3791         TypExpr's instead of Expression's.
3792         (TypeManager.ResolveExpressionTypes): New public static function;
3793         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
3794         of them.        
3795
3796 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
3797
3798         * expression.cs (New.DoResolve): Do not dereference value that
3799         might be a null return.
3800
3801         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
3802         sure that the constant value has the right type.  Fixes an
3803         unreported bug, similar to 50425.
3804
3805         * const.cs (Const.LookupConstantValue): Call
3806         ImplicitStandardConversionExists before doing a conversion to
3807         avoid havng the TypeManager.ChangeType do conversions.
3808
3809         Reduced the number of casts used
3810
3811         (Const.ChangeType): New routine to enable reuse of the constant
3812         type changing code from statement.
3813
3814         * typemanager.cs (ChangeType): Move common initialization to
3815         static global variables.
3816
3817         Fixes #50425.
3818
3819         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
3820         every value type to go through, even if it was void.  Fix that. 
3821
3822         * cs-tokenizer.cs: Use is_identifier_start_character on the start
3823         character of the define, and the is_identifier_part_character for
3824         the rest of the string.
3825
3826 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
3827
3828         * expression.cs (UnaryMutator.EmitCode): When I updated
3829         LocalVariableReference.DoResolve, I overdid it, and dropped an
3830         optimization done on local variable references.
3831
3832 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
3833
3834         * ecore.cs: Convert the return from Ldlen into an int.
3835
3836 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
3837
3838         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
3839         the accessibility, this is a special case for toplevel non-public
3840         classes (internal for instance).
3841
3842 2003-10-20  Nick Drochak <ndrochak@gol.com>
3843
3844         * ecore.cs: Fix typo and build.  Needed another right paren.
3845
3846 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
3847
3848         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
3849         `internal' case regular and protected, but not allowing protected
3850         to be evaluated later.  Bug 49840
3851
3852 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
3853
3854         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
3855         to kb.Nlast, and not the kb.nFirst to isolate the switch
3856         statement.
3857
3858         Extract the underlying type, so enumerations of long/ulong are
3859         treated like long/ulong.
3860
3861 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
3862
3863         * expression.cs (New): Overload the meaning of RequestedType to
3864         track the possible creation of the NewDelegate type, since
3865         DoResolve is invoked more than once for new constructors on field
3866         initialization.
3867
3868         See bugs: #48800 and #37014
3869
3870         * cs-parser.jay (declare_local_constants): Take an arraylist
3871         instead of a single constant.
3872
3873         (local_constant_declaration): It should take a
3874         constant_declarators, not a constant_declarator.  Fixes 49487
3875
3876         * convert.cs: Fix error report.
3877
3878 2003-10-13 Jackson Harper <jackson@ximian.com>
3879
3880         * typemanager.cs (TypeToCoreType): Add float and double this fixes
3881         bug #49611
3882
3883 2003-10-09  Martin Baulig  <martin@ximian.com>
3884
3885         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
3886         to the .ctor.
3887         (MethodCore.DoDefineParameters): Removed the TypeContainer
3888         argument; use the DeclSpace which was passed to the .ctor instead.
3889         (MethodCore.CheckParameter): Take a DeclSpace instead of a
3890         TypeContainer; we only need a DeclSpace here.
3891
3892 2003-10-09  Martin Baulig  <martin@ximian.com>
3893
3894         * class.cs (MethodData): Added additional `DeclSpace ds' argument
3895         to the .ctor.
3896         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
3897         EmitContext's .ctor.    
3898
3899 2003-10-09  Martin Baulig  <martin@ximian.com>
3900
3901         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
3902         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
3903         AsAccessible(), moved them as well.
3904
3905         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
3906
3907 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
3908
3909         * cs-parser.jay : Renamed yyName to yyNames related to jay.
3910
3911 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
3912
3913         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
3914         generation for >=, as spotted by Paolo, bug 48679.  
3915         Patch from David Waite.
3916
3917         * cs-tokenizer.cs: Add handling for #pragma.
3918
3919         * cs-parser.jay: Allow for both yield and yield return in the
3920         syntax.  The anti-cobolization of C# fight will go on!
3921
3922         * class.cs (TypeBuilder.DefineType): Catch error condition here
3923         (Parent.DefineType erroring out and returning null).
3924
3925         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
3926         coping with enumerations variables, we were mistakenly processing
3927         them as a regular value type instead of built-in types.  Fixes the
3928         bug #48063
3929
3930         * typemanager.cs (IsBuiltinOrEnum): New method.
3931
3932 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
3933
3934         * cs-parser.jay: Upgrade: yield now needs the return clause.
3935
3936 2003-09-19  Martin Baulig  <martin@ximian.com>
3937
3938         * decl.cs (MemberCache.SetupCacheForInterface): Take a
3939         `MemberCache parent' argument.  Normally, an interface doesn't
3940         have a parent type except System.Object, but we use this in gmcs
3941         for generic type parameters.
3942
3943 2003-09-18  Martin Baulig  <martin@ximian.com>
3944
3945         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
3946         on `type.IsInterface'; don't check whether the type has a parent
3947         to determine whether it's an interface.
3948
3949 2003-09-15  Martin Baulig  <martin@ximian.com>
3950
3951         * class.cs (TypeContainer.DefineType): Added an error flag to
3952         avoid reporting duplicate CS0146's ("class definition is
3953         circular.").
3954
3955         * driver.cs (Driver.MainDriver): Abort if
3956         RootContext.ResolveTree() reported any errors.
3957
3958 2003-09-07  Martin Baulig  <martin@ximian.com>
3959
3960         * report.cs (Error, Warning): Added overloaded versions which take
3961         a `params object[] args' and call String.Format().
3962
3963 2003-09-07  Martin Baulig  <martin@ximian.com>
3964
3965         * decl.cs (DeclSpace..ctor): Don't call
3966         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
3967         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
3968         (DeclSpace.RecordDecl): New method.
3969
3970         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
3971
3972 2003-09-02  Ravi Pratap  <ravi@ximian.com>
3973
3974         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
3975         value attributes to be applied to ParameterBuilders.
3976
3977         * class.cs (MethodCore.LabelParameters): Make static and more
3978         generic so that it can be used from other places - like interface
3979         methods, for instance.
3980
3981         * interface.cs (Interface.Emit): Call LabelParameters before
3982         emitting attributes on the InterfaceMethod.
3983
3984 2003-08-26  Martin Baulig  <martin@ximian.com>
3985
3986         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
3987         resolving aliases; fixes #47927.
3988
3989 2003-08-26  Martin Baulig  <martin@ximian.com>
3990
3991         * statement.cs (Using.DoResolve): This is internally emitting a
3992         try/finally clause, so we need to set ec.NeedExplicitReturn if we
3993         do not always return.  Fixes #47681.
3994
3995 2003-08-26  Martin Baulig  <martin@ximian.com>
3996
3997         * decl.cs (MemberCore): Moved WarningNotHiding(),
3998         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
3999         into MemberBase.
4000         (AdditionResult): Make this nested in DeclSpace.
4001         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
4002         argument; call NamespaceEntry.Define() unless we're nested in a
4003         class or struct.
4004
4005         * namespace.cs (Namespace.DefineName): New public function.  This
4006         is called from DeclSpace's .ctor to add 
4007         (Namespace.Lookup): Include DeclSpaces in the lookup.
4008
4009         * class.cs (Operator): Derive from MemberBase, not MemberCore.
4010
4011         * const.cs (Const): Derive from MemberBase, not MemberCore.     
4012
4013 2003-08-25  Martin Baulig  <martin@ximian.com>
4014
4015         * convert.cs (Convert.ExplicitReferenceConversion): When
4016         converting from an interface type to a class, unbox if the target
4017         type is a struct type.  Fixes #47822.
4018
4019 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4020
4021         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
4022         #47854.
4023
4024 2003-08-22  Martin Baulig  <martin@ximian.com>
4025
4026         * class.cs (TypeManager.DefineType): When defining a nested type,
4027         call DefineType() on our parent; fixes #47801.
4028
4029 2003-08-22  Martin Baulig  <martin@ximian.com>
4030
4031         * class.cs (MethodData.Define): While checking if a method is an
4032         interface implementation, improve the test a bit more to fix #47654.
4033
4034 2003-08-22  Martin Baulig  <martin@ximian.com>
4035
4036         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
4037         correctly; fixes #47722.
4038
4039 2003-08-22  Martin Baulig  <martin@ximian.com>
4040
4041         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
4042         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
4043
4044         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
4045
4046 2003-08-22  Martin Baulig  <martin@ximian.com>
4047
4048         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
4049         can only be assigned in static constructors.  Fixes #47161.
4050
4051 2003-08-22  Martin Baulig  <martin@ximian.com>
4052
4053         Rewrote and improved the flow analysis code.
4054
4055         * flowbranching.cs (FlowBranching): Make this class abstract.
4056         (FlowBranching.CreateBranching): New static function to create a
4057         new flow branching.
4058         (FlowBranchingBlock, FlowBranchingException): New classes.
4059         (FlowBranching.UsageVector.Type): New public readonly field.
4060         (FlowBranching.UsageVector.Breaks): Removed the setter.
4061         (FlowBranching.UsageVector.Returns): Removed the setter.
4062         (FlowBranching.UsageVector): Added Break(), Return(),
4063         NeverReachable() and Throw() methods to modify the reachability.
4064         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
4065         done by FlowBranching.Merge().
4066         (FlowBranching.UsageVector.MergeChild): New method; merges the
4067         merge result into the current vector.
4068         (FlowBranching.Merge): New abstract method to merge a branching.
4069
4070 2003-08-12  Martin Baulig  <martin@ximian.com>
4071
4072         * expression.cs (Indirection.CacheTemporaries): Create the
4073         LocalTemporary with the pointer type, not its element type.
4074
4075 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
4076
4077         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
4078         token was a keyword or not.
4079
4080         Add `error' options where an IDENTIFIER was expected;  Provide
4081         CheckToken and CheckIdentifierToken convenience error reporting
4082         functions. 
4083
4084         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
4085
4086         * decl.cs: Rename `NamespaceEntry Namespace' public field into
4087         NameSpaceEntry NameSpaceEntry.
4088
4089         (LookupInterfaceOrClass): Avoid creating a full qualified name
4090         from namespace and name: avoid doing lookups when we know the
4091         namespace is non-existant.   Use new Tree.LookupByNamespace which
4092         looks up DeclSpaces based on their namespace, name pair.
4093
4094         * driver.cs: Provide a new `parser verbose' to display the
4095         exception thrown during parsing.  This is turned off by default
4096         now, so the output of a failure from mcs is more graceful.
4097
4098         * namespace.cs: Track all the namespaces defined in a hashtable
4099         for quick lookup.
4100
4101         (IsNamespace): New method
4102
4103 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
4104
4105         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
4106         we know that we need to concatenate (full typename can never be
4107         null). 
4108
4109         * class.cs: ditto.
4110
4111         * statement.cs: Use a bitfield;  Do not initialize to null things
4112         which are done by the constructor by default.
4113
4114         * cs-parser.jay: bug fix, parameter was 4, not 3.
4115
4116         * expression.cs: Just use the property;
4117
4118         * statement.cs: No need for GetVariableInfo method.
4119
4120 2003-08-08  Martin Baulig  <martin@ximian.com>
4121
4122         * flowanalysis.cs (FlowReturns): This is now nested in the
4123         `FlowBranching' class.
4124         (MyBitVector): Moved this here from statement.cs.
4125         (FlowBranching.SiblingType): New enum type.
4126         (FlowBranching.CreateSibling): Added `SiblingType' argument.
4127
4128 2003-08-07  Martin Baulig  <martin@ximian.com>
4129
4130         * flowanalysis.cs (FlowBranchingType): This is now nested in the
4131         `FlowBranching' class and called `BranchingType'.
4132
4133 2003-08-07  Martin Baulig  <martin@ximian.com>
4134
4135         * flowanalysis.cs: Moved all the control flow analysis code into
4136         its own file.
4137
4138 2003-08-07  Martin Baulig  <martin@ximian.com>
4139
4140         * assign.cs (Assign.DoResolve): `target' must either be an
4141         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
4142         #37319.
4143
4144 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
4145
4146         * expression.cs (BinaryMethod): This kind of expression is created by the
4147         Binary class if it determines that the operator has to be handled
4148         by a method.
4149
4150         (BinaryDelegate): This kind of expression is created if we are
4151         dealing with a + or - operator on delegates.
4152
4153         (Binary): remove method, argumetns, and DelegateOperator: when
4154         dealing with methods, 
4155
4156         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
4157
4158         * statement.cs (Block): use bitfields for the three extra booleans
4159         we had in use.   Remove unused topblock parameter.
4160
4161         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
4162
4163         * assign.cs: Drop extra unneeded tests.
4164
4165 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
4166
4167         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
4168
4169         * statement.cs (Foreach): Use VariableStorage instead of
4170         LocalBuilders.   
4171
4172         * codegen.cs (VariableStorage): New class used by clients that
4173         require a variable stored: locals or fields for variables that
4174         need to live across yield.
4175
4176         Maybe provide a convenience api for EmitThis+EmitLoad?
4177
4178         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
4179         these bad boys.
4180
4181 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
4182
4183         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
4184         RemapParameterLValue): New methods that are used to turn a
4185         precomputed FieldInfo into an expression like this:
4186
4187                 instance.FieldInfo
4188
4189         The idea is to use this instead of making LocalVariableReference
4190         have more than one meaning.
4191
4192         * cs-parser.jay: Add error production to BASE.
4193
4194         * ecore.cs: Deal with TypeManager.GetField returning null, which
4195         is now a valid return value.
4196
4197         (FieldExprNoAddress): New expression for Fields whose address can
4198         not be taken.
4199
4200         * expression.cs (LocalVariableReference): During the resolve
4201         phases, create new expressions if we are in a remapping context.
4202         Remove code that dealt with remapping here.
4203
4204         (ParameterReference): same.
4205
4206         (ProxyInstance): New expression, like the `This' expression, but
4207         it is born fully resolved.  We know what we are doing, so remove
4208         the errors that are targeted to user-provided uses of `this'.
4209
4210         * statement.cs (Foreach): our variable is now stored as an
4211         Expression;  During resolution, follow the protocol, dont just
4212         assume it will return this.
4213
4214 2003-08-06  Martin Baulig  <martin@ximian.com>
4215
4216         * support.cs (SeekableStreamReader.cs): New public class.
4217
4218         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
4219         SeekableStreamReader instead of the normal StreamReader.
4220
4221 2003-08-04  Martin Baulig  <martin@ximian.com>
4222
4223         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
4224         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
4225         deambiguate casts and delegate invocations.
4226         (parenthesized_expression): Use the new tokens to ensure this is
4227         not a cast of method invocation.
4228
4229         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
4230         when reading a `)' and Deambiguate_CloseParens () was previously
4231         called.
4232
4233         * expression.cs (ParenthesizedExpression): New class.  This is
4234         just used for the CS0075 test.
4235         (Binary.DoResolve): Check for CS0075.   
4236
4237 2003-07-29  Ravi Pratap  <ravi@ximian.com>
4238
4239         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
4240         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
4241         reference comparison.
4242
4243         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
4244         examine the ReturnType for equality - this is necessary in the
4245         cases of implicit and explicit operators whose signature also
4246         includes the return type.
4247
4248 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
4249
4250         * namespace.cs: Cache the result of the namespace computation,
4251         instead of computing it every time.
4252
4253 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
4254
4255         * decl.cs: Use a global arraylist that we reuse over invocations
4256         to avoid excesive memory consumption.  Reduces memory usage on an
4257         mcs compile by one meg (45 average).
4258
4259         * typemanager.cs (LookupTypeReflection): In .NET pointers are
4260         private, work around that.
4261
4262 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
4263
4264         * literal.cs (IntLiteral): Define Zero and One static literals. 
4265
4266         * cs-parser.jay (integer_literal): use static literals to reduce
4267         memory usage for the most used literals (0, 1 and -1).  211kb
4268         reduced in memory usage.
4269
4270         Replace all calls to `new ArrayList' with `new
4271         ArrayList(4)' which is a good average number for most allocations,
4272         and also requires only 16 bytes of memory for its buffer by
4273         default. 
4274
4275         This reduced MCS memory usage in seven megabytes for the RSS after
4276         bootstrapping.
4277
4278 2003-07-28  Ravi Pratap  <ravi@ximian.com>
4279
4280         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
4281         handle params methods the correct way by forming only one
4282         applicable set with params and normal methods in them. Earlier we
4283         were looking at params methods only if we found no normal methods
4284         which was not the correct thing to do.
4285
4286         (Invocation.BetterFunction): Take separate arguments indicating
4287         when candidate and the best method are params methods in their
4288         expanded form.
4289
4290         This fixes bugs #43367 and #46199.
4291
4292         * attribute.cs: Documentation updates.
4293
4294         (CheckAttribute): Rename to CheckAttributeTarget.
4295         (GetValidPlaces): Rename to GetValidTargets.
4296
4297         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
4298         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
4299
4300         Fixes bug #44468.
4301
4302 2003-07-28  Martin Baulig  <martin@ximian.com>
4303
4304         * class.cs (TypeContainer.DefineMembers): Use the base type's full
4305         name when looking up the base class of a nested class.  Fixes #46977.
4306
4307 2003-07-26  Martin Baulig  <martin@ximian.com>
4308
4309         * expression.cs (Indexers.Indexer): New nested struct; contains
4310         getter, setter and the indexer's type.
4311         (Indexers.Properties): This is now an ArrayList of
4312         Indexers.Indexer's.
4313         (IndexerAccess.DoResolveLValue): Correctly set the type if the
4314         indexer doesn't have any getters.
4315
4316         * assign.cs (Assign.DoResolve): Also do the implicit conversions
4317         for embedded property and indexer assignments.
4318
4319 2003-07-26  Martin Baulig  <martin@ximian.com>
4320
4321         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
4322         preprocessor directive is not the first non-whitespace character
4323         on a line.
4324
4325 2003-07-26  Martin Baulig  <martin@ximian.com>
4326
4327         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
4328         namespace parsing, follow the spec more closely.
4329
4330         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
4331         NamespaceEntry.Lookup().
4332
4333 2003-07-25  Martin Baulig  <martin@ximian.com>
4334
4335         * MethodCore.cs (OverridesSomething): New public field; it's set
4336         from TypeContainer.DefineMembers if this method overrides
4337         something (which doesn't need to be a method).  Fix #39462.
4338
4339 2003-07-25  Ravi Pratap  <ravi@ximian.com>
4340
4341         * typemanager.cs (GetMembers): Ensure that the list of members is
4342         reversed. This keeps things in sync.
4343
4344         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
4345         find an AttributeUsage attribute.
4346
4347         * expression.cs (Invocation.OverloadResolve): Perform the check
4348         which disallows Invoke to be directly called on a Delegate.
4349
4350         (Error_InvokeOnDelegate): Report error cs1533.
4351
4352 2003-07-25  Martin Baulig  <martin@ximian.com>
4353
4354         * expression.cs (Indexers.GetIndexersForType): Only look in the
4355         interface hierarchy if the requested type is already an
4356         interface.  Fixes #46788 while keeping #46502 fixed.
4357
4358 2003-07-25  Martin Baulig  <martin@ximian.com>
4359
4360         * class.cs (TypeContainer.DefineMembers): Check whether all
4361         readonly fields have been assigned and report warning CS0649 if
4362         not.
4363
4364         * statement.cs (LocalInfo.IsFixed): Always return true if this is
4365         a valuetype.
4366
4367 2003-07-24  Ravi Pratap  <ravi@ximian.com>
4368
4369         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
4370         returned from GetMethods to make things consistent with the
4371         assumptions MCS makes about ordering of methods.
4372
4373         This should comprehensively fix bug #45127 and it does :-)
4374
4375         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
4376         ordering is actually reverse.
4377
4378         * Clean up some debug messages I left lying around.
4379
4380         * interface.cs (Populate*): Get rid of code which emits attributes
4381         since the stage in which we emit attributes is the 'Emit' stage,
4382         not the define stage.
4383
4384         (Emit): Move attribute emission for interface members here.
4385
4386 2003-07-22  Ravi Pratap  <ravi@ximian.com>
4387
4388         * expression.cs (Invocation.OverloadResolve): Follow the spec more
4389         closely: we eliminate methods in base types when we have an
4390         applicable method in a top-level type.
4391
4392         Please see section 14.5.5.1 for an exact description of what goes
4393         on. 
4394
4395         This fixes bug #45127 and a host of other related to corlib compilation.
4396
4397         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
4398         array is the method corresponding to the top-level type (this is
4399         because of the changes made to icall.c) so we change this
4400         accordingly.
4401
4402         (MethodGroupExpr.Name): This too.
4403
4404         * typemanager.cs (GetElementType): New method which does the right
4405         thing when compiling corlib. 
4406
4407         * everywhere: Make use of the above in the relevant places.
4408
4409 2003-07-22  Martin Baulig  <martin@ximian.com>
4410
4411         * cs-parser.jay (invocation_expression): Moved
4412         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
4413         `cast_expression', but create a InvocationOrCast which later
4414         resolves to either an Invocation or a Cast.
4415
4416         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
4417         method; call this before EmitStatement() to make sure that this
4418         expression can be used as a statement.
4419
4420         * expression.cs (InvocationOrCast): New class; resolves to either
4421         an Invocation or a Cast.
4422
4423         * statement.cs (StatementExpression): Call ResolveStatement() on
4424         the ExpressionStatement before emitting it.
4425
4426 2003-07-21  Martin Baulig  <martin@ximian.com>
4427
4428         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
4429         `ref' and `out' attributes match; fixes #46220.
4430         (MemberAccess.ResolveMemberAccess): You can't reference a type
4431         through an expression; fixes #33180.
4432         (Indexers.GetIndexersForType): Don't return the indexers from
4433         interfaces the class implements; fixes #46502.
4434
4435 2003-07-21  Martin Baulig  <martin@ximian.com>
4436
4437         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
4438         CS0661 checks; fixes bug #30442.
4439
4440 2003-07-21  Martin Baulig  <martin@ximian.com>
4441
4442         * decl.cs (AdditionResult): Added `Error'.
4443
4444         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
4445
4446         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
4447         makes cs0031.cs actually work.
4448
4449 2003-07-20  Martin Baulig  <martin@ximian.com>
4450
4451         * namespace.cs: Fixed that bug which caused a crash when compiling
4452         the debugger's GUI.
4453
4454 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
4455
4456         * typemanager.cs (LookupTypeReflection): Never expose types which
4457         are NotPublic, NestedPrivate, NestedAssembly, or
4458         NestedFamANDAssem.  We used to return these, and later do a check
4459         that would report a meaningful error, but the problem is that we
4460         would not get the real match, if there was a name override.
4461
4462 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
4463
4464         * namespace.cs (Namespace, Name): Do not compute the namespace
4465         name dynamically, compute it in the constructor.  This reduced
4466         memory usage by 1697 KB.
4467
4468         * driver.cs: Use --pause to pause at the end.
4469
4470 2003-07-17  Peter Williams  <peter@newton.cx>
4471
4472         * Makefile: Change the name of the test target so that it doesn't
4473         conflict with the recursive test target.
4474
4475 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
4476
4477         * expression.cs (LocalVariableReference.Emit, EmitAssign,
4478         AddressOf): Do not use EmitThis, that was wrong, use the actual
4479         this pointer.
4480
4481 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
4482
4483         * class.cs (MethodData.Define): While checking if a method is an
4484         interface implementation, improve the test: If we are not public
4485         (use new test here: use the computed MethodAttributes directly,
4486         instead of the parsed modifier flags) check if the `implementing'
4487         method comes from an interface or not.
4488
4489         * pending.cs (VerifyPendingMethods): Slightly better error
4490         message.
4491
4492         * makefile: add test target that does the mcs bootstrap.
4493
4494 2003-07-16  Ravi Pratap  <ravi@ximian.com>
4495
4496         * interface.cs (Define): Do nothing here since there are no
4497         members to populate etc. Move the attribute emission out of here
4498         since this was just totally the wrong place to put it. Attribute
4499         application happens during the 'Emit' phase, not in the 'Define'
4500         phase.
4501
4502         (Emit): Add this method and move the attribute emission here
4503
4504         * rootcontext.cs (EmitCode): Call the Emit method on interface
4505         types too.
4506
4507 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
4508
4509         * expression.cs (OverloadResolve): Report error only if Location
4510         is not 'Null' which means that there was a probe going on.
4511
4512 2003-07-14  Martin Baulig  <martin@ximian.com>
4513
4514         * expression.cs (ConditionalLogicalOperator): New public class to
4515         implement user defined conditional logical operators.
4516         This is section 14.11.2 in the spec and bug #40505.
4517
4518 2003-07-14  Martin Baulig  <martin@ximian.com>
4519
4520         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
4521
4522 2003-07-14  Martin Baulig  <martin@ximian.com>
4523
4524         * codegen.cs (EmitContext.InFixedInitializer): New public field.
4525
4526         * ecore.cs (IVariable.VerifyFixed): New interface method.
4527
4528         * expression.cs (Unary.ResolveOperator): When resolving the `&'
4529         operator, check whether the variable is actually fixed.  Fixes bug
4530         #36055.  Set a variable definitely assigned when taking its
4531         address as required by the spec.
4532
4533         * statement.cs (LocalInfo.IsFixed): New field.
4534         (LocalInfo.MakePinned): Set `IsFixed' to true.
4535
4536 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
4537
4538         * attribute.cs (Attribute.Resolve): While doing a Member lookup
4539         for .ctors, ensure that we only ask for members declared in the
4540         attribute type (BindingFlags.DeclaredOnly).
4541
4542         Fixes bug #43632.
4543
4544         * expression.cs (Error_WrongNumArguments): Report error 1501
4545         correctly the way CSC does.
4546
4547 2003-07-13  Martin Baulig  <martin@ximian.com>
4548
4549         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
4550         lookup on the fully qualified name, to make things like "X.X" work
4551         where "X.X" is a fully qualified type name, but we also have a
4552         namespace "X" in the using list.  Fixes #41975.
4553
4554 2003-07-13  Martin Baulig  <martin@ximian.com>
4555
4556         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
4557         function. If we're a CompoundAssign, we need to create an embedded
4558         CompoundAssign, not an embedded Assign.
4559         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
4560         Fixes #45854.
4561
4562 2003-07-13  Martin Baulig  <martin@ximian.com>
4563
4564         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
4565         work to fix bug #46088.
4566
4567 2003-07-13  Ravi Pratap <ravi@ximian.com>
4568
4569         * class.cs (Operator.Emit): Do not emit attributes here - it is
4570         taken care of by the Method class that we delegate too. This takes
4571         care of bug #45876.
4572
4573 2003-07-10  Martin Baulig  <martin@ximian.com>
4574
4575         * expression.cs (TypeOfVoid): New class.
4576         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
4577
4578 2003-07-10  Martin Baulig  <martin@ximian.com>
4579
4580         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
4581         bug #35957.
4582
4583 2003-07-10  Martin Baulig  <martin@ximian.com>
4584
4585         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
4586         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
4587
4588         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
4589
4590         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
4591
4592 2003-07-10  Martin Baulig  <martin@ximian.com>
4593
4594         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
4595         of decimal.  Fixes #42850.
4596
4597         NOTE: I also fixed the created byte blob, but this doesn't work on
4598         the MS runtime and csc never produces any byte blobs for decimal
4599         arrays.
4600
4601 2003-07-10  Martin Baulig  <martin@ximian.com>
4602
4603         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
4604         structs; fixes #32068.
4605         (Block.AddChildVariableNames): Fixed #44302.
4606
4607 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4608
4609         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
4610
4611 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4612
4613         * attribute.cs: And this test is onger needed.
4614
4615 2003-07-08  Martin Baulig  <martin@ximian.com>
4616
4617         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
4618         inaccessible types.  Fixes #36313.
4619
4620         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
4621
4622         * namespace.cs (NamespaceEntry): Create implicit entries for all
4623         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
4624         implicit entries for N1.N2 and N1.
4625
4626 2003-07-08  Martin Baulig  <martin@ximian.com>
4627
4628         Rewrote the handling of namespaces to fix a lot of the issues
4629         wrt. `using' aliases etc.
4630
4631         * namespace.cs (Namespace): Splitted this class into a
4632         per-assembly `Namespace' and a per-file `NamespaceEntry'.
4633
4634         * typemanager.cs (TypeManager.IsNamespace): Removed.
4635         (TypeManager.ComputeNamespaces): Only compute namespaces from
4636         loaded assemblies here, not the namespaces from the assembly we're
4637         currently compiling.
4638
4639 2003-07-08  Martin Baulig  <martin@ximian.com>
4640
4641         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
4642
4643 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4644
4645         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
4646         already fixed it.  
4647
4648         I thought about the memory savings here, but LookupTypeReflection
4649         is used under already very constrained scenarios.  Compiling
4650         corlib or mcs only exposes one hit, so it would not really reduce
4651         any memory consumption.
4652
4653 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4654
4655         * typemanager.cs: fixes bug #45889 by only adding public types from
4656         other assemblies to the list of known types.
4657
4658 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4659
4660         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
4661         on the type we resolved.
4662
4663 2003-07-05  Martin Baulig  <martin@ximian.com>
4664
4665         * pending.cs (PendingImplementation.ParentImplements): Don't
4666         create the proxy if the parent is abstract.
4667
4668         * class.cs (TypeContainer.DefineIndexers): Process explicit
4669         interface implementations first.  Fixes #37714.
4670
4671 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
4672
4673         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
4674         defined recursively;  but since we modify the input parameters
4675         (left is set to `this' temporarily), we reset this value if the
4676         left_is_explicit is false, which gives the original semantics to
4677         the code.  
4678
4679         * literal.cs (NullPointer): new class used to represent a null
4680         literal in a pointer context.
4681
4682         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
4683         type is a pointer, use a NullPointer object instead of a
4684         NullLiteral.   Closes 43687
4685
4686         (ExplicitConversion): Convert pointer values using
4687         the conv opcode to the proper type.
4688
4689         * ecore.cs (New): change ValueTypeVariable property into a method,
4690         that returns whether the valuetype is suitable for being used.
4691
4692         * expression.cs (Binary.DoNumericPromotions): Only return if we
4693         the int constant was a valid uint, and we can return both left and
4694         right as uints.  If not, we continue processing, to trigger the
4695         type conversion.  This fixes 39018.
4696
4697         * statement.cs (Block.EmitMeta): During constant resolution, set
4698         the CurrentBlock property on the emitcontext, so that we resolve
4699         constants propertly.
4700
4701 2003-07-02  Martin Baulig  <martin@ximian.com>
4702
4703         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
4704         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
4705
4706         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
4707         than emitting it here.
4708
4709         * statement.cs: Fixed some more flow analysis bugs.
4710
4711 2003-07-02  Martin Baulig  <martin@ximian.com>
4712
4713         * class.cs (MethodData.Define): When implementing interface
4714         methods, set Final unless we're Virtual.
4715
4716         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
4717         check work for interface methods.
4718
4719 2003-07-01  Martin Baulig  <martin@ximian.com>
4720
4721         * ecore.cs (EmitContext.This): Replaced this property with a
4722         GetThis() method which takes a Location argument.  This ensures
4723         that we get the correct error location for a CS0188.
4724
4725 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
4726
4727         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
4728         ImplicitStandardConversion.
4729
4730         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
4731
4732 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
4733
4734         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
4735         optimization.
4736
4737 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
4738
4739         * class.cs (Constructor.Define): Turn off initlocals for unsafe
4740         constructors.
4741
4742         (MethodData.Define): Turn off initlocals for unsafe methods.
4743
4744 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
4745
4746         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
4747         complete;  Fixes #37521.
4748
4749         * delegate.cs: Use Modifiers.TypeAttr to compute the
4750         TypeAttributes, instead of rolling our own.  This makes the flags
4751         correct for the delegates.
4752
4753 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
4754
4755         * class.cs (Constructor.Define): Set the private flag for static
4756         constructors as well.
4757
4758         * cs-parser.jay (statement_expression): Set the return value to
4759         null, to avoid a crash when we catch an error.
4760
4761 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
4762
4763         * cs-parser.jay: Applied patch from Jackson that adds support for
4764         extern and unsafe modifiers to destructor declarations.
4765
4766         * expression.cs: Report error 21 if the user is trying to index a
4767         System.Array.
4768
4769         * driver.cs: Add an error message, suggested by the bug report.
4770
4771         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
4772         if we do not have a ": this ()" constructor initializer.  Fixes 45149
4773
4774 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
4775
4776         * namespace.cs: Add some information to reduce FAQs.
4777
4778 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
4779
4780         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
4781         underlying enumeration types.  Fixes #43915.
4782
4783         * expression.cs: Treat ushort/short as legal values to be used in
4784         bitwise operations.
4785
4786 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
4787
4788         * delegate.cs: transfer custom attributes for paramenters from
4789         the delegate declaration to Invoke and BeginInvoke.
4790
4791 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
4792
4793         * attribute.cs: handle custom marshalers and emit marshal info
4794         for fields, too.
4795
4796 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
4797
4798         * makefile.gnu: Added anonymous.cs to the compiler sources.
4799
4800 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
4801
4802         * iterators.cs: Change the name of the proxy class to include two
4803         underscores.
4804
4805         * cs-parser.jay: Update grammar to include anonymous methods.
4806
4807         * anonymous.cs: new file.
4808
4809 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
4810
4811         * class.cs (Field.Define): Add missing test for pointers and
4812         safety. 
4813
4814 2003-05-27  Ravi Pratap  <ravi@ximian.com>
4815
4816         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
4817         we use the stobj opcode.
4818
4819         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
4820         since it wasn't the correct fix. 
4821
4822         It still is puzzling that we are required to use stobj for IntPtr
4823         which seems to be a ValueType.
4824
4825 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
4826
4827         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
4828         during regular simple name resolution.   Now, the trick is that
4829         instead of returning for processing the simplename, we do a
4830         TypeManager.LookupType (ie, a rooted lookup as opposed to a
4831         contextual lookup type).   If a match is found, return that, if
4832         not, return for further composition.
4833
4834         This fixes long-standing 30485.
4835
4836         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
4837         using the address to initialize an object, do an Stobj instead of
4838         using the regular Stelem.
4839
4840         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
4841         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
4842         Because if we are a BaseIndexerAccess that value will be true.
4843         Fixes 43643.
4844
4845         * statement.cs (GotoCase.Resolve): Return after reporting an
4846         error, do not attempt to continue. 
4847
4848         * expression.cs (PointerArithmetic.Emit): If our operand is a
4849         long, convert our constants to match the operand before
4850         multiplying.  Convert to I type before adding.   Fixes 43670.
4851
4852 2003-05-14  Ravi Pratap  <ravi@ximian.com>
4853
4854         * enum.cs (ImplicitConversionExists) : Rename to
4855         ImplicitEnumConversionExists to remove ambiguity. 
4856
4857         * ecore.cs (NullCast): New type of cast expression class which
4858         basically is very similar to EmptyCast with the difference being
4859         it still is a constant since it is used only to cast a null to
4860         something else
4861         (eg. (string) null)
4862
4863         * convert.cs (ImplicitReferenceConversion): When casting a null
4864         literal, we return a NullCast.
4865
4866         * literal.cs (NullLiteralTyped): Remove - I don't see why this
4867         should be around anymore.
4868
4869         The renaming (reported was slightly wrong). Corrections:
4870
4871         ConvertImplicitStandard -> ImplicitConversionStandard
4872         ConvertExplicitStandard -> ExplicitConversionStandard
4873
4874         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
4875         before passing them in !
4876
4877         * convert.cs (ImplicitConversionStandard): When comparing for
4878         equal expr and target types, ensure that expr is not a
4879         NullLiteral.
4880
4881         In general, we must not be checking (expr_type ==
4882         target_type) in the top level conversion methods
4883         (ImplicitConversion, ExplicitConversion etc). This checking is
4884         done in the methods that they delegate to.
4885
4886 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
4887
4888         * convert.cs: Move Error_CannotConvertType,
4889         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
4890         ImplicitNumericConversion, ImplicitConversionExists,
4891         ImplicitUserConversionExists, StandardConversionExists,
4892         FindMostEncompassedType, FindMostSpecificSource,
4893         FindMostSpecificTarget, ImplicitUserConversion,
4894         ExplicitUserConversion, GetConversionOperators,
4895         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
4896         TryImplicitIntConversion, Error_CannotConvertImplicit,
4897         ConvertImplicitRequired, ConvertNumericExplicit,
4898         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
4899         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
4900         its own file.
4901
4902         Perform the following renames:
4903
4904         StandardConversionExists -> ImplicitStandardConversionExists
4905         ConvertImplicit -> ImplicitConversion
4906         ConvertImplicitStandard -> ImplicitStandardConversion
4907         TryImplicitIntConversion -> ImplicitIntConversion
4908         ConvertImplicitRequired -> ImplicitConversionRequired
4909         ConvertNumericExplicit -> ExplicitNumericConversion
4910         ConvertReferenceExplicit -> ExplicitReferenceConversion
4911         ConvertExplicit -> ExplicitConversion
4912         ConvertExplicitStandard -> ExplicitStandardConversion
4913
4914 2003-05-19  Martin Baulig  <martin@ximian.com>
4915
4916         * statement.cs (TypeInfo.StructInfo): Made this type protected.
4917         (TypeInfo): Added support for structs having structs as fields.
4918
4919         * ecore.cs (FieldExpr): Implement IVariable.
4920         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
4921         VariableInfo for the field.
4922
4923 2003-05-18  Martin Baulig  <martin@ximian.com>
4924
4925         * expression.cs (This.DoResolve): Report a CS0027 if we're
4926         emitting a field initializer.
4927
4928 2003-05-18  Martin Baulig  <martin@ximian.com>
4929
4930         * expression.cs (This.ResolveBase): New public function.
4931         (This.DoResolve): Check for CS0188.
4932
4933         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
4934         This.Resolve().
4935
4936         * ecore.cs (MethodGroupExpr.DoResolve): Set the
4937         `instance_expression' to null if we don't have any non-static
4938         methods.
4939
4940 2003-05-18  Martin Baulig  <martin@ximian.com>
4941
4942         Reworked the way how local variables and parameters are handled by
4943         the flow analysis code.
4944
4945         * statement.cs (TypeInfo, VariableMap): New public classes.
4946         (VariableInfo): New public class.  This is now responsible for
4947         checking whether a variable has been assigned.  It is used for
4948         parameters and local variables.
4949         (Block.EmitMeta): Take the InternalParameters as argument; compute
4950         the layout of the flow vectors here.
4951         (Block.LocalMap, Block.ParameterMap): New public properties.
4952         (FlowBranching): The .ctor doesn't get the InternalParameters
4953         anymore since Block.EmitMeta() now computes the layout of the flow
4954         vector.
4955         (MyStructInfo): This class is now known as `StructInfo' and nested
4956         in `TypeInfo'; we don't access this directly anymore.
4957
4958         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
4959         property and removed IsAssigned(), IsFieldAssigned(),
4960         SetAssigned() and SetFieldAssigned(); we now call them on the
4961         VariableInfo so we don't need to duplicate this code everywhere.
4962
4963         * expression.cs (ParameterReference): Added `Block block' argument
4964         to the .ctor.
4965         (LocalVariableReference, ParameterReference, This): The new
4966         VariableInfo class is now responsible for all the definite
4967         assignment stuff.
4968
4969         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
4970         IsParameterAssigned, SetParameterAssigned): Removed.
4971
4972 2003-05-18  Martin Baulig  <martin@ximian.com>
4973
4974         * typemanager.cs (InitCoreTypes): Try calling
4975         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
4976         the 3-args-version.  Corlib now also needs our `void_type'.
4977         (GetMethod): Added overloaded version which takes an optional
4978         `bool report_errors' to allow lookups of optional methods.
4979
4980 2003-05-12  Martin Baulig  <martin@ximian.com>
4981
4982         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
4983         only used for locals and not for parameters.
4984
4985 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
4986
4987         * support.cs (InternalParameters.ParameterType): Return the
4988         ExternalType of the parameter.
4989
4990         * parameter.cs (Parameter.ExternalType): drop the two arguments,
4991         they were unused.
4992
4993 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
4994
4995         * class.cs (MethodData.Define): Do not set the `newslot' on
4996         interface members, if they are also flagged as "override".
4997
4998         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
4999         better code for ++i and i++.  This only works for static fields
5000         and local variables.
5001
5002         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
5003         want to pull the DeclSpace out of the builder_to_declspace instead
5004         of the TypeBuilder (like in TypeContainer.FindMembers).
5005
5006         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
5007         instead of LookupTypeContainer.  Fixes the crash on .NET for
5008         looking up interface members.
5009
5010         * const.cs: Create our own emit context during the Definition
5011         stage, so that constants are evaluated in the proper context, when
5012         a recursive definition happens.
5013
5014 2003-05-11  Martin Baulig  <martin@ximian.com>
5015
5016         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
5017         new block for a switch section.
5018         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
5019         the adding/lookup in the switch block.  Fixes #39828.
5020
5021 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
5022
5023         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
5024         functionality: I needed to convert the data after I had performed
5025         the add/sub operation into the operands type size.
5026
5027         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
5028         pass the type for the box operation, otherwise the resulting
5029         object would have been of type object.
5030
5031         (BoxedCast): Add constructor to specify the type to box as.
5032
5033 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
5034
5035         * iterators.cs: I was reusing the `count' variable inadvertently,
5036         take steps to not allow this to happen.
5037
5038 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
5039
5040         * attribute.cs (Attribute.Resolve): Params attributes are encoded
5041         by creating an array at the point where the params starts and
5042         putting all those arguments there, then adjusting the size of the
5043         array.
5044
5045 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
5046
5047         * expression.cs (New.AddressOf): Implement interface
5048         IMemoryLocation.  This is used when the `new' operator is used in
5049         the context of an invocation to a method on a value type.
5050
5051         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
5052         example. 
5053
5054         * namespace.cs: Also check the using aliases here.
5055
5056         * driver.cs: Move the test for using validity after the types have
5057         been entered, so we do a single pass that also includes the using
5058         aliases. 
5059
5060         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
5061         in the regular case.   CreateSiblingForFinally is doing extra
5062         error checking.
5063
5064         * attribute.cs (GetAttributeArgumentExpression): Store the result
5065         on an out value, and use the return value to indicate failure
5066         instead of using null (which is a valid return for Constant.GetValue).
5067
5068         * statement.cs: Perform the analysis flow for the increment
5069         portion after the statement, because this will be the real flow of
5070         execution.  Fixes #42385
5071
5072         * codegen.cs (EmitContext.EmitArgument,
5073         EmitContext.EmitStoreArgument): New helper functions when the
5074         RemapToProxy flag is set.
5075
5076         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
5077         function.
5078
5079         Add support for remapping parameters. 
5080
5081         * iterators.cs: Propagate parameter values;  Store parameter
5082         values in the proxy classes.
5083
5084 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
5085
5086         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
5087         need a proxy reference;  I do not know what I was thinking
5088
5089         * cs-parser.jay (constructor_initializer): catch another error,
5090         and display nice message.
5091
5092         (field_declaration): catch void field declaration
5093         to flag a better error. 
5094
5095         * class.cs (MemberBase.CheckBase): Report an error instead of a
5096         warning if a new protected member is declared in a struct. 
5097         (Field.Define): catch the error of readonly/volatile.
5098
5099         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
5100
5101         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
5102         volatile variable is taken
5103
5104 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
5105
5106         * statement.cs (Fixed.Resolve): Report an error if we are not in
5107         an unsafe context.
5108
5109 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
5110
5111         * typemanager.cs: reuse the code that handles type clashes for
5112         delegates and enumerations.
5113
5114         * class.cs (Report28): Always report.
5115
5116         * expression.cs (EncodeAsAttribute): Allow nulls here.
5117
5118 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
5119
5120         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
5121         the functionality for testing whether an expression is valid for
5122         an attribute here.  Also handle the case of arrays of elements
5123         being stored. 
5124
5125         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
5126         encoding a linear array into an array of objects that are suitable
5127         to be passed to an CustomAttributeBuilder.
5128
5129         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
5130
5131         * ecore.cs: (FieldExpr): Handle field remapping here.
5132
5133         * iteratators.cs: Pass the instance variable (if the method is an
5134         instance method) to the constructors, so we can access the field
5135         variables on the class.
5136
5137         TODO: Test this with structs.  I think the THIS variable on
5138         structs might have to be a pointer, and not a refenrece
5139
5140 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
5141
5142         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
5143         local variables to fields in a proxy class.
5144
5145         * iterators.cs (PopulateProxy): Rename our internal fields to
5146         <XXX>.  
5147         Create a <THIS> field if we are an instance method, so we can
5148         reference our parent container variables.
5149         (MapVariable): Called back from the EmitContext code to enter a
5150         new variable to field mapping into the proxy class (we just create
5151         a FieldBuilder).
5152
5153         * expression.cs
5154         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
5155         for using the remapped locals to fields.
5156
5157         I placed the code here, because that gives the same semantics to
5158         local variables, and only changes the Emit code.
5159
5160         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
5161         statements inside iterators.
5162         (VariableInfo): Add a FieldBuilder for the cases when we are
5163         remapping local variables to fields in a proxy class
5164
5165         * ecore.cs (SimpleNameResolve): Avoid testing two times for
5166         current_block != null.
5167
5168         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
5169         not cope with strings, as it has been moved to the
5170         TableSwitchEmit.  Fixed bug in switch generation.
5171
5172         * expression.cs (New.DoResolve): Provide more context for the user
5173         when reporting an error.
5174
5175         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
5176         pointers. 
5177
5178         * expression.cs (MemberAccess.DoResolve): When we get a type back,
5179         check the permissions for it.  Note than in a type-resolution
5180         context the check was already present in DeclSpace.ResolveType,
5181         but was missing from the MemberAccess.
5182
5183         (ArrayCreation.CheckIndices): warn if the user has
5184         more nested levels of expressions, but there are no more
5185         dimensions specified.  Avoids crash on bug 41906.
5186
5187 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
5188
5189         * statement.cs (Block): replace Implicit bool, for a generic
5190         flags.   
5191         New flag: `Unchecked'.  This is used during the EmitMeta phase
5192         (which is out-of-line with the regular Resolve/Emit process for a
5193         statement, as this is done ahead of time, but still gets a chance
5194         to call constant resolve).
5195
5196         (Block.Flags): new enum for adding a new flag.
5197
5198         (Block.EmitMeta): track the state of unchecked.
5199
5200         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
5201         to enable constant resolution to work there as well.
5202
5203 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
5204
5205         * typemanager.cs (ienumerable_type): Also look up
5206         System.Collections.IEnumerable. 
5207
5208 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
5209
5210         TODO: Test more than one conditional per method.
5211
5212         * class.cs (Indexer.Define): Report the location where the user is
5213         referencing the unsupported feature.
5214
5215         (MethodData): Overload the use of `conditionals' to
5216         minimize the creation of needless ArrayLists.   This saves roughly
5217         212kb on my machine.
5218
5219         (Method): Implement the new IIteratorContainer interface.
5220         (Method.SetYields): Implement the method by setting the ModFlags
5221         to contain METHOD_YIELDS.
5222
5223         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
5224         which just got set to null.
5225
5226         * iterators.cs: New file.
5227
5228         (Yield, YieldBreak): New statements.
5229
5230         * statement.cs (Return.Resolve): Flag an error if we are used in
5231         an iterator method.
5232
5233         * codegen.cs (InIterator): New flag set if the code is being
5234         compiled in an iterator method.
5235
5236         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
5237         internal modifier, and we just use it to avoid adding extra
5238         fields, as this is seldom used.  
5239
5240         * cs-parser.jay: Add yield_statement (yield and yield break).
5241
5242         * driver.cs: New flag -v2 to turn on version 2 features. 
5243
5244         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
5245         hashtable when v2 is enabled.
5246
5247 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
5248
5249         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
5250         there is already a namespace defined with this name.
5251
5252         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
5253         people upgraded their corlibs.
5254
5255         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
5256         always use fully qualified types, no need to use the compiler
5257         front end.
5258
5259         (TypeManager.IsNamespace): Use binarysearch.
5260
5261         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
5262         AddDelegate): I did not quite use the new IsValid API properly: I
5263         have to pass the short-name and the fullname.  I was passing only
5264         the basename instead of the fullname sometimes. 
5265
5266         (TypeContainer.DefineType): call NamespaceClash.
5267
5268         * interface.cs (Interface.DefineType): use NamespaceClash before
5269         defining the type.
5270
5271         * delegate.cs (Delegate.DefineType): use NamespaceClash before
5272         defining the type.
5273
5274         * enum.cs: (Enum.DefineType): use NamespaceClash before
5275         defining the type.
5276
5277         * typemanager.cs (: 3-line patch that gives us some tasty 11%
5278         speed increase.  First, use the negative_hits cache when we get a
5279         negative.  Second, add the type with its full original name
5280         instead of the new . and + encoded name (reflection uses + to
5281         separate type from a nested type).  Use LookupTypeReflection
5282         directly which bypasses the type->name hashtable (that we already
5283         know does not contain the type.
5284
5285         * decl.cs (DeclSpace.ResolveTypeExpr): track the
5286         location/container type. 
5287
5288         * driver.cs: When passing utf8, use directly the UTF8Encoding.
5289
5290 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
5291
5292         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
5293
5294         * delegate.cs (NewDelegate.Resolve): Test whether an instance
5295         method is being referenced in the method group from a static
5296         context, and report error 120 if so.
5297
5298         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
5299         Error118. 
5300
5301         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
5302         is created, we create the A namespace).
5303
5304         * cs-parser.jay: A namespace also introduces a DeclarationFound.
5305         Fixes #41591
5306
5307 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
5308
5309         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
5310         invocation to ModuleBuilder.GetType with the same values will
5311         return a new type instance, so we need to cache its return
5312         values. 
5313
5314         * expression.cs (Binary.ResolveOperator): Only allow the compare
5315         operators on enums if they are of the same type.
5316
5317         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
5318         types of ValueType on their own case.  Before we were giving them
5319         the same treatment as objects.
5320
5321         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
5322         fullname.  Short name is used to compare against container name.
5323         Fullname is used to check against defined namespace names.
5324
5325         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
5326         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
5327
5328         (Method.CheckBase): Call parent.
5329         (MemberBase.CheckBase): Check for protected members on sealed
5330         classes.
5331         (PropertyBase.CheckBase): Call parent.
5332         (Field.Define): Call parent.
5333
5334         * report.cs: Negative error codes are now mapped to 8000 - code,
5335         so that the display is render more nicely.
5336
5337         * typemanager.cs: Do not use try/catch, instead report a regular
5338         error. 
5339
5340         (GetPointerType, GetReferenceType): These methods provide
5341         mechanisms to obtain the T* and T& from a T.  We had the code
5342         previously scattered around the code base, and it also used
5343         TypeManager.LookupType that would go through plenty of caches.
5344         This one goes directly to the type source.
5345
5346         In some places we did the Type.GetType followed by
5347         ModuleBuilder.GetType, but not in others, so this unifies the
5348         processing as well.
5349
5350         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
5351         statements now that we have namespace information.
5352
5353         * typemanager.cs (IsNamespace): New method, returns whether the
5354         string presented is a namespace or not.
5355
5356         (ComputeNamespaces): New public entry point, computes the list of
5357         available namespaces, using the GetNamespaces API call in Mono, or
5358         the slower version in MS.NET.   
5359
5360         Now before we start the semantic analysis phase, we have a
5361         complete list of namespaces including everything that the user has
5362         provided.
5363
5364         Deleted old code to cache namespaces in .nsc files.
5365
5366 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
5367
5368         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
5369         class/struct location definition Location for the implicit
5370         constructor location.
5371
5372         (Operator.Define): Use the location of the operator for the
5373         implicit Method definition.
5374
5375         (Constructor.Emit): use the constructor location for the implicit
5376         base initializer constructor.
5377
5378         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
5379         and the Expression class now contains two new methods:
5380
5381         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
5382         isolate type lookup from the rest of the resolution process.
5383
5384         Since we use Expressions to hold type definitions due to the way
5385         we parse the input we have historically overloaded Resolve to
5386         perform the Type lookups if a special flag is passed.  Now this is
5387         eliminated and two methods take their place. 
5388
5389         The differences in the two methods between xStep and xTerminal is
5390         that xStep is involved in our current lookup system that uses
5391         SimpleNames to compose a name, while xTerminal is used just to
5392         catch the case where the simplename lookup failed.
5393
5394 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
5395
5396         * expression.cs (ResolveMemberAccess): Remove redundant code.
5397         TypeExpr expressions are always born fully resolved.
5398
5399         * interface.cs (PopulateMethod): Do not lookup the types twice.
5400         We were doing it once during SemanticAnalysis and once during
5401         PopulateMethod.
5402
5403         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
5404         in local variable type definitions, were being returned as a
5405         SimpleName (we decomposed everything into a string), that is
5406         because primary_expression was being used instead of a type in the
5407         grammar (reduce/reduce conflicts).
5408
5409         The part that was wrong is that we converted the expression into a
5410         string (an oversimplification in one hand, compounded with primary
5411         expressions doing string concatenation).
5412
5413         So things like:
5414
5415         A.B.C [] x;
5416
5417         Would return "A.B.C[]" as a SimpleName.  This stopped things like
5418         using clauses from working on this particular context.  And a type
5419         was being matched directly against "A.B.C[]".
5420
5421         We now use the correct approach, and allow for ComposedCast to be
5422         part of the unary expression.  So the "A.B.C []" become a composed
5423         cast of "A.B.C" (as a nested group of MemberAccess with a
5424         SimpleName at the end) plus the rank composition "[]". 
5425
5426         Also fixes 35567
5427
5428 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
5429
5430         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
5431         for the access level checking.
5432
5433         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
5434         `TypeContainer container', because I kept getting confused when I
5435         was debugging this code.
5436
5437         * expression.cs (Indexers): Instead of tracking getters/setters,
5438         we now track them in parallel.  We create one arraylist less, but
5439         most importantly it is possible now for the LValue code to find a
5440         matching get for a set.
5441
5442         (IndexerAccess.DoResolveLValue): Update the code.
5443         GetIndexersForType has been modified already to extract all the
5444         indexers from a type.  The code assumed it did not.
5445
5446         Also make the code set the correct return type for the indexer.
5447         This was fixed a long time ago for properties, but was missing for
5448         indexers.  It used to be void_type.
5449
5450         (Binary.Emit): Test first for doubles instead of
5451         floats, as they are more common.
5452
5453         (Binary.EmitBranchable): Use the .un version of the branch opcodes
5454         when dealing with floats and the <=, >= operators.  This fixes bug
5455         #39314 
5456
5457         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
5458         to load the array value by emitting a load on the foreach variable
5459         type.  This was incorrect.  
5460
5461         We now emit the code to load an element using the the array
5462         variable type, and then we emit the conversion operator.
5463
5464         Fixed #40176
5465
5466 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
5467
5468         * attribute.cs: Avoid allocation of ArrayLists in the common case.
5469
5470 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
5471
5472         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
5473         test for protection before we test for signatures. 
5474
5475         (MethodSignature.ToString): implement.
5476
5477         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
5478         to the case where we reduced into a LongConstant.
5479
5480         * decl.cs (CheckAccessLevel): If the type is an array, we can not
5481         depend on whether the information is acurrate, because the
5482         Microsoft runtime will always claim that the array type is public,
5483         regardless of the real state.
5484
5485         If the type is a pointer, another problem happens: the type is
5486         reported as non-public in Microsoft.  
5487
5488         In both cases we have to call CheckAccessLevel recursively with
5489         the underlying type as the argument to be tested.
5490
5491 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
5492
5493         * assign.cs (Assign.Emit): If we are dealing with a compound
5494         assignment expression, we should use the code path that stores the
5495         intermediate result in a temporary value.  This fixes #40903.
5496
5497         *expression.cs (Indirection.ToString): Provide ToString method for
5498         debugging. 
5499
5500 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
5501
5502         * class.cs: Null out fields holding references to Block objects so
5503         they can be garbage collected.
5504
5505         * expression.cs (OverloadResolve): Remove unused local.
5506
5507 2003-04-07  Martin Baulig  <martin@ximian.com>
5508
5509         * codegen.cs (EmitContext.CurrentFile): New public field.
5510         (EmitContext.Mark): Use the CurrentFile to check whether the
5511         location is in the correct file.
5512         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
5513
5514 2003-04-07  Martin Baulig  <martin@ximian.com>
5515
5516         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
5517
5518         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
5519         location.  [FIXME: The location argument which gets passed to this
5520         method is sometimes wrong!]
5521
5522 2003-04-07  Nick Drochak <ndrochak@gol.com>
5523
5524         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
5525
5526 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
5527
5528         * expression.cs (Indirection.EmitAssign): We were using the
5529         temporary, but returning immediately instead of continuing the
5530         EmitAssing flow.
5531
5532 2003-04-06  Martin Baulig  <martin@ximian.com>
5533
5534         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
5535         if it's a nested child, but also deriving from the outer class.
5536         See test 190.cs.
5537
5538         * typemanager.cs (IsNestedChildOf): Make this work if it's a
5539         nested child, but also deriving from the outer class.  See
5540         test-190.cs.
5541         (FilterWithClosure): We may access private members of the outer
5542         class if we're a nested child and deriving from the outer class.
5543         (RealMemberLookup): Only set `closure_private_ok' if the
5544         `original_bf' contained BindingFlags.NonPublic.
5545
5546 2003-04-05  Martin Baulig  <martin@ximian.com>
5547
5548         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
5549
5550 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
5551
5552         * class.cs (Event.Define): Do not allow abstract events to have
5553         initializers. 
5554
5555 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
5556
5557         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
5558         block in event declarations.
5559
5560         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
5561         value type, get its address.
5562
5563         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
5564         leaving a class on the stack instead of a boolean value (int
5565         0/1).  Change the code so we compare against null, and then the
5566         result against zero.
5567
5568         * class.cs (TypeContainer.GetClassBases): We were checking for the
5569         parent class being sealed too late.
5570
5571         * expression.cs (Binary.Emit): For <= and >= when dealing with
5572         floating point values, use cgt.un and clt.un instead of cgt and
5573         clt alone.
5574
5575 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
5576
5577         * statement.cs: Apply the same optimization as MS: skip the 
5578         GetEnumerator returning an IEnumerator, and use the one returning a 
5579         CharEnumerator instead. This allows us to avoid the try-finally block 
5580         and the boxing.
5581
5582 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
5583
5584         * cs-parser.jay: Attributes cannot be applied to
5585                          namespaces. Fixes #40473
5586
5587 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5588
5589         * class.cs:
5590         (Add*): check if the name is valid using the full name for constants,
5591         fields, properties and events.
5592
5593 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
5594
5595         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
5596         char constants to be part of the enumeration.
5597
5598         * expression.cs (Conditional.DoResolve): Add support for operator
5599         true. Implements the missing functionality from 14.12
5600
5601         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
5602         operator true/false as required by the spec.
5603
5604         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
5605         implicit conversion to boolean.
5606
5607         * statement.cs (Statement.ResolveBoolean): A boolean expression is
5608         also one where the type implements `operator true'. 
5609
5610         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
5611         get an expression that will invoke operator true based on an
5612         expression.  
5613
5614         (GetConversionOperators): Removed the hack that called op_True
5615         here.  
5616
5617         (Expression.ResolveBoolean): Move this from Statement.
5618
5619 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
5620
5621         * ecore.cs (FieldExpr): do not allow initialization of initonly
5622         fields on derived classes
5623
5624 2003-03-13  Martin Baulig  <martin@ximian.com>
5625
5626         * statement.cs (Block.Emit): Call ig.BeginScope() and
5627         ig.EndScope() when compiling with debugging info; call
5628         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
5629
5630 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
5631
5632         * expression.cs (Indexers): Do not construct immediately, allow
5633         for new members to be appended as we go.  Fixes 38143
5634
5635 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5636
5637         * expression.cs: save/restore context when resolving an unchecked
5638         expression.
5639
5640 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
5641
5642         * cfold.cs: Catch division by zero in modulus operator during
5643         constant folding.
5644
5645 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
5646
5647         * interface.cs (Interface.DefineMembers): Avoid defining members
5648         twice. 
5649
5650 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
5651
5652         * driver.cs: handle the +/- options for -noconfig
5653
5654         * statement.cs (Unckeched.Resolve): Also track the state of
5655         unchecked in the Resolve phase.
5656
5657 2003-02-27  Martin Baulig  <martin@ximian.com>
5658
5659         * ecore.cs (Expression.MemberLookup): Don't create a
5660         MethodGroupExpr for something which is not a method.  Fixes #38291.
5661
5662 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
5663
5664         * class.cs (MemberBase.CheckParameters): Also check that the type
5665         is unmanaged if it is a pointer.
5666
5667         * expression.cs (SizeOf.Resolve): Add location information.
5668
5669         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
5670         a managed type is declared.
5671
5672         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
5673         parameter modifiers as well.  Fixes bug 38606
5674
5675         * class.cs: Very sad.  Am backing out the speed up changes
5676         introduced by the ArrayList -> Array in the TypeContainer, as they
5677         were not actually that much faster, and introduced a bug (no error
5678         reports on duplicated methods).
5679
5680         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
5681         source first, this will guarantee that we have a valid expression
5682         before calling in lower levels functions that will require a
5683         resolved object.  Then use this original_source in the
5684         target.ResolveLValue instead of the original source that was
5685         passed to us.
5686
5687         Another change.  Use target.Resolve instead of LValueResolve.
5688         Although we are resolving for LValues, we will let the Assign code
5689         take care of that (it will be called again from Resolve).  This
5690         basically allows code like this:
5691
5692         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
5693         class Y { void A (X x) { x [0] += o; }
5694
5695         The problem was that the indexer was trying to resolve for
5696         set_Item (idx, object o) and never finding one.  The real set_Item
5697         was set_Item (idx, X).  By delaying the process we get the right
5698         semantics. 
5699
5700         Fixes bug 36505
5701
5702 2003-02-23  Martin Baulig  <martin@ximian.com>
5703
5704         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
5705         while calling DoEmit ().
5706
5707         * codegen.cs (EmitContext.Mark): Don't mark locations in other
5708         source files; if you use the #line directive inside a method, the
5709         compiler stops emitting line numbers for the debugger until it
5710         reaches the end of the method or another #line directive which
5711         restores the original file.
5712
5713 2003-02-23  Martin Baulig  <martin@ximian.com>
5714
5715         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
5716
5717 2003-02-23  Martin Baulig  <martin@ximian.com>
5718
5719         * statement.cs (Block.AddChildVariableNames): We need to call this
5720         recursively, not just for our immediate children.
5721
5722 2003-02-23  Martin Baulig  <martin@ximian.com>
5723
5724         * class.cs (Event.Define): Always make the field private, like csc does.
5725
5726         * typemanager.cs (TypeManager.RealMemberLookup): Make events
5727         actually work, fixes bug #37521.
5728
5729 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
5730
5731         * delegate.cs: When creating the various temporary "Parameters"
5732         classes, make sure that we call the ComputeAndDefineParameterTypes
5733         on those new parameters (just like we do with the formal ones), to
5734         allow them to be resolved in the context of the DeclSpace.
5735
5736         This fixes the bug that Dick observed in Bugzilla #38530.
5737
5738 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
5739
5740         * expression.cs (ResolveMemberAccess): When resolving a constant,
5741         do not attempt to pull a constant if the value was not able to
5742         generate a valid constant.
5743
5744         * const.cs (LookupConstantValue): Do not report more errors than required.
5745
5746 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5747
5748         * expression.cs: fixes bug #38328.
5749
5750 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
5751
5752         * class.cs: Changed all the various members that can be part of a
5753         class from being an ArrayList to be an Array of the right type.
5754         During the DefineType type_list, interface_list, delegate_list and
5755         enum_list are turned into types, interfaces, delegates and enums
5756         arrays.  
5757
5758         And during the member population, indexer_list, event_list,
5759         constant_list, field_list, instance_constructor_list, method_list,
5760         operator_list and property_list are turned into their real arrays.
5761
5762         Although we could probably perform this operation earlier, for
5763         good error reporting we need to keep the lists and remove the
5764         lists for longer than required.
5765
5766         This optimization was triggered by Paolo profiling the compiler
5767         speed on the output of `gen-sample-program.pl' perl script. 
5768
5769         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
5770         not crash in methods like MemberLookupFailed that use this field.  
5771
5772         This problem arises when the compiler fails to resolve a type
5773         during interface type definition for example.
5774
5775 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
5776
5777         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
5778         inherit from System.Object, so we have to stop at null, not only
5779         when reaching System.Object.
5780
5781 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
5782
5783         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
5784         DeclaredOnly because the parent indexer might have had a different
5785         name, but did not loop until the top of the hierarchy was reached.
5786
5787         The problem this one fixes is 35492: when a class implemented an
5788         indexer from an interface, we were getting the interface method
5789         (which was abstract) and we were flagging an error (can not invoke
5790         abstract method).
5791
5792         This also keeps bug 33089 functioning, and test-148 functioning.
5793
5794         * typemanager.cs (IsSpecialMethod): The correct way of figuring
5795         out if a method is special is to see if it is declared in a
5796         property or event, or whether it is one of the predefined operator
5797         names.   This should fix correctly #36804.
5798
5799 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
5800
5801         The goal here is to remove the dependency on EmptyCast.Peel ().
5802         Killing it completely.
5803
5804         The problem is that currently in a number of places where
5805         constants are expected, we have to "probe" for an EmptyCast, and
5806         Peel, which is not the correct thing to do, as this will be
5807         repetitive and will likely lead to errors. 
5808
5809         The idea is to remove any EmptyCasts that are used in casts that
5810         can be reduced to constants, so we only have to cope with
5811         constants. 
5812
5813         This bug hunt was triggered by Bug 37363 and the desire to remove
5814         the duplicate pattern where we were "peeling" emptycasts to check
5815         whether they were constants.  Now constants will always be
5816         constants.
5817
5818         * ecore.cs: Use an enumconstant here instead of wrapping with
5819         EmptyCast.  
5820
5821         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
5822         throwing me off.  By handling this we can get rid of a few hacks.
5823
5824         * statement.cs (Switch): Removed Peel() code.
5825
5826 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
5827
5828         * class.cs: Location information for error 508
5829
5830         * expression.cs (New.DoResolve): Add a guard against double
5831         resolution of an expression.  
5832
5833         The New DoResolve might be called twice when initializing field
5834         expressions (see EmitFieldInitializers, the call to
5835         GetInitializerExpression will perform a resolve on the expression,
5836         and later the assign will trigger another resolution
5837
5838         This leads to bugs (#37014)
5839
5840         * delegate.cs: The signature for EndInvoke should contain any ref
5841         or out parameters as well.  We were not doing this in the past. 
5842
5843         * class.cs (Field.Define): Do not overwrite the type definition
5844         inside the `volatile' group.  Turns out that volatile enumerations
5845         were changing the type here to perform a validity test, which
5846         broke conversions. 
5847
5848 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
5849
5850         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
5851         and structs, we do not want to load the instance variable
5852
5853         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
5854         enum_type has to be handled like an object reference (implicit
5855         conversions exists from this to object), but the regular IsClass
5856         and IsValueType tests will never return true for this one.
5857
5858         Also we use TypeManager.IsValueType instead of type.IsValueType,
5859         just for consistency with the rest of the code (this is only
5860         needed if we ever use the construct exposed by test-180.cs inside
5861         corlib, which we dont today).
5862
5863 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
5864
5865         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
5866         just InternalCall.
5867
5868 2003-02-09  Martin Baulig  <martin@ximian.com>
5869
5870         * namespace.cs (Namespace..ctor): Added SourceFile argument.
5871         (Namespace.DefineNamespaces): New static public method; this is
5872         called when we're compiling with debugging to add all namespaces
5873         to the symbol file.
5874
5875         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
5876         pass it to the Namespace's .ctor.
5877
5878         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
5879         and MethodBase arguments; pass the namespace ID to the symwriter;
5880         pass the MethodBase instead of the token to the symwriter.
5881         (SymbolWriter.DefineNamespace): New method to add a namespace to
5882         the symbol file.
5883
5884 2003-02-09  Martin Baulig  <martin@ximian.com>
5885
5886         * symbolwriter.cs: New file.  This is a wrapper around
5887         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
5888         methods here in near future.
5889
5890 2003-02-09  Martin Baulig  <martin@ximian.com>
5891
5892         * codegen.cs (EmitContext.Mark): Just pass the arguments to
5893         ILGenerator.MarkSequencePoint() which are actually used by the
5894         symbol writer.
5895
5896 2003-02-09  Martin Baulig  <martin@ximian.com>
5897
5898         * location.cs (SourceFile): New public sealed class.  This
5899         contains the name and an index which is used in the location's token.
5900         (Location): Reserve an appropriate number of bits in the token for
5901         the source file instead of walking over that list, this gives us a
5902         really huge performance improvement when compiling with debugging.
5903
5904         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
5905         `SourceFile' argument instead of a string.
5906         (Driver.ProcessFile): Add all the files via Location.AddFile(),
5907         but don't parse/tokenize here, we need to generate the list of all
5908         source files before we do that.
5909         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
5910         the files.
5911
5912         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
5913         instead of a string.
5914
5915         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
5916         of a string.
5917
5918 2003-02-09  Martin Baulig  <martin@ximian.com>
5919
5920         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
5921         filename on `#line default'.
5922
5923 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
5924
5925         * statement.cs: don't clear the pinned var when the fixed statement
5926         returns from the method (fixes bug#37752).
5927
5928 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
5929
5930         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
5931         to IsValueType.
5932
5933 2003-02-07  Martin Baulig  <martin@ximian.com>
5934
5935         * driver.cs: Removed the `--debug-args' command line argument.
5936
5937         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
5938         automatically by the AsssemblyBuilder.
5939         (CodeGen.InitializeSymbolWriter): We don't need to call any
5940         initialization function on the symbol writer anymore.  This method
5941         doesn't take any arguments.
5942
5943 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
5944
5945         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
5946         from referenced assemblies as well.
5947
5948 2003-02-02  Martin Baulig  <martin@ximian.com>
5949
5950         * class.cs (MethodData.Emit): Generate debugging info for external methods.
5951
5952 2003-02-02  Martin Baulig  <martin@ximian.com>
5953
5954         * class.cs (Constructor.Emit): Open the symbol writer before
5955         emitting the constructor initializer.
5956         (ConstructorInitializer.Emit): Call ec.Mark() to allow
5957         single-stepping through constructor initializers.
5958
5959 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
5960
5961         * class.cs: Handle error 549: do not allow virtual methods in
5962         sealed classes. 
5963
5964 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
5965
5966         * decl.cs: Check access levels when resolving types
5967
5968 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
5969
5970         * statement.cs: Add parameters and locals set in catch blocks that might 
5971         return to set vector
5972
5973 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
5974
5975         * class.cs (Operator): Set the SpecialName flags for operators.
5976
5977         * expression.cs (Invocation.DoResolve): Only block calls to
5978         accessors and operators on SpecialName methods.
5979
5980         (Cast.TryReduce): Handle conversions from char constants.
5981
5982
5983 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
5984
5985         * statement.cs: small memory and time optimization in FlowBranching.
5986
5987 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
5988
5989         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
5990         problem that the last fix but in the other sid (Set).
5991
5992         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
5993         access when there is no indexer in the hierarchy.
5994
5995 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
5996
5997         * class.cs: Combine some if statements.
5998
5999 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6000
6001         * driver.cs: fixed bug #37187.
6002
6003 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
6004
6005         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
6006         any indexer, it's needed to build a list with all the indexers in the
6007         hierarchy (AllGetters), else we have problems. Fixes #35653.
6008
6009 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
6010
6011         * class.cs (MethodData.Define): It is wrong for an interface
6012         implementation to be static in both cases: explicit and implicit.
6013         We were only handling this in one case.
6014
6015         Improve the if situation there to not have negations.
6016
6017         * class.cs (Field.Define): Turns out that we do not need to check
6018         the unsafe bit on field definition, only on usage.  Remove the test.
6019
6020 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6021
6022         * driver.cs: use assembly.Location instead of Codebase (the latest
6023         patch made mcs fail when using MS assemblies).
6024
6025 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
6026
6027         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
6028         get the path to *corlib.dll.
6029
6030 2003-01-21  Nick Drochak <ndrochak@gol.com>
6031
6032         * cs-tokenizer.cs:
6033         * pending.cs:
6034         * typemanager.cs: Remove compiler warnings
6035
6036 2003-01-20  Duncan Mak  <duncan@ximian.com>
6037
6038         * AssemblyInfo.cs: Bump the version number to 0.19.
6039
6040 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6041
6042         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
6043
6044 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
6045
6046         * class.cs (Constructor::Emit): Emit debugging info for constructors.
6047
6048 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
6049
6050         * cs-parser.jay: Small fix: we were not comparing the constructor
6051         name correctly.   Thanks to Zoltan for the initial pointer.
6052
6053 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
6054
6055         * cs-tokenizer.cs: Set file name when specified with #line
6056
6057 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
6058
6059         * cs-parser.jay: Only perform the constructor checks here if we
6060         are named like the class;  This will help provider a better
6061         error.  The constructor path is taken when a type definition is
6062         not found, but most likely the user forgot to add the type, so
6063         report that rather than the constructor error.
6064
6065 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
6066
6067         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
6068         allocations.
6069
6070 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
6071
6072         * cs-parser.jay: Add cleanup call.
6073
6074 2003-01-13  Duncan Mak  <duncan@ximian.com>
6075
6076         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
6077         consistent with other methods.
6078
6079 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
6080
6081         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
6082
6083 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
6084
6085         * attribute.cs: only set GuidAttr to true when we have a
6086         GuidAttribute.
6087
6088 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6089
6090         * ecore.cs:
6091         * expression.cs:
6092         * typemanager.cs: fixes to allow mcs compile corlib with the new
6093         Type.IsSubclassOf fix.
6094
6095 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
6096
6097         * expression.cs (LocalVariableReference.DoResolve): Classify a
6098         constant as a value, not as a variable.   Also, set the type for
6099         the variable.
6100
6101         * cs-parser.jay (fixed_statement): take a type instead of a
6102         pointer_type, so we can produce a better error message later.
6103
6104         * statement.cs (Fixed.Resolve): Flag types that are not pointers
6105         as an error.  
6106
6107         (For.DoEmit): Make inifinite loops have a
6108         non-conditional branch back.
6109
6110         (Fixed.DoEmit): First populate the pinned variables, then emit the
6111         statement, then clear the variables.  Before I was emitting the
6112         code once for each fixed piece.
6113
6114
6115 2003-01-08  Martin Baulig  <martin@ximian.com>
6116
6117         * statement.cs (FlowBranching.MergeChild): A break in a
6118         SWITCH_SECTION does not leave a loop.  Fixes #36155.
6119
6120 2003-01-08  Martin Baulig  <martin@ximian.com>
6121
6122         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
6123         lives in the same number space than `param_map'.  Fixes #36154.
6124
6125 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
6126
6127         * cs-parser.jay (constructor_declaration): Set the
6128         Constructor.ModFlags before probing for it.  This makes the
6129         compiler report 514, 515 and 132 (the code was there, but got
6130         broken). 
6131
6132         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
6133         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
6134         (GotoCase.Resolve): Set `Returns' to ALWAYS.
6135
6136 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
6137
6138         * enum.cs: create the enum static fields using the enum type.
6139
6140 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
6141
6142         * class.cs: don't try to create the ParamBuilder for the return
6143         type if it's not needed (and handle it breaking for the ms runtime
6144         anyway).
6145
6146 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
6147
6148         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
6149
6150 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
6151
6152         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
6153         the command.   This showed up while compiling the JANET source
6154         code, which used \r as its only newline separator.
6155
6156 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
6157
6158         * class.cs (Method.Define): If we are an operator (because it
6159         reuses our code), then set the SpecialName and HideBySig.  #36128
6160
6161 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
6162
6163         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
6164         exception, report error 120 `object reference required'.
6165
6166         * driver.cs: Add --pause option, used during to measure the size
6167         of the process as it goes with --timestamp.
6168
6169         * expression.cs (Invocation.DoResolve): Do not allow methods with
6170         SpecialName to be invoked.
6171
6172 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
6173
6174         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
6175         number before adding it.
6176
6177 2002-12-21  Ravi Pratap  <ravi@ximian.com>
6178
6179         * ecore.cs (StandardImplicitConversion): When in an unsafe
6180         context, we allow conversion between void * to any other pointer
6181         type. This fixes bug #35973.
6182
6183 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
6184
6185         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
6186         is not thrown when extensionless outputs are used 
6187
6188 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6189
6190         * rootcontext.cs: fixed compilation of corlib.
6191
6192 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
6193
6194         * attribute.cs (Attributes.Contains): Add new method.
6195
6196         * class.cs (MethodCore.LabelParameters): if the parameter is an
6197         `out' parameter, check that no attribute `[In]' has been passed.
6198
6199         * enum.cs: Handle the `value__' name in an enumeration.
6200
6201 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
6202
6203         * decl.cs: Added special case to allow overrides on "protected
6204         internal" methods
6205
6206 2002-12-18  Ravi Pratap  <ravi@ximian.com>
6207
6208         * attribute.cs (Attributes.AddAttributeSection): Rename to this
6209         since it makes much more sense.
6210
6211         (Attributes.ctor): Don't require a Location parameter.
6212
6213         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
6214
6215         * attribute.cs (ApplyAttributes): Remove extra Location parameters
6216         since we already have that information per attribute.
6217
6218         * everywhere : make appropriate changes.
6219
6220         * class.cs (LabelParameters): Write the code which actually
6221         applies attributes to the return type. We can't do this on the MS
6222         .NET runtime so we flag a warning in the case an exception is
6223         thrown.
6224
6225 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
6226
6227         * const.cs: Handle implicit null conversions here too.
6228
6229 2002-12-17  Ravi Pratap  <ravi@ximian.com>
6230
6231         * class.cs (MethodCore.LabelParameters): Remove the extra
6232         Type [] parameter since it is completely unnecessary. Instead
6233         pass in the method's attributes so that we can extract
6234         the "return" attribute.
6235
6236 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
6237
6238         * cs-parser.jay (parse): Use Report.Error to flag errors instead
6239         of ignoring it and letting the compile continue.
6240
6241         * typemanager.cs (ChangeType): use an extra argument to return an
6242         error condition instead of throwing an exception.
6243
6244 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
6245
6246         * expression.cs (Unary.TryReduce): mimic the code for the regular
6247         code path.  Perform an implicit cast in the cases where we can
6248         implicitly convert to one of the integral types, and then reduce
6249         based on that constant.   This fixes bug #35483.
6250
6251 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6252
6253         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
6254
6255 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6256
6257         * namespace.cs: fixed bug #35489.
6258
6259 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
6260
6261         * class.cs: Remove some dead code.
6262
6263         * cs-parser.jay: Estimate the number of methods needed
6264         (RootContext.MethodCount);
6265
6266         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
6267         numbers instead of StringBuilders.
6268
6269         * support.cs (PtrHashtable): Add constructor with initial size;
6270         We can now reduce reallocations of the method table.
6271
6272 2002-12-10  Ravi Pratap  <ravi@ximian.com>
6273
6274         * attribute.cs (ApplyAttributes): Keep track of the emitted
6275         attributes on a per-target basis. This fixes bug #35413.
6276
6277 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
6278
6279         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
6280         default to the Windows 1252 encoding.
6281
6282         (UnixParseOption): Support version, thanks to Alp for the missing
6283         pointer. 
6284
6285         * AssemblyInfo.cs: Add nice assembly information.
6286
6287         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
6288         (bug 35169).
6289
6290         * cs-parser.jay: Allow a trailing comma before the close bracked
6291         in the attribute_section production.
6292
6293         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
6294         address of the instance was being taken, I will take this out,
6295         because we take the address of the object immediately here.
6296
6297 2002-12-09  Ravi Pratap  <ravi@ximian.com>
6298
6299         * typemanager.cs (AreMultipleAllowed): Take care of the most
6300         obvious case where attribute type is not in the current assembly -
6301         stupid me ;-)
6302
6303 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
6304
6305         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
6306         definitions, instead of doing that afterwards.  
6307
6308         Also we use a nice little hack, depending on the constructor, we
6309         know if we are a "composed" name or a simple name.  Hence, we
6310         avoid the IndexOf test, and we avoid 
6311
6312         * codegen.cs: Add code to assist in a bug reporter to track down
6313         the source of a compiler crash. 
6314
6315 2002-12-07  Ravi Pratap  <ravi@ximian.com>
6316
6317         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
6318         types have been emitted for a given element and flag an error
6319         if something which does not have AllowMultiple set is used more
6320         than once.
6321
6322         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
6323         attribute types and their corresponding AllowMultiple properties
6324
6325         (AreMultipleAllowed): Check the property for a given type.
6326
6327         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
6328         property in the case we have a TypeContainer.
6329
6330         (Attributes.AddAttribute): Detect duplicates and just skip on
6331         adding them. This trivial fix catches a pretty gross error in our
6332         attribute emission - global attributes were being emitted twice!
6333
6334         Bugzilla bug #33187 is now fixed.
6335
6336 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
6337
6338         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
6339         instead of pp_and).
6340
6341         * expression.cs (Binary.ResolveOperator): I can only use the
6342         Concat (string, string, string) and Concat (string, string,
6343         string, string) if the child is actually a concatenation of
6344         strings. 
6345
6346 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
6347
6348         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
6349         context where we need a 2-character lookahead.
6350
6351         * pending.cs (PendingImplementation): Rework so we can keep track
6352         of interface types all the time, and flag those which were
6353         implemented by parents as optional.
6354
6355 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
6356
6357         * expression.cs (Binary.ResolveOperator): Use
6358         String.Concat(string,string,string) or
6359         String.Concat(string,string,string,string) when possible. 
6360
6361         * typemanager: More helper methods.
6362
6363
6364 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
6365
6366         * pending.cs: remove the bogus return from GetMissingInterfaces()
6367         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
6368
6369 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6370
6371         * namespace.cs: avoid duplicated 'using xxx' being added to
6372         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
6373         when we get more than one 'using' statement for the same namespace.
6374         Report a CS0105 warning for it.
6375
6376 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
6377
6378         * cs-tokenizer.cs (consume_identifier): use read directly, instead
6379         of calling getChar/putback, uses internal knowledge of it.    
6380
6381         (xtoken): Reorder tokenizer so most common patterns are checked
6382         first.  This reduces the compilation time in another 5% (from 8.11s
6383         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
6384
6385         The parsing time is 22% of the compilation in mcs, and from that
6386         64% is spent on the tokenization process.  
6387
6388         I tried using a binary search for keywords, but this is slower
6389         than the hashtable.  Another option would be to do a couple of
6390         things:
6391
6392                 * Not use a StringBuilder, instead use an array of chars,
6393                   with a set value.  Notice that this way we could catch
6394                   the 645 error without having to do it *afterwards*.
6395
6396                 * We could write a hand-parser to avoid the hashtable
6397                   compares altogether.
6398
6399         The identifier consumption process takes 37% of the tokenization
6400         time.  Another 15% is spent on is_number.  56% of the time spent
6401         on is_number is spent on Int64.Parse:
6402
6403                 * We could probably choose based on the string length to
6404                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
6405                   computations. 
6406
6407         Another 3% is spend on wrapping `xtoken' in the `token' function.
6408
6409         Handle 0xa0 as whitespace (#34752)
6410
6411 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
6412
6413         * typemanager.cs (IsCLRType): New routine to tell whether a type
6414         is one of the builtin types.  
6415
6416         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
6417         typecode in more places instead of doing pointer comparissions.
6418         We could leverage some knowledge about the way the typecodes are
6419         laid out.
6420
6421         New code to cache namespaces in assemblies, it is currently not
6422         invoked, to be used soon.
6423
6424         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
6425
6426         * expression.cs (Binary.ResolveOperator): specially handle
6427         strings, and do not perform user-defined operator overloading for
6428         built-in types.
6429
6430 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
6431
6432         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
6433         internalcall as it is a pretty simple operation;  Avoid whenever
6434         possible to call Char.IsLetter.
6435
6436         (consume_identifier): Cut by half the number of
6437         hashtable calls by merging the is_keyword and GetKeyword behavior.
6438
6439         Do not short-circuit, because if we do, we
6440         report errors (ie, #if false && true would produce an invalid
6441         directive error);
6442
6443
6444 2002-11-24  Martin Baulig  <martin@ximian.com>
6445
6446         * expression.cs (Cast.TryReduce): If we're in checked syntax,
6447         check constant ranges and report a CS0221.  Fixes #33186.
6448
6449 2002-11-24  Martin Baulig  <martin@ximian.com>
6450
6451         * cs-parser.jay: Make this work for uninitialized variable
6452         declarations in the `for' initializer.  Fixes #32416.
6453
6454 2002-11-24  Martin Baulig  <martin@ximian.com>
6455
6456         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
6457         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
6458
6459 2002-11-24  Martin Baulig  <martin@ximian.com>
6460
6461         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
6462         argument; if true, we also check for user-defined conversions.
6463         This is only needed if both arguments are of a user-defined type.
6464         Fixes #30443, added test-175.cs.
6465         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
6466
6467         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
6468
6469 2002-11-24  Martin Baulig  <martin@ximian.com>
6470
6471         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
6472         function to get the store opcode.
6473         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
6474         only emit the Ldelema if the store opcode is Stobj.  You must run
6475         both test-34 and test-167 to test this.  Fixes #34529.
6476
6477 2002-11-23  Martin Baulig  <martin@ximian.com>
6478
6479         * ecore.cs (Expression.MemberLookup): Added additional
6480         `qualifier_type' argument which is used when we're being called
6481         from MemberAccess.DoResolve() and null if we're called from a
6482         SimpleName lookup.
6483         (Expression.MemberLookupFailed): New method to report errors; this
6484         does the CS1540 check and reports the correct error message.
6485
6486         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
6487         argument for the CS1540 check and redone the way how we're dealing
6488         with private members.  See the comment in the source code for details.
6489         (FilterWithClosure): Reverted this back to revision 1.197; renamed
6490         `closure_start_type' to `closure_qualifier_type' and check whether
6491         it's not null.  It was not this filter being broken, it was just
6492         being called with the wrong arguments.
6493
6494         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
6495         and pass it the correct `qualifier_type'; this also does the error
6496         handling for us.
6497
6498 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
6499
6500         * expression.cs (Invocation.EmitParams): If the we are dealing
6501         with a non-built-in value type, load its address as well.
6502
6503         (ArrayCreation): Use a a pretty constant instead
6504         of the hardcoded value 2.   Use 6 instead of 2 for the number of
6505         static initializers.  
6506
6507         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
6508         because they are not really value types, just glorified integers. 
6509
6510         * driver.cs: Do not append .exe, the CSC compiler does not do it.
6511
6512         * ecore.cs: Remove redundant code for enumerations, make them use
6513         the same code path as everything else, fixes the casting issue
6514         with enumerations in Windows.Forms.
6515
6516         * attribute.cs: Do only cast to string if it is a string, the
6517         validation happens later.
6518
6519         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
6520         people upgrade their corlibs.
6521
6522         * ecore.cs: Oops, enumerations were not following the entire code path
6523
6524 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
6525
6526         * typemanager.cs (FilterWithClosure): Commented out the test for
6527         1540 in typemanager.cs, as it has problems when accessing
6528         protected methods from a parent class (see test-174.cs). 
6529
6530         * attribute.cs (Attribute.ValidateGuid): new method.
6531         (Attribute.Resolve): Use above.
6532
6533 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
6534
6535         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
6536
6537         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
6538         handling for enumerations, as we only needed the TypeContainer
6539         functionality to begin with (this is required for the fix below to
6540         work for enums that reference constants in a container class for
6541         example). 
6542
6543         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
6544
6545         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
6546         a valid TypeBuilder to perform lookups on.o
6547
6548         * class.cs (InheritableMemberSignatureCompare): Use true in the
6549         call to GetGetMethod and GetSetMethod, because we are comparing
6550         the signature, and we need to get the methods *even* if they are
6551         private. 
6552
6553         (PropertyBase.CheckBase): ditto.
6554
6555         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
6556         GotoCase.Resolve): Use Peel on EmpytCasts.
6557
6558         * ecore.cs (EmptyCast): drop child, add Peel method.
6559
6560 2002-11-17  Martin Baulig  <martin@ximian.com>
6561
6562         * ecore.cs (EmptyCast.Child): New public property.
6563
6564         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
6565         label resolved to an EmptyCast.  Fixes #34162.
6566         (GotoCase.Resolve): Likewise.
6567         (Block.EmitMeta): Likewise.
6568
6569 2002-11-17  Martin Baulig  <martin@ximian.com>
6570
6571         * expression.cs (Invocation.BetterConversion): Prefer int over
6572         uint; short over ushort; long over ulong for integer literals.
6573         Use ImplicitConversionExists instead of StandardConversionExists
6574         since we also need to check for user-defined implicit conversions.
6575         Fixes #34165.  Added test-173.cs.
6576
6577 2002-11-16  Martin Baulig  <martin@ximian.com>
6578
6579         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
6580         with the `true' and `false' literals.  Fixes #33151.
6581
6582 2002-11-16  Martin Baulig  <martin@ximian.com>
6583
6584         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
6585         October 22nd; don't do the cs1540 check for static members.
6586
6587         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
6588         now using our own filter here and doing the cs1540 check again.
6589
6590 2002-11-16  Martin Baulig  <martin@ximian.com>
6591
6592         * support.cs (InternalParameters): Don't crash if we don't have
6593         any fixed parameters.  Fixes #33532.
6594
6595 2002-11-16  Martin Baulig  <martin@ximian.com>
6596
6597         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
6598         when looking up static methods to make this work on Windows.
6599         Fixes #33773.
6600
6601 2002-11-16  Martin Baulig  <martin@ximian.com>
6602
6603         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
6604         a setter rather than using PropertyInfo.CanWrite.
6605
6606 2002-11-15  Nick Drochak  <ndrochak@gol.com>
6607
6608         * class.cs: Allow acces to block member by subclasses. Fixes build
6609         breaker.
6610
6611 2002-11-14  Martin Baulig  <martin@ximian.com>
6612
6613         * class.cs (Constructor.Emit): Added the extern/block check.
6614         Fixes bug #33678.
6615
6616 2002-11-14  Martin Baulig  <martin@ximian.com>
6617
6618         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
6619         iteration while looking for indexers, this is needed because the
6620         indexer may have a different name in our base classes.  Fixed the
6621         error reporting (no indexers at all, not get accessor, no
6622         overloaded match).  Fixes bug #33089.
6623         (IndexerAccess.DoResolveLValue): Likewise.
6624
6625 2002-11-14  Martin Baulig  <martin@ximian.com>
6626
6627         * class.cs (PropertyBase.CheckBase): Make this work for multiple
6628         indexers.  Fixes the first part of bug #33089.
6629         (MethodSignature.InheritableMemberSignatureCompare): Added support
6630         for properties.
6631
6632 2002-11-13  Ravi Pratap  <ravi@ximian.com>
6633
6634         * attribute.cs (Attribute.Resolve): Catch the
6635         NullReferenceException and report it since it isn't supposed to
6636         happen. 
6637
6638 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
6639
6640         * expression.cs (Binary.EmitBranchable): Also handle the cases for
6641         LogicalOr and LogicalAnd that can benefit from recursively
6642         handling EmitBranchable.  The code now should be nice for Paolo.
6643
6644 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
6645
6646         * typemanager.cs (LookupType): Added a negative-hit hashtable for
6647         the Type lookups, as we perform quite a number of lookups on
6648         non-Types.  This can be removed once we can deterministically tell
6649         whether we have a type or a namespace in advance.
6650
6651         But this might require special hacks from our corlib.
6652
6653         * TODO: updated.
6654
6655         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
6656         and double which avoids a conversion from an integer to a double.
6657
6658         * expression.cs: tiny optimization, avoid calling IsConstant,
6659         because it effectively performs the lookup twice.
6660
6661 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
6662
6663         But a bogus return here to keep the semantics of the old code
6664         until the Mono runtime is fixed.
6665
6666         * pending.cs (GetMissingInterfaces): New method used to remove all
6667         the interfaces that are already implemented by our parent
6668         classes from the list of pending methods. 
6669
6670         * interface.cs: Add checks for calls after ResolveTypeExpr.
6671
6672 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
6673
6674         * class.cs (Class.Emit): Report warning 67: event not used if the
6675         warning level is beyond 3.
6676
6677         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
6678         being a NullLiteral.
6679
6680         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
6681         specifiers. 
6682
6683         * class.cs (TypeContainer.GetClassBases): Cover a missing code
6684         path that might fail if a type can not be resolved.
6685
6686         * expression.cs (Binary.Emit): Emit unsigned versions of the
6687         operators. 
6688
6689         * driver.cs: use error 5.
6690
6691 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
6692
6693         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
6694
6695 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
6696
6697         * cs-parser.jay (switch_section): A beautiful patch from Martin
6698         Baulig that fixed 33094.
6699
6700 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
6701
6702         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
6703         Check whether the base is abstract and report an error if so.
6704
6705         * expression.cs (IndexerAccess.DoResolveLValue,
6706         IndexerAccess.DoResolve): ditto. 
6707
6708         (Invocation.DoResolve): ditto.
6709
6710         (Invocation.FullMethodDesc): Improve the report string.
6711
6712         * statement.cs (Block): Eliminate IsVariableDefined as it is
6713         basically just a wrapper for GetVariableInfo.
6714
6715         * ecore.cs (SimpleName): Use new 
6716
6717         * support.cs (ReflectionParamter.ParameterType): We unwrap the
6718         type, as we return the actual parameter ref/unref state on a
6719         different call.
6720
6721 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
6722
6723         * support.cs: Return proper flags REF/OUT fixing the previous
6724         commit.  
6725
6726         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
6727         not used to mean `ref' but `ref or out' in ParameterReference
6728
6729         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
6730         full type signature instead of calling TypeManger.CSharpName
6731         ourselves. 
6732
6733         * support.cs (InternalParameters.ParameterDesc): Do not compare
6734         directly to the modflags, because REF/OUT will actually be bitsets
6735         if set. 
6736
6737         * delegate.cs (VerifyMethod): Check also the modifiers.
6738
6739         * cs-tokenizer.cs: Fix bug where floating point values with an
6740         exponent where a sign was missing was ignored.
6741
6742         * driver.cs: Allow multiple assemblies to be specified in a single
6743         /r: argument
6744
6745 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
6746
6747         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
6748         because identifiers after a parenthesis would end up in this kind
6749         of production, and we needed to desamiguate it for having casts
6750         like:
6751
6752                 (UserDefinedType *) xxx
6753
6754 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
6755
6756         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
6757         we should set on the Bindingflags.NonPublic, but not turn on
6758         private_ok.  private_ok controls whether a Private member is
6759         returned (this is chekced on the filter routine), while the
6760         BindingFlags.NonPublic just controls whether private/protected
6761         will be allowed.   This fixes the problem part of the problem of
6762         private properties being allowed to be used in derived classes.
6763
6764         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
6765         so we can call the children DoResolveLValue method (this will
6766         properly signal errors on lvalue assignments to base properties)
6767
6768         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
6769         getter are null, and we have a property info, we know that this
6770         happened because the lookup failed, so we report an error 122 for
6771         protection level violation.
6772
6773         We also silently return if setter and getter are null in the
6774         resolve functions, this condition only happens if we have flagged
6775         the error before.  This is the other half of the problem. 
6776
6777         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
6778         not have accessibility information, that is why we were returning
6779         true in the filter function in typemanager.cs.
6780
6781         To properly report 122 (property is inaccessible because of its
6782         protection level) correctly, we report this error in ResolveAccess
6783         by failing if both the setter and the getter are lacking (ie, the
6784         lookup failed). 
6785
6786         DoResolve and DoLResolve have been modified to check for both
6787         setter/getter being null and returning silently, the reason being
6788         that I did not want to put the knowledge about this error in upper
6789         layers, like:
6790
6791         int old = Report.Errors;
6792         x = new PropertyExpr (...);
6793         if (old != Report.Errors)
6794                 return null;
6795         else
6796                 return x;
6797
6798         So the property expr is returned, but it is invalid, so the error
6799         will be flagged during the resolve process. 
6800
6801         * class.cs: Remove InheritablePropertySignatureCompare from the
6802         class, as we no longer depend on the property signature to compute
6803         whether it is possible to implement a method or not.
6804
6805         The reason is that calling PropertyInfo.GetGetMethod will return
6806         null (in .NET, in Mono it works, and we should change this), in
6807         cases where the Get Method does not exist in that particular
6808         class.
6809
6810         So this code:
6811
6812         class X { public virtual int A { get { return 1; } } }
6813         class Y : X { }
6814         class Z : Y { public override int A { get { return 2; } } }
6815
6816         Would fail in Z because the parent (Y) would not have the property
6817         defined.  So we avoid this completely now (because the alternative
6818         fix was ugly and slow), and we now depend exclusively on the
6819         method names.
6820
6821         (PropertyBase.CheckBase): Use a method-base mechanism to find our
6822         reference method, instead of using the property.
6823
6824         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
6825         routines are gone now.
6826
6827         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
6828         names, they were incorrectly named.
6829
6830         * cs-tokenizer.cs: Return are more gentle token on failure. 
6831
6832         * pending.cs (PendingImplementation.InterfaceMethod): This routine
6833         had an out-of-sync index variable, which caused it to remove from
6834         the list of pending methods the wrong method sometimes.
6835
6836 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
6837
6838         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
6839         CanWrite, because those refer to this particular instance of the
6840         property, and do not take into account the fact that we can
6841         override single members of a property.
6842
6843         Constructor requires an EmitContext.  The resolution process does
6844         not happen here, but we need to compute the accessors before,
6845         because the resolution does not always happen for properties.
6846
6847         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
6848         subclass, before we did not update this flag, but we did update
6849         bindingflags. 
6850
6851         (GetAccessors): Drop this routine, as it did not work in the
6852         presence of partially overwritten set/get methods. 
6853
6854         Notice that this broke the cs1540 detection, but that will require
6855         more thinking. 
6856
6857 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6858
6859         * class.cs:
6860         * codegen.cs:
6861         * driver.cs: issue a warning instead of an error if we don't support
6862         debugging for the platform. Also ignore a couple of errors that may
6863         arise when trying to write the symbols. Undo my previous patch.
6864
6865 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6866
6867         * driver.cs: ignore /debug switch except for Unix platforms.
6868
6869 2002-10-23  Nick Drochak  <ndrochak@gol.com>
6870
6871         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
6872
6873 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
6874
6875         * driver.cs: Do not make mcs-debug conditional, so we do not break
6876         builds that use it.
6877
6878         * statement.cs (UsageVector.MergeChildren): I would like Martin to
6879         review this patch.  But basically after all the children variables
6880         have been merged, the value of "Breaks" was not being set to
6881         new_breaks for Switch blocks.  I think that it should be set after
6882         it has executed.  Currently I set this to the value of new_breaks,
6883         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
6884         conservative, but I do not understand this code very well.
6885
6886         I did not break anything in the build, so that is good ;-)
6887
6888         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
6889
6890 2002-10-20  Mark Crichton  <crichton@gimp.org>
6891
6892         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
6893
6894 2002-10-20  Nick Drochak  <ndrochak@gol.com>
6895
6896         * cfold.cs: Fixed compile blocker.
6897
6898 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
6899
6900         * driver.cs: I was chekcing the key, not the file.
6901
6902 2002-10-19  Ravi Pratap  <ravi@ximian.com>
6903
6904         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
6905         message that we were generating - we just need to silently return
6906         a null.
6907
6908 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
6909
6910         * class.cs (Event.Define): Change my previous commit, as this
6911         breaks the debugger.  This is a temporary hack, as it seems like
6912         the compiler is generating events incorrectly to begin with.
6913
6914         * expression.cs (Binary.ResolveOperator): Added support for 
6915         "U operator - (E x, E y)"
6916
6917         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
6918         y)".
6919
6920         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
6921         init-only variables, but this path did not take into account that
6922         there might be also instance readonly variables.  Correct this
6923         problem. 
6924
6925         This fixes bug 32253
6926
6927         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
6928         delegates as well.
6929
6930         * driver.cs: Change the extension for modules to `netmodule'
6931
6932         * cs-parser.jay: Improved slightly the location tracking for
6933         the debugger symbols.
6934
6935         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
6936         modifiers that were specified instead of the hardcoded value
6937         (FamAndAssem).  This was basically ignoring the static modifier,
6938         and others.  Fixes 32429.
6939
6940         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
6941         fixed a bug in the process (32476)
6942
6943         * expression.cs (ArrayAccess.EmitAssign): Patch from
6944         hwang_rob@yahoo.ca that fixes bug 31834.3
6945
6946 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
6947
6948         * driver.cs: Make the module extension .netmodule.
6949
6950 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
6951
6952         * driver.cs: Report an error if the resource file is not found
6953         instead of crashing.
6954
6955         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
6956         false, like Emit does.
6957
6958 2002-10-16  Nick Drochak  <ndrochak@gol.com>
6959
6960         * typemanager.cs: Remove unused private member.  Also reported mcs
6961         bug to report this as a warning like csc.
6962
6963 2002-10-15  Martin Baulig  <martin@gnome.org>
6964
6965         * statement.cs (Statement.Emit): Made this a virtual method; emits
6966         the line number info and calls DoEmit().
6967         (Statement.DoEmit): New protected abstract method, formerly knows
6968         as Statement.Emit().
6969
6970         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
6971
6972 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
6973
6974         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
6975         have fixed a remaining problem: not every AddXXXX was adding a
6976         fully qualified name.  
6977
6978         Now everyone registers a fully qualified name in the DeclSpace as
6979         being defined instead of the partial name.  
6980
6981         Downsides: we are slower than we need to be due to the excess
6982         copies and the names being registered this way.  
6983
6984         The reason for this is that we currently depend (on the corlib
6985         bootstrap for instance) that types are fully qualified, because
6986         we dump all the types in the namespace, and we should really have
6987         types inserted into the proper namespace, so we can only store the
6988         basenames in the defined_names array.
6989
6990 2002-10-10  Martin Baulig  <martin@gnome.org>
6991
6992         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
6993         from bug #31834, see the bug report for a testcase which is
6994         miscompiled.
6995
6996 2002-10-10  Martin Baulig  <martin@gnome.org>
6997
6998         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
6999         flow analysis code for this.
7000
7001         * statement.cs (Do, While, For): Tell the flow analysis code about
7002         infinite loops.
7003         (FlowBranching.UsageVector): Added support for infinite loops.
7004         (Block.Resolve): Moved the dead code elimination here and use flow
7005         analysis to do it.
7006
7007 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
7008
7009         * class.cs (Field.Define): Catch cycles on struct type
7010         definitions. 
7011
7012         * typemanager.cs (IsUnmanagedtype): Do not recursively check
7013         fields if the fields are static.  We only need to check instance
7014         fields. 
7015
7016         * expression.cs (As.DoResolve): Test for reference type.
7017
7018         * statement.cs (Using.ResolveExpression): Use
7019         ConvertImplicitRequired, not ConvertImplicit which reports an
7020         error on failture
7021         (Using.ResolveLocalVariableDecls): ditto.
7022
7023         * expression.cs (Binary.ResolveOperator): Report errors in a few
7024         places where we had to.
7025
7026         * typemanager.cs (IsUnmanagedtype): Finish implementation.
7027
7028 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
7029
7030         * expression.cs: Use StoreFromPtr instead of extracting the type
7031         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
7032
7033         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
7034         an enumeration value to a System.Enum, but System.Enum is not a
7035         value type, but an class type, so we need to box.
7036
7037         (Expression.ConvertExplicit): One codepath could return
7038         errors but not flag them.  Fix this.  Fixes #31853
7039
7040         * parameter.cs (Resolve): Do not allow void as a parameter type.
7041
7042 2002-10-06  Martin Baulig  <martin@gnome.org>
7043
7044         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
7045         if it's a class type and not a struct.  Fixes #31815.
7046
7047 2002-10-06  Martin Baulig  <martin@gnome.org>
7048
7049         * statement.cs: Reworked the flow analysis code a bit to make it
7050         usable for dead code elimination.
7051
7052 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7053
7054         * cs-parser.jay: allow empty source files. Fixes bug #31781.
7055
7056 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
7057
7058         * expression.cs (ComposedCast.DoResolveType): A quick workaround
7059         to fix the test 165, will investigate deeper.
7060
7061 2002-10-04  Martin Baulig  <martin@gnome.org>
7062
7063         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
7064         finally blocks actually work.
7065         (Try.Resolve): We don't need to create a sibling for `finally' if
7066         there is no finally block.
7067
7068 2002-10-04  Martin Baulig  <martin@gnome.org>
7069
7070         * class.cs (Constructor.Define): The default accessibility for a
7071         non-default constructor is private, not public.
7072
7073 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
7074
7075         * class.cs (Constructor): Make AllowedModifiers public, add
7076         EXTERN.
7077
7078         * cs-parser.jay: Perform the modifiers test here, as the
7079         constructor for the Constructor class usually receives a zero
7080         because of the way we create it (first we create, later we
7081         customize, and we were never checking the modifiers).
7082
7083         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
7084         is a version of LookupTypeReflection that includes the type-name
7085         cache.  This can be used as a fast path for functions that know
7086         the fully qualified name and are only calling into *.GetType() to
7087         obtain a composed type.
7088
7089         This is also used by TypeManager.LookupType during its type
7090         composition.
7091
7092         (LookupType): We now also track the real type name, as sometimes
7093         we can get a quey for the real type name from things like
7094         ComposedCast.  This fixes bug 31422.
7095
7096         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
7097         complete type fullname, it does not have to go through the type
7098         resolution system to obtain the composed version of the type (for
7099         obtaining arrays or pointers).
7100
7101         (Conditional.Emit): Use the EmitBoolExpression to
7102         generate nicer code, as requested by Paolo.
7103
7104         (ArrayCreation.CheckIndices): Use the patch from
7105         hwang_rob@yahoo.ca to validate the array initializers. 
7106
7107 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
7108
7109         * class.cs (ConstructorInitializer.Emit): simplify code by using
7110         Invocation.EmitCall, and at the same time, fix the bugs in calling
7111         parent constructors that took variable arguments. 
7112
7113         * ecore.cs (Expression.ConvertNumericExplicit,
7114         Expression.ImplicitNumericConversion): Remove the code that
7115         manually wrapped decimal (InternalTypeConstructor call is now gone
7116         as well).
7117
7118         * expression.cs (Cast.TryReduce): Also handle decimal types when
7119         trying to perform a constant fold on the type.
7120
7121         * typemanager.cs (IsUnmanagedtype): Partially implemented.
7122
7123         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
7124         that only turned off an error report, and did nothing else. 
7125
7126 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
7127
7128         * driver.cs: Handle and ignore /fullpaths
7129
7130 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
7131
7132         * expression.cs (Binary.ResolveOperator): Catch the case where
7133         DoNumericPromotions returns true, 
7134
7135         (Binary.DoNumericPromotions): Simplify the code, and the tests.
7136
7137 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
7138
7139         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
7140         report error 70.
7141
7142 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
7143
7144         * ecore.cs (ConvertNumericExplicit): It is not enough that the
7145         conversion exists, but it is also required that the conversion be
7146         performed.  This manifested in "(Type64Enum) 2".  
7147
7148         * class.cs (TypeManager.AddMethod): The fix is not to change
7149         AddEnum, because that one was using a fully qualified name (every
7150         DeclSpace derivative does), but to change the AddMethod routine
7151         that was using an un-namespaced name.  This now correctly reports
7152         the duplicated name.
7153
7154         Revert patch until I can properly fix it.  The issue
7155         is that we have a shared Type space across all namespaces
7156         currently, which is wrong.
7157
7158         Options include making the Namespace a DeclSpace, and merge
7159         current_namespace/current_container in the parser.
7160
7161 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
7162
7163         * cs-parser.jay: Improve error reporting when we get a different
7164         kind of expression in local_variable_type and
7165         local_variable_pointer_type. 
7166
7167         Propagate this to avoid missleading errors being reported.
7168
7169         * ecore.cs (ImplicitReferenceConversion): treat
7170         TypeManager.value_type as a target just like object_type.   As
7171         code like this:
7172
7173         ValueType v = 1;
7174
7175         Is valid, and needs to result in the int 1 being boxed before it
7176         is assigned to the value type v.
7177
7178         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
7179         to validate the enumeration name.
7180
7181         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
7182         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
7183         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
7184
7185         * ecore.cs (TryImplicitIntConversion): When doing an
7186         implicit-enumeration-conversion, check if the type is 64-bits and
7187         perform a conversion before passing to EnumConstant.
7188
7189 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
7190
7191         * decl.cs (Error_AmbiguousTypeReference); New routine used to
7192         report ambiguous type references.  Unlike the MS version, we
7193         report what the ambiguity is.   Innovation at work ;-)
7194
7195         (DeclSpace.FindType): Require a location argument to
7196         display when we display an ambiguous error.
7197
7198         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
7199
7200         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
7201
7202         * expression.cs (EmitDynamicInitializers): Apply patch from
7203         hwang_rob@yahoo.ca that fixes the order in which we emit our
7204         initializers. 
7205
7206 2002-09-21  Martin Baulig  <martin@gnome.org>
7207
7208         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
7209         delegate takes no arguments.
7210
7211 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
7212
7213         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
7214         from integers.
7215
7216         * expression.cs: Extract the underlying type.
7217
7218         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
7219
7220         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
7221
7222 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
7223
7224         * class.cs (TypeContainer.DefineType): We can not use the nice
7225         PackingSize with the size set to 1 DefineType method, because it
7226         will not allow us to define the interfaces that the struct
7227         implements.
7228
7229         This completes the fixing of bug 27287
7230
7231         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
7232         means also structs.  This fixes part of the problem. 
7233         (Expresion.ImplicitReferenceConversionExists): ditto.
7234
7235         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
7236         error if there were no errors reported during the type lookup
7237         process, to avoid duplicates or redundant errors.  Without this
7238         you would get an ambiguous errors plus a type not found.  We have
7239         beaten the user enough with the first error.  
7240
7241         (DeclSparce.FindType): Emit a warning if we have an ambiguous
7242         reference. 
7243
7244         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
7245         during the resolution process, stop the lookup, this avoids
7246         repeated error reports (same error twice).
7247
7248         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
7249
7250         * typemanager.cs (LookupType): Redo the type lookup code to match
7251         the needs of System.Reflection.  
7252
7253         The issue is that System.Reflection requires references to nested
7254         types to begin with a "+" sign instead of a dot.  So toplevel
7255         types look like: "NameSpace.TopLevelClass", and nested ones look
7256         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
7257         levels. 
7258
7259 2002-09-19  Martin Baulig  <martin@gnome.org>
7260
7261         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
7262         says that a method always returns or always throws an exception,
7263         don't report the CS0161.
7264
7265         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
7266         set `Returns = new_returns'.
7267
7268 2002-09-19  Martin Baulig  <martin@gnome.org>
7269
7270         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
7271         to an enum constant, check for a CS0176.
7272
7273 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
7274
7275         * class.cs (TypeContainer.CheckPairedOperators): Now we check
7276         for operators that must be in pairs and report errors.
7277
7278         * ecore.cs (SimpleName.DoResolveType): During the initial type
7279         resolution process, when we define types recursively, we must
7280         check first for types in our current scope before we perform
7281         lookups in the enclosing scopes.
7282
7283         * expression.cs (MakeByteBlob): Handle Decimal blobs.
7284
7285         (Invocation.VerifyArgumentsCompat): Call
7286         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
7287         I thought we were supposed to always call this, but there are a
7288         few places in the code where we dont do it.
7289
7290 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
7291
7292         * driver.cs: Add support in -linkres and -resource to specify the
7293         name of the identifier.
7294
7295 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
7296
7297         * ecore.cs (StandardConversionExists): Sync with the conversion
7298         code: allow anything-* to void* conversions.
7299
7300         (FindMostSpecificSource): Use an Expression argument
7301         instead of a Type, because we might be handed over a Literal which
7302         gets a few more implicit conversions that plain types do not.  So
7303         this information was being lost.
7304
7305         Also, we drop the temporary type-holder expression when not
7306         required.
7307
7308 2002-09-17  Martin Baulig  <martin@gnome.org>
7309
7310         * class.cs (PropertyBase.CheckBase): Don't check the base class if
7311         this is an explicit interface implementation.
7312
7313 2002-09-17  Martin Baulig  <martin@gnome.org>
7314
7315         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
7316         different `IndexerName' attributes.
7317
7318         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
7319         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
7320         virtual CommonResolve().
7321
7322 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
7323
7324         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
7325         and convert that to the UnderlyingType.
7326
7327         * statement.cs (Foreach.Resolve): Indexers are just like variables
7328         or PropertyAccesses.
7329
7330         * cs-tokenizer.cs (consume_string): Track line numbers and columns
7331         inside quoted strings, we were not doing this before.
7332
7333 2002-09-16  Martin Baulig  <martin@gnome.org>
7334
7335         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
7336         resolve it.  This is needed for the definite assignment check of the
7337         instance expression, fixes bug #29846.
7338         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
7339
7340 2002-09-16  Nick Drochak  <ndrochak@gol.com>
7341
7342         * parameter.cs: Fix compile error.  Cannot reference static member
7343         from an instance object.  Is this an mcs bug?
7344
7345 2002-09-14  Martin Baulig  <martin@gnome.org>
7346
7347         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
7348         multiple times.  Fixes bug #30295, added test-166.cs.
7349
7350 2002-09-14  Martin Baulig  <martin@gnome.org>
7351
7352         * statement.cs (Block.Emit): Don't emit unreachable code.
7353         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
7354         `break' statements.
7355         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
7356
7357 2002-09-14  Martin Baulig  <martin@gnome.org>
7358
7359         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
7360         is set.
7361
7362 2002-09-14  Martin Baulig  <martin@gnome.org>
7363
7364         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
7365         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
7366         be false on the ms runtime.
7367
7368 2002-09-13  Martin Baulig  <martin@gnome.org>
7369
7370         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
7371         the CS0038 error message.
7372
7373 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
7374
7375         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
7376         constant inside, return it.
7377
7378 2002-09-12  Martin Baulig  <martin@gnome.org>
7379
7380         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
7381         implicit conversion can be done between enum types.
7382
7383         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
7384         check whether an implicit conversion to the current enum's UnderlyingType
7385         exists and report an error if not.
7386
7387         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
7388         without debugging support.
7389
7390         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
7391         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
7392
7393 2002-09-12  Martin Baulig  <martin@gnome.org>
7394
7395         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
7396
7397         * ecore.cs (IMemberExpr.DeclaringType): New property.
7398         (SimpleName.SimpleNameResolve): Check whether we're accessing a
7399         nonstatic member of an outer type (CS0038).
7400
7401 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
7402
7403         * driver.cs: Activate the using-error detector at warning level
7404         4 (at least for MS-compatible APIs).
7405
7406         * namespace.cs (VerifyUsing): Small buglett fix.
7407
7408         * pending.cs (PendingImplementation): pass the container pointer. 
7409
7410         * interface.cs (GetMethods): Allow for recursive definition.  Long
7411         term, I would like to move every type to support recursive
7412         definitions, not the current ordering mechanism that we have right
7413         now.
7414
7415         The situation is this: Attributes are handled before interfaces,
7416         so we can apply attributes to interfaces.  But some attributes
7417         implement interfaces, we will now handle the simple cases
7418         (recursive definitions will just get an error).  
7419
7420         * parameter.cs: Only invalidate types at the end if we fail to
7421         lookup all types.  
7422
7423 2002-09-09  Martin Baulig  <martin@gnome.org>
7424
7425         * ecore.cs (PropertyExpr.Emit): Also check for
7426         TypeManager.system_int_array_get_length so this'll also work when
7427         compiling corlib.  Fixes #30003.
7428
7429 2002-09-09  Martin Baulig  <martin@gnome.org>
7430
7431         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
7432         and throw an exception if we can't get the type's size.  Fixed #30040,
7433         added test-165.cs.
7434
7435 2002-09-09  Martin Baulig  <martin@gnome.org>
7436
7437         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
7438
7439         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
7440         context.  Fixes bug #30027.
7441
7442         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
7443         virtual functions.  Fixes bug #30043, added test-164.cs.
7444
7445 2002-09-08  Ravi Pratap  <ravi@ximian.com>
7446
7447         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
7448
7449 2002-09-08  Nick Drochak  <ndrochak@gol.com>
7450
7451         * driver.cs: Use an object to get the windows codepage since it's not a
7452         static property.
7453
7454 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
7455
7456         * statement.cs (For.Emit): for infinite loops (test == null)
7457         return whether there is a break inside, not always "true".
7458
7459         * namespace.cs (UsingEntry): New struct to hold the name of the
7460         using definition, the location where it is defined, and whether it
7461         has been used in a successful type lookup.
7462
7463         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
7464         strings.
7465
7466         * decl.cs: ditto.
7467
7468 2002-09-06  Ravi Pratap  <ravi@ximian.com>
7469
7470         * attribute.cs : Fix incorrect code which relied on catching
7471         a NullReferenceException to detect a null being passed in
7472         where an object was expected.
7473
7474 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
7475
7476         * statement.cs (Try): flag the catch variable as assigned
7477
7478         * expression.cs (Cast): Simplified by using ResolveType instead of
7479         manually resolving.
7480
7481         * statement.cs (Catch): Fix bug by using ResolveType.
7482
7483 2002-09-06  Ravi Pratap  <ravi@ximian.com>
7484
7485         * expression.cs (BetterConversion): Special case for when we have
7486         a NullLiteral as the argument and we have to choose between string
7487         and object types - we choose string the way csc does.
7488
7489         * attribute.cs (Attribute.Resolve): Catch the
7490         NullReferenceException and report error #182 since the Mono
7491         runtime no more has the bug and having this exception raised means
7492         we tried to select a constructor which takes an object and is
7493         passed a null.
7494
7495 2002-09-05  Ravi Pratap  <ravi@ximian.com>
7496
7497         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
7498         message (1502, 1503) when we can't locate a method after overload
7499         resolution. This is much more informative and closes the bug
7500         Miguel reported.
7501
7502         * interface.cs (PopulateMethod): Return if there are no argument
7503         types. Fixes a NullReferenceException bug.
7504
7505         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
7506         expressions too. Previously we were checking only in one place for
7507         positional arguments leaving out named arguments.
7508
7509         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
7510         type to the enum type is not allowed. Remove code corresponding to
7511         that.
7512
7513         (ConvertNumericExplicit): Allow explicit conversions from
7514         the underlying type to enum type. This precisely follows the spec
7515         and closes a bug filed by Gonzalo.
7516
7517 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7518
7519         * compiler.csproj:
7520         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
7521
7522 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
7523
7524         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
7525         it was important that we stored the right value after the
7526         reduction in `converted'.
7527
7528 2002-09-04  Martin Baulig  <martin@gnome.org>
7529
7530         * location.cs (Location.SymbolDocument): Use full pathnames for the
7531         source files.
7532
7533 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
7534
7535         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
7536         of the expression resolve mechanism, because that will catch the
7537         SimpleName error failures.
7538
7539         (Conditional): If we can not resolve the
7540         expression, return, do not crash.
7541
7542 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7543
7544         * cs-tokenizer.cs:
7545         (location): display token name instead of its number.
7546
7547 2002-08-28  Martin Baulig  <martin@gnome.org>
7548
7549         * expression.cs (Binary.ResolveOperator): Don't silently return
7550         but return an error if an operator cannot be applied between two
7551         enum types.
7552
7553 2002-08-28  Martin Baulig  <martin@gnome.org>
7554
7555         * class.cs (Constructor.Define): Set the permission attributes
7556         correctly instead of making all constructors public.
7557
7558 2002-08-28  Martin Baulig  <martin@gnome.org>
7559
7560         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
7561         for private members before reporting a CS0103; if we find anything,
7562         it's a CS0122.
7563
7564 2002-08-28  Martin Baulig  <martin@gnome.org>
7565
7566         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
7567         to check whether `closure_start_type == closure_invocation_type',
7568         we also need to check whether `m.DeclaringType == closure_invocation_type'
7569         before bypassing the permission checks.  We might be accessing
7570         protected/private members from the base class.
7571         (TypeManager.RealMemberLookup): Only set private_ok if private
7572         members were requested via BindingFlags.NonPublic.
7573
7574         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
7575
7576         * expression.cs (MemberAccess.ResolveMemberAccess): Set
7577         MethodGroupExpr.IsExplicitImpl if appropriate.
7578         (Invocation.DoResolve): Don't report the CS0120 for explicit
7579         interface implementations.
7580
7581 2002-08-27  Martin Baulig  <martin@gnome.org>
7582
7583         * expression.cs (Invocation.DoResolve): If this is a static
7584         method and we don't have an InstanceExpression, we must report
7585         a CS0120.
7586
7587 2002-08-25  Martin Baulig  <martin@gnome.org>
7588
7589         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
7590         `==' between a valuetype and an object.
7591
7592 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
7593
7594         * ecore.cs (TypeExpr): Provide a ToString method.
7595
7596 2002-08-24  Martin Baulig  <martin@gnome.org>
7597
7598         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
7599         now called proggie.dbg and it's a binary file.
7600
7601 2002-08-23  Martin Baulig  <martin@gnome.org>
7602
7603         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
7604
7605 2002-08-23  Martin Baulig  <martin@gnome.org>
7606
7607         * struct.cs (MyStructInfo.ctor): Make this work with empty
7608         structs; it's not allowed to use foreach() on null.
7609
7610 2002-08-23  Martin Baulig  <martin@gnome.org>
7611
7612         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
7613         writer the full pathname of the generated assembly.
7614
7615 2002-08-23  Martin Baulig  <martin@gnome.org>
7616
7617         * statements.cs (FlowBranching.UsageVector.MergeChildren):
7618         A `finally' block never returns or breaks; improved handling of
7619         unreachable code.
7620
7621 2002-08-23  Martin Baulig  <martin@gnome.org>
7622
7623         * statement.cs (Throw.Resolve): Allow `throw null'.
7624
7625 2002-08-23  Martin Baulig  <martin@gnome.org>
7626
7627         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
7628         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
7629         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
7630         MemberLookup would return a wrong event if this is an explicit
7631         interface implementation and the class has an event with the same
7632         name.
7633
7634 2002-08-23  Martin Baulig  <martin@gnome.org>
7635
7636         * statement.cs (Block.AddChildVariableNames): New public method.
7637         (Block.AddChildVariableName): Likewise.
7638         (Block.IsVariableNameUsedInChildBlock): Likewise.
7639         (Block.AddVariable): Check whether a variable name has already
7640         been used in a child block.
7641
7642         * cs-parser.jay (declare_local_variables): Mark all variable names
7643         from the current block as being used in a child block in the
7644         implicit block.
7645
7646 2002-08-23  Martin Baulig  <martin@gnome.org>
7647
7648         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
7649         find the symbol writer.
7650
7651         * driver.cs: csc also allows the arguments to /define being
7652         separated by commas, not only by semicolons.
7653
7654 2002-08-23  Martin Baulig  <martin@gnome.org>
7655
7656         * interface.cs (Interface.GetMembers): Added static check for events.
7657
7658 2002-08-15  Martin Baulig  <martin@gnome.org>
7659
7660         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
7661         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
7662
7663         * ecore.cs (Expression.MemberLookup): Added documentation and explained
7664         why the MethodData.EmitDestructor() change was necessary.
7665
7666 2002-08-20  Martin Baulig  <martin@gnome.org>
7667
7668         * class.cs (TypeContainer.FindMembers): Added static check for events.
7669
7670         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
7671
7672         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
7673         use Type.GetEvents(), not Type.FindMembers().
7674
7675 2002-08-20  Martin Baulig  <martin@gnome.org>
7676
7677         * decl.cs (MemberCache): Added a special method cache which will
7678         be used for method-only searched.  This ensures that a method
7679         search will return a MethodInfo with the correct ReflectedType for
7680         inherited methods.      
7681
7682 2002-08-20  Martin Baulig  <martin@gnome.org>
7683
7684         * decl.cs (DeclSpace.FindMembers): Made this public.
7685
7686 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7687
7688         * delegate.cs: fixed build on windows.
7689         [FIXME:  Filed as bug #29150: MCS must report these errors.]
7690
7691 2002-08-19  Ravi Pratap  <ravi@ximian.com>
7692
7693         * ecore.cs (StandardConversionExists): Return a false
7694         if we are trying to convert the void type to anything else
7695         since that is not allowed.
7696
7697         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
7698         we flag error 70 in the event an event is trying to be accessed
7699         directly from outside the declaring type.
7700
7701 2002-08-20  Martin Baulig  <martin@gnome.org>
7702
7703         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
7704         MemberCache from typemanager.cs to decl.cs.
7705
7706 2002-08-19  Martin Baulig  <martin@gnome.org>
7707
7708         * class.cs (TypeContainer): Implement IMemberContainer.
7709         (TypeContainer.DefineMembers): Create the MemberCache.
7710         (TypeContainer.FindMembers): Do better BindingFlags checking; only
7711         return public members if BindingFlags.Public was given, check
7712         whether members are static.
7713
7714 2002-08-16  Martin Baulig  <martin@gnome.org>
7715
7716         * decl.cs (DeclSpace.Define): Splitted this in Define and
7717         DefineMembers.  DefineMembers is called first and initializes the
7718         MemberCache.
7719
7720         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
7721         DefineMembers() on all our DeclSpaces.
7722
7723         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
7724         but call DefineMembers() on all nested interfaces.  We call their
7725         Define() in our new Define() function.
7726
7727         * interface.cs (Interface): Implement IMemberContainer.
7728         (Interface.Define): Moved all code except the attribute stuf to
7729         DefineMembers().
7730         (Interface.DefineMembers): Initialize the member cache.
7731
7732         * typemanager.cs (IMemberFinder): Removed this interface, we don't
7733         need this anymore since we can use MemberCache.FindMembers directly.
7734
7735 2002-08-19  Martin Baulig  <martin@gnome.org>
7736
7737         * typemanager.cs (MemberCache): When creating the cache for an
7738         interface type, add all inherited members.
7739         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
7740         to `out bool used_cache' and documented it.
7741         (TypeManager.MemberLookup): If we already used the cache in the first
7742         iteration, we don't need to do the interfaces check.
7743
7744 2002-08-19  Martin Baulig  <martin@gnome.org>
7745
7746         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
7747         here from IMemberFinder and don't implement this interface anymore.
7748         (DeclSpace.MemberCache): Moved here from IMemberFinder.
7749
7750         * typemanager.cs (IMemberFinder): This interface is now only used by
7751         classes which actually support the member cache.
7752         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
7753         since we only put DeclSpaces into this Hashtable.
7754         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
7755         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
7756
7757 2002-08-16  Martin Baulig  <martin@gnome.org>
7758
7759         * typemanager.cs (ICachingMemberFinder): Removed.
7760         (IMemberFinder.MemberCache): New property.
7761         (TypeManager.FindMembers): Merged this with RealFindMembers().
7762         This function will never be called from TypeManager.MemberLookup()
7763         so we can't use the cache here, just the IMemberFinder.
7764         (TypeManager.MemberLookup_FindMembers): Check whether the
7765         IMemberFinder has a MemberCache and call the cache's FindMembers
7766         function.
7767         (MemberCache): Rewrote larger parts of this yet another time and
7768         cleaned it up a bit.
7769
7770 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
7771
7772         * driver.cs (LoadArgs): Support quoting.
7773
7774         (Usage): Show the CSC-like command line arguments.
7775
7776         Improved a few error messages.
7777
7778 2002-08-15  Martin Baulig  <martin@gnome.org>
7779
7780         * typemanager.cs (IMemberContainer.Type): New property.
7781         (IMemberContainer.IsInterface): New property.
7782
7783         The following changes are conditional to BROKEN_RUNTIME, which is
7784         defined at the top of the file.
7785
7786         * typemanager.cs (MemberCache.MemberCache): Don't add the base
7787         class'es members, but add all members from TypeHandle.ObjectType
7788         if we're an interface.
7789         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
7790         is the current type.
7791         (MemberCache.CacheEntry.Container): Removed this field.
7792         (TypeHandle.GetMembers): Include inherited members.
7793
7794 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7795
7796         * typemanager.cs: fixed compilation and added a comment on a field that
7797         is never used.
7798
7799 2002-08-15  Martin Baulig  <martin@gnome.org>
7800
7801         * class.cs (ConstructorInitializer.Resolve): In the
7802         Expression.MemberLookup call, use the queried_type as
7803         invocation_type.
7804
7805         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
7806         declared' attribute, it's always true.
7807         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
7808         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
7809         temporary wrapper for FindMembers which tells MemberLookup whether
7810         members from the base classes are included in the return value.
7811         This will go away soon.
7812         (TypeManager.MemberLookup): Use this temporary hack here; once the
7813         new MemberCache is completed, we don't need to do the DeclaredOnly
7814         looping here anymore since the MemberCache will take care of this.
7815         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
7816         (MemberCache): When creating the MemberCache for a class, get
7817         members from the current class and all its base classes.
7818         (MemberCache.CacheEntry.Container): New field.  This is a
7819         temporary hack until the Mono runtime is fixed to distinguish
7820         between ReflectedType and DeclaringType.  It allows us to use MCS
7821         with both the MS runtime and the unfixed Mono runtime without
7822         problems and without accecting performance.
7823         (MemberCache.SearchMembers): The DeclaredOnly looping from
7824         TypeManager.MemberLookup is now done here.      
7825
7826 2002-08-14  Martin Baulig  <martin@gnome.org>
7827
7828         * statement.cs (MyStructInfo.MyStructInfo): Don't call
7829         Type.GetFields on dynamic types but get the fields from the
7830         corresponding TypeContainer.
7831         (MyStructInfo.GetStructInfo): Added check for enum types.
7832
7833         * typemanager.cs (MemberList.IsSynchronized): Implemented.
7834         (MemberList.SyncRoot): Implemented.
7835         (TypeManager.FilterWithClosure): No need to check permissions if
7836         closure_start_type == closure_invocation_type, don't crash if
7837         closure_invocation_type is null.
7838
7839 2002-08-13  Martin Baulig  <martin@gnome.org>
7840
7841         Rewrote TypeContainer.FindMembers to use a member cache.  This
7842         gives us a speed increase of about 35% for the self-hosting MCS
7843         build and of about 15-20% for the class libs (both on GNU/Linux).
7844
7845         * report.cs (Timer): New class to get enhanced profiling.  This
7846         whole class is "TIMER" conditional since it remarkably slows down
7847         compilation speed.
7848
7849         * class.cs (MemberList): New class.  This is an IList wrapper
7850         which we're now using instead of passing MemberInfo[]'s around to
7851         avoid copying this array unnecessarily.
7852         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
7853         (ICachingMemberFinder, IMemberContainer): New interface.
7854         (TypeManager.FilterWithClosure): If `criteria' is null, the name
7855         has already been checked, otherwise use it for the name comparision.
7856         (TypeManager.FindMembers): Renamed to RealMemberFinder and
7857         provided wrapper which tries to use ICachingMemberFinder.FindMembers
7858         if possible.  Returns a MemberList, not a MemberInfo [].
7859         (TypeHandle): New class, implements IMemberContainer.  We create
7860         one instance of this class per type, it contains a MemberCache
7861         which is used to do the member lookups.
7862         (MemberCache): New class.  Each instance of this class contains
7863         all members of a type and a name-based hash table.
7864         (MemberCache.FindMembers): This is our new member lookup
7865         function.  First, it looks up all members of the requested name in
7866         the hash table.  Then, it walks this list and sorts out all
7867         applicable members and returns them.
7868
7869 2002-08-13  Martin Baulig  <martin@gnome.org>
7870
7871         In addition to a nice code cleanup, this gives us a performance
7872         increase of about 1.4% on GNU/Linux - not much, but it's already
7873         half a second for the self-hosting MCS compilation.
7874
7875         * typemanager.cs (IMemberFinder): New interface.  It is used by
7876         TypeManager.FindMembers to call FindMembers on a TypeContainer,
7877         Enum, Delegate or Interface.
7878         (TypeManager.finder_to_member_finder): New PtrHashtable.
7879         (TypeManager.finder_to_container): Removed.
7880         (TypeManager.finder_to_delegate): Removed.
7881         (TypeManager.finder_to_interface): Removed.
7882         (TypeManager.finder_to_enum): Removed.
7883
7884         * interface.cs (Interface): Implement IMemberFinder.
7885
7886         * delegate.cs (Delegate): Implement IMemberFinder.
7887
7888         * enum.cs (Enum): Implement IMemberFinder.
7889
7890         * class.cs (TypeContainer): Implement IMemberFinder.
7891
7892 2002-08-12  Martin Baulig  <martin@gnome.org>
7893
7894         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
7895
7896 2002-08-12  Martin Baulig  <martin@gnome.org>
7897
7898         * ecore.cs (ITypeExpression): New interface for expressions which
7899         resolve to a type.
7900         (TypeExpression): Renamed to TypeLookupExpression.
7901         (Expression.DoResolve): If we're doing a types-only lookup, the
7902         expression must implement the ITypeExpression interface and we
7903         call DoResolveType() on it.
7904         (SimpleName): Implement the new ITypeExpression interface.
7905         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
7906         hack, the situation that we're only looking up types can't happen
7907         anymore when this method is called.  Moved the type lookup code to
7908         DoResolveType() and call it.
7909         (SimpleName.DoResolveType): This ITypeExpression interface method
7910         is now doing the types-only lookup.
7911         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
7912         (ResolveFlags): Added MaskExprClass.
7913
7914         * expression.cs (MemberAccess): Implement the ITypeExpression
7915         interface.
7916         (MemberAccess.DoResolve): Added support for a types-only lookup
7917         when we're called via ITypeExpression.DoResolveType().
7918         (ComposedCast): Implement the ITypeExpression interface.
7919
7920         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
7921         Expression.Resolve() with ResolveFlags.Type instead.
7922
7923 2002-08-12  Martin Baulig  <martin@gnome.org>
7924
7925         * interface.cs (Interface.Define): Apply attributes.
7926
7927         * attribute.cs (Attribute.ApplyAttributes): Added support for
7928         interface attributes.
7929
7930 2002-08-11  Martin Baulig  <martin@gnome.org>
7931
7932         * statement.cs (Block.Emit): Only check the "this" variable if we
7933         do not always throw an exception.
7934
7935         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
7936         whether the property has a set accessor.
7937
7938 2002-08-11  Martin Baulig  <martin@gnome.org>
7939
7940         Added control flow analysis support for structs.
7941
7942         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
7943         with control flow analysis turned off.
7944         (IVariable): New interface.
7945         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
7946         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
7947         (FieldExpr.DoResolve): Resolve the instance expression with flow
7948         analysis turned off and do the definite assignment check after the
7949         resolving when we know what the expression will resolve to.
7950
7951         * expression.cs (LocalVariableReference, ParameterReference):
7952         Implement the new IVariable interface, only call the flow analysis
7953         code if ec.DoFlowAnalysis is true.
7954         (This): Added constructor which takes a Block argument.  Implement
7955         the new IVariable interface.
7956         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
7957         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
7958         This does the definite assignment checks for struct members.
7959
7960         * class.cs (Constructor.Emit): If this is a non-static `struct'
7961         constructor which doesn't have any initializer, call
7962         Block.AddThisVariable() to tell the flow analysis code that all
7963         struct elements must be initialized before control returns from
7964         the constructor.
7965
7966         * statement.cs (MyStructInfo): New public class.
7967         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
7968         argument to this indexer.  If non-zero, check an individual struct
7969         member, not the whole struct.
7970         (FlowBranching.CheckOutParameters): Check struct members.
7971         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
7972         overloaded versions of these methods which take an additional
7973         `int field_idx' argument to check struct members.
7974         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
7975         overloaded versions of these methods which take an additional
7976         `string field_name' argument to check struct member.s
7977         (VariableInfo): Implement the IVariable interface.
7978         (VariableInfo.StructInfo): New public property.  Returns the
7979         MyStructInfo instance of the variable if it's a struct or null.
7980         (Block.AddThisVariable): New public method.  This is called from
7981         Constructor.Emit() for non-static `struct' constructor which do
7982         not have any initializer.  It creates a special variable for the
7983         "this" instance variable which will be checked by the flow
7984         analysis code to ensure that all of the struct's fields are
7985         initialized before control returns from the constructor.
7986         (UsageVector): Added support for struct members.  If a
7987         variable/parameter is a struct with N members, we reserve a slot
7988         in the usage vector for each member.  A struct is considered fully
7989         initialized if either the struct itself (slot 0) or all its
7990         members are initialized.
7991
7992 2002-08-08  Martin Baulig  <martin@gnome.org>
7993
7994         * driver.cs (Driver.MainDriver): Only report an error CS5001
7995         if there were no compilation errors.
7996
7997         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
7998         `UnsafeContext' property to determine whether the parent is in
7999         unsafe context rather than checking the parent's ModFlags:
8000         classes nested in an unsafe class are unsafe as well.
8001
8002 2002-08-08  Martin Baulig  <martin@gnome.org>
8003
8004         * statement.cs (UsageVector.MergeChildren): Distinguish between
8005         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
8006         we return.  Added test17() and test18() to test-154.cs.
8007
8008 2002-08-08  Martin Baulig  <martin@gnome.org>
8009
8010         * typemanager.cs (TypeManager.FilterWithClosure): If we have
8011         Family access, make sure the invoking type isn't a subclass of the
8012         queried type (that'd be a CS1540).
8013
8014         * ecore.cs (Expression.MemberLookup): Added overloaded version of
8015         this method which takes an additional `Type invocation_type'.
8016
8017         * expression.cs (BaseAccess.DoResolve): Use the base type as
8018         invocation and query type.
8019         (MemberAccess.DoResolve): If the lookup failed and we're about to
8020         report a CS0122, try a lookup with the ec.ContainerType - if this
8021         succeeds, we must report a CS1540.
8022
8023 2002-08-08  Martin Baulig  <martin@gnome.org>
8024
8025         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
8026         (MethodGroupExpr): Implement the IMemberExpr interface.
8027
8028         * expression (MemberAccess.ResolveMemberAccess): No need to have
8029         any special code for MethodGroupExprs anymore, they're now
8030         IMemberExprs.   
8031
8032 2002-08-08  Martin Baulig  <martin@gnome.org>
8033
8034         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
8035         Family, FamANDAssem and FamORAssem permissions.
8036         (TypeManager.IsSubclassOrNestedChildOf): New public method.
8037
8038 2002-08-08  Martin Baulig  <martin@gnome.org>
8039
8040         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
8041         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
8042         or loop block.
8043
8044 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
8045
8046         * driver.cs: implemented /resource option to embed managed resources.
8047
8048 2002-08-07  Martin Baulig  <martin@gnome.org>
8049
8050         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
8051         (FieldBase.HasFieldInitializer): New public property.
8052         (FieldBase.GetInitializerExpression): New public method.  Resolves and
8053         returns the field initializer and makes sure it is only resolved once.
8054         (TypeContainer.EmitFieldInitializers): Call
8055         FieldBase.GetInitializerExpression to get the initializer, this ensures
8056         that it isn't resolved multiple times.
8057
8058         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
8059         the resolving process (SimpleName/MemberLookup) that we're currently
8060         emitting a field initializer (which must not access any instance members,
8061         this is an error CS0236).
8062
8063         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
8064         argument, if the `IsFieldInitializer' flag is set, we must report and
8065         error CS0236 and not an error CS0120.   
8066
8067 2002-08-07  Martin Baulig  <martin@gnome.org>
8068
8069         * ecore.cs (IMemberExpr): New public interface.
8070         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
8071         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
8072         if the expression is an IMemberExpr.
8073
8074         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
8075         to be null, implicitly default to `this' if we're non-static in
8076         this case.  Simplified the code a lot by using the new IMemberExpr
8077         interface.  Also fixed bug #28176 here.
8078
8079 2002-08-06  Martin Baulig  <martin@gnome.org>
8080
8081         * cs-parser.jay (SimpleLookup): Removed.  We need to create
8082         ParameterReferences during semantic analysis so that we can do a
8083         type-only search when resolving Cast, TypeOf and SizeOf.
8084         (block): Pass the `current_local_parameters' to the Block's
8085         constructor.
8086
8087         * class.cs (ConstructorInitializer): Added `Parameters parameters'
8088         argument to the constructor.
8089         (ConstructorInitializer.Resolve): Create a temporary implicit
8090         block with the parameters.
8091
8092         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
8093         references here if we aren't doing a type-only search.
8094
8095         * statement.cs (Block): Added constructor which takes a
8096         `Parameters parameters' argument.
8097         (Block.Parameters): New public property.
8098
8099         * support.cs (InternalParameters.Parameters): Renamed `parameters'
8100         to `Parameters' and made it public readonly.
8101
8102 2002-08-06  Martin Baulig  <martin@gnome.org>
8103
8104         * ecore.cs (Expression.Warning): Made this public as well.
8105
8106         * report.cs (Report.Debug): Print the contents of collections.
8107
8108 2002-08-06  Martin Baulig  <martin@gnome.org>
8109
8110         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
8111         used to tell Resolve() which kinds of expressions it may return.
8112         (Expression.Resolve): Added overloaded version of this method which
8113         takes a `ResolveFlags flags' argument.  This can be used to tell
8114         Resolve() which kinds of expressions it may return.  Reports a
8115         CS0118 on error.
8116         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
8117         ResolveFlags.SimpleName.
8118         (Expression.Error118): Added overloaded version of this method which
8119         takes a `ResolveFlags flags' argument.  It uses the flags to determine
8120         which kinds of expressions are allowed.
8121
8122         * expression.cs (Argument.ResolveMethodGroup): New public method.
8123         Resolves an argument, but allows a MethodGroup to be returned.
8124         This is used when invoking a delegate.
8125
8126         * TODO: Updated a bit.
8127
8128 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8129
8130         Fixed compilation with csc.
8131
8132         * ecore.cs: Expression.Error made public. Is this correct? Should
8133         Warning be made public too?
8134
8135         * expression.cs: use ea.Location instead of ea.loc.
8136         [FIXME:  Filed as bug #28607: MCS must report these errors.]
8137
8138 2002-08-06  Martin Baulig  <martin@gnome.org>
8139
8140         * ecore.cs (Expression.loc): Moved the location here instead of
8141         duplicating it in all derived classes.
8142         (Expression.Location): New public property.
8143         (Expression.Error, Expression.Warning): Made them non-static and
8144         removed the location argument.
8145         (Expression.Warning): Added overloaded version which takes an
8146         `int level' argument.
8147         (Expression.Error118): Make this non-static and removed the
8148         expression and location arguments.
8149         (TypeExpr): Added location argument to the constructor.
8150
8151         * expression.cs (StaticCallExpr): Added location argument to
8152         the constructor.
8153         (Indirection, PointerArithmetic): Likewise.
8154         (CheckedExpr, UnCheckedExpr): Likewise.
8155         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
8156         (StringPtr): Likewise.
8157
8158
8159 2002-08-05  Martin Baulig  <martin@gnome.org>
8160
8161         * expression.cs (BaseAccess.DoResolve): Actually report errors.
8162
8163         * assign.cs (Assign.DoResolve): Check whether the source
8164         expression is a value or variable.
8165
8166         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
8167         while resolving the corresponding blocks.
8168
8169         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
8170         an error, don't silently return null.
8171
8172         * statement.cs (Block.AddVariable): Do the error reporting here
8173         and distinguish between CS0128 and CS0136.
8174         (Block.DoResolve): Report all unused labels (warning CS0164).
8175         (LabeledStatement): Pass the location to the constructor.
8176         (LabeledStatement.HasBeenReferenced): New property.
8177         (LabeledStatement.Resolve): Set it to true here.
8178
8179         * statement.cs (Return.Emit): Return success even after reporting
8180         a type mismatch error (CS0126 or CS0127), this is what csc does and
8181         it avoids confusing the users with any consecutive errors.
8182
8183 2002-08-05  Martin Baulig  <martin@gnome.org>
8184
8185         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
8186
8187         * const.cs (Const.LookupConstantValue): Catch circular definitions.
8188
8189         * expression.cs (MemberAccess.DoResolve): Silently return if an
8190         error has already been reported.
8191
8192         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
8193         error has already been reported.
8194
8195 2002-08-05  Martin Baulig  <martin@gnome.org>
8196
8197         * statement.cs (UsageVector): Only initialize the `parameters'
8198         vector if we actually have any "out" parameters.
8199
8200 2002-08-05  Martin Baulig  <martin@gnome.org>
8201
8202         * expression.cs (Binary.ResolveOperator): When combining delegates,
8203         they must have the same type.
8204
8205 2002-08-05  Martin Baulig  <martin@gnome.org>
8206
8207         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
8208         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
8209         work with the ms runtime and we also don't need it: if we're a
8210         PropertyBuilder and not in the `indexer_arguments' hash, then we
8211         are a property and not an indexer.
8212
8213         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
8214         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
8215         since the latter one doesn't work with the ms runtime.
8216
8217 2002-08-03  Martin Baulig  <martin@gnome.org>
8218
8219         Fixed bugs #27998 and #22735.
8220
8221         * class.cs (Method.IsOperator): New public field.
8222         (Method.CheckBase): Report CS0111 if there's already a method
8223         with the same parameters in the current class.  Report CS0508 when
8224         attempting to change the return type of an inherited method.
8225         (MethodData.Emit): Report CS0179 if a method doesn't have a body
8226         and it's not marked abstract or extern.
8227         (PropertyBase): New abstract base class for Property and Indexer.
8228         (PropertyBase.CheckBase): Moved here from Property and made it work
8229         for indexers.
8230         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
8231         the same so we can reuse it there.
8232         (Property, Indexer): Derive from PropertyBase.
8233         (MethodSignature.inheritable_property_signature_filter): New delegate
8234         to find properties and indexers.
8235
8236         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
8237         argument and improved error reporting.
8238
8239         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
8240         EmptyReadOnlyParameters and made it a property.
8241
8242         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
8243         version of this method which takes a `PropertyInfo indexer'.
8244         (TypeManager.RegisterIndexer): New method.
8245
8246         * class.cs: Added myself as author of this file :-)
8247
8248 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8249
8250         * class.cs: fixed compilation on windoze.
8251
8252 2002-08-03  Martin Baulig  <martin@gnome.org>
8253
8254         * interface.cs (Interface.GetInterfaceBases): Check whether all
8255         base interfaces are at least as accessible than the current one.
8256
8257         * class.cs (TypeContainer.GetClassBases): Check whether base types
8258         are at least as accessible than the current type.
8259         (TypeContainer.AsAccessible): Implemented and made non-static.
8260         (MemberBase.CheckParameters): Report errors if the accessibility
8261         checks fail.
8262
8263         * delegate.cs (Delegate.Delegate): The default visibility is
8264         internal for top-level types and private for nested types.
8265         (Delegate.Define): Report errors if the accessibility checks fail.
8266
8267         * enum.cs (Enum.Enum): The default visibility is internal for
8268         top-level types and private for nested types.
8269         (Enum.DefineType): Compute the correct visibility.
8270
8271         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
8272         function which takes a `bool is_toplevel' instead of a TypeContainer.
8273
8274         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
8275         builtin type.
8276
8277 2002-08-02  Martin Baulig  <martin@gnome.org>
8278
8279         * expression.cs (LocalVariableReferenc): Added constructor which
8280         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
8281         (LocalVariableReference.IsReadOnly): New property.
8282         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
8283         variable is readonly, use our own readonly flag to do this; you can
8284         use the new constructor to get a writable reference to a read-only
8285         variable.
8286
8287         * cs-parser.jay (foreach_statement, using_statement): Get a writable
8288         reference to the local variable.
8289
8290 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
8291
8292         * rootcontext.cs (ResolveCore): Also include System.Exception
8293
8294         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
8295         we reach an EmptyStatement.
8296
8297         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
8298         is also fine.
8299
8300         * expression.cs (Binary.ResolveOperator): Check error result in
8301         two places.
8302
8303         use brtrue/brfalse directly and avoid compares to null.
8304
8305 2002-08-02  Martin Baulig  <martin@gnome.org>
8306
8307         * class.cs (TypeContainer.Define): Define all nested interfaces here.
8308         Fixes bug #28407, added test-155.cs.
8309
8310 2002-08-01  Martin Baulig  <martin@gnome.org>
8311
8312         * class.cs (Event.EmitDefaultMethod): Make this work with static
8313         events.  Fixes #28311, added verify-3.cs.
8314
8315 2002-08-01  Martin Baulig  <martin@gnome.org>
8316
8317         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
8318         `is_disposable' fields.
8319         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
8320         `hm.is_disposable' if we're using the collection pattern.
8321         (Foreach.EmitCollectionForeach): Use the correct type for the
8322         enumerator's local variable, only emit the try/finally block if
8323         necessary (fixes #27713).
8324
8325 2002-08-01  Martin Baulig  <martin@gnome.org>
8326
8327         * ecore.cs (Expression.report118): Renamed to Error118 and made
8328         it public static.
8329
8330         * statement.cs (Throw.Resolve): Check whether the expression is of
8331         the correct type (CS0118) and whether the type derives from
8332         System.Exception (CS0155).
8333         (Catch.Resolve): New method.  Do the type lookup here and check
8334         whether it derives from System.Exception (CS0155).
8335         (Catch.CatchType, Catch.IsGeneral): New public properties.
8336
8337         * typemanager.cs (TypeManager.exception_type): Added.
8338
8339 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
8340
8341         * driver.cs: Updated About function.
8342
8343 2002-07-31  Martin Baulig  <martin@gnome.org>
8344
8345         Implemented Control Flow Analysis.
8346
8347         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
8348         (EmitContext.CurrentBranching): Added.
8349         (EmitContext.StartFlowBranching): Added.
8350         (EmitContext.EndFlowBranching): Added.
8351         (EmitContext.KillFlowBranching): Added.
8352         (EmitContext.IsVariableAssigned): Added.
8353         (EmitContext.SetVariableAssigned): Added.
8354         (EmitContext.IsParameterAssigned): Added.
8355         (EmitContext.SetParameterAssigned): Added.
8356         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
8357         Added control flow analysis stuff here.
8358
8359         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
8360         resolve the expression as lvalue.
8361         (LocalVariableReference.DoResolve): Check whether the variable has
8362         already been assigned.
8363         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
8364         the parameter as assigned here.
8365         (ParameterReference.DoResolve): Check whether the parameter has already
8366         been assigned.
8367         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
8368         expression as lvalue.
8369
8370         * statement.cs (FlowBranching): New class for the flow analysis code.
8371         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
8372         (LabeledStatement.IsDefined): New public property.
8373         (LabeledStatement.AddUsageVector): New public method to tell flow
8374         analyis that the label may be reached via a forward jump.
8375         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
8376         flow analysis.
8377         (VariableInfo.Number): New public field.  This is used by flow analysis
8378         to number all locals of a block.
8379         (Block.CountVariables): New public property.  This is the number of
8380         local variables in this block (including the locals from all parent
8381         blocks).
8382         (Block.EmitMeta): Number all the variables.
8383
8384         * statement.cs: Added flow analysis support to all classes.
8385
8386 2002-07-31  Martin Baulig  <martin@gnome.org>
8387
8388         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
8389         To get debugging messages, compile mcs with /define:MCS_DEBUG and
8390         then use this argument.
8391
8392         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
8393
8394         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
8395         use this to specify /define options.
8396
8397 2002-07-29  Martin Baulig  <martin@gnome.org>
8398
8399         * statement.cs (Fixed): Moved all code that does variable lookups
8400         and resolvings from Emit to Resolve.
8401
8402         * statement.cs (For): Moved all code that does variable lookups
8403         and resolvings from Emit to Resolve.
8404
8405         * statement.cs (Using): Moved all code that does variable lookups
8406         and resolvings from Emit to Resolve.
8407
8408 2002-07-29  Martin Baulig  <martin@gnome.org>
8409
8410         * attribute.cs (Attribute.Resolve): Explicitly catch a
8411         System.NullReferenceException when creating the
8412         CustromAttributeBuilder and report a different warning message.
8413
8414 2002-07-29  Martin Baulig  <martin@gnome.org>
8415
8416         * support.cs (ParameterData.ParameterName): Added method to
8417         get the name of a parameter.
8418
8419         * typemanager.cs (TypeManager.IsValueType): New public method.
8420
8421 2002-07-29  Martin Baulig  <martin@gnome.org>
8422
8423         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
8424         is a flag which specifies that it's either ref or out.
8425         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
8426         the out parameter to `out Parameter.Modifier mod', also set the
8427         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
8428
8429         * support.cs (InternalParameters.ParameterModifier): Distinguish
8430         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
8431         Parameter.Modifier.ISBYREF flag if it's either ref or out.
8432
8433         * expression.cs (Argument.GetParameterModifier): Distinguish
8434         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
8435         Parameter.Modifier.ISBYREF flag if it's either ref or out.
8436
8437 2002-07-29  Martin Baulig  <martin@gnome.org>
8438
8439         * expression.cs (ParameterReference.ParameterReference): Added
8440         `Location loc' argument to the constructor.
8441
8442         * cs-parser.jay: Pass location to ParameterReference.
8443
8444 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
8445
8446         * statement.cs (Try): Initialize the location.
8447
8448         * cs-parser.jay: pass location to Try.
8449
8450         * expression.cs (Unary.Reduce): Change the prototype to return
8451         whether a constant fold could be performed or not.  The result is
8452         returned in an out parameters.  In the case of Indirection and
8453         AddressOf, we want to perform the full tests.
8454
8455 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
8456
8457         * statement.cs (Statement.Emit): Flag dead code.
8458
8459 2002-07-27  Andrew Birkett  <andy@nobugs.org>
8460
8461         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
8462
8463 2002-07-27  Martin Baulig  <martin@gnome.org>
8464
8465         * class.cs (MethodData.Define): Put back call to
8466         TypeManager.AddMethod(), accidentally commented this out.
8467
8468         * report.cs (Debug): New public method to print debugging information,
8469         this is `[Conditional ("DEBUG")]'.
8470
8471 2002-07-26  Martin Baulig  <martin@gnome.org>
8472
8473         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
8474         (switch_statement): Push the current_block to the switch_stack and
8475         pop it again when we're done with the switch.
8476         (switch_section): The new block is a child of the current_block.
8477         Fixes bug #24007, added test-152.cs.
8478
8479 2002-07-27  Martin Baulig  <martin@gnome.org>
8480
8481         * expression.cs (Invocation.EmitArguments): When calling a varargs
8482         function with only its fixed arguments, we need to pass an empty
8483         array.
8484
8485 2002-07-27  Martin Baulig  <martin@gnome.org>
8486
8487         Mono 0.13 has been released.
8488
8489 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
8490
8491         * driver.cs: Rename --resource to --linkres, because that is what
8492         we do currently, we dont support --resource yet.
8493
8494         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
8495
8496 2002-07-25  Martin Baulig  <martin@gnome.org>
8497
8498         * class.cs (MethodData): New public class.  This is a `method builder'
8499         class for a method or one accessor of a Property/Indexer/Event.
8500         (MethodData.GetMethodFlags): Moved here from MemberBase.
8501         (MethodData.ApplyAttributes): Likewise.
8502         (MethodData.ApplyObsoleteAttribute): Likewise.
8503         (MethodData.ApplyConditionalAttribute): Likewise.
8504         (MethodData.ApplyDllImportAttribute): Likewise.
8505         (MethodData.CheckAbstractAndExternal): Likewise.
8506         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
8507         (MethodData.Emit): Formerly known as Method.Emit().
8508         (MemberBase): Moved everything which was specific to a single
8509         accessor/method to MethodData.
8510         (Method): Create a new MethodData and call Define() and Emit() on it.
8511         (Property, Indexer, Event): Create a new MethodData objects for each
8512         accessor and call Define() and Emit() on them.
8513
8514 2002-07-25  Martin Baulig  <martin@gnome.org>
8515
8516         Made MethodCore derive from MemberBase to reuse the code from there.
8517         MemberBase now also checks for attributes.
8518
8519         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
8520         (MemberBase.GetMethodFlags): Moved here from class Method and marked
8521         as virtual.
8522         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
8523         `CallingConventions cc' and `Attributes opt_attrs' arguments.
8524         (MemberBase.ApplyAttributes): New virtual method; applies the
8525         attributes to a method or accessor.
8526         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
8527         (MemberBase.ApplyConditionalAttribute): Likewise.
8528         (MemberBase.ApplyDllImportAttribute): Likewise.
8529         (MemberBase.CheckAbstractAndExternal): Likewise.
8530         (MethodCore.ParameterTypes): This is now a property instead of a
8531         method, it's initialized from DoDefineParameters().
8532         (MethodCore.ParameterInfo): Removed the set accessor.
8533         (MethodCore.DoDefineParameters): New protected virtual method to
8534         initialize ParameterTypes and ParameterInfo.
8535         (Method.GetReturnType): We can now simply return the MemberType.
8536         (Method.GetMethodFlags): Override the MemberBase version and add
8537         the conditional flags.
8538         (Method.CheckBase): Moved some code from Define() here, call
8539         DoDefineParameters() here.
8540         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
8541         here to avoid some larger code duplication.
8542         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
8543         ensure that abstract and external accessors don't declare a body.
8544
8545         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
8546         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
8547         lookup in the attribute's parent classes, so we need to abort as soon
8548         as we found the first match.
8549         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
8550         the attribute has no arguments.
8551
8552         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
8553         of a Method.
8554
8555 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8556
8557         * cs-parser.jay: reverted previous patch.
8558
8559 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8560
8561         * cs-parser.jay: fixed bug #22119.
8562
8563 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8564
8565         * attribute.cs: fixed compilation. The error was:
8566         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
8567         be assigned to before control leaves the current method."
8568         [FIXME:  Filed as bug #28186: MCS must report this error.]
8569
8570 2002-07-25  Martin Baulig  <martin@gnome.org>
8571
8572         * attribute.cs (Attribute.Conditional_GetConditionName): New static
8573         method to pull the condition name ouf of a Conditional attribute.
8574         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
8575         the obsolete message and error flag out of an Obsolete attribute.
8576
8577         * class.cs (Method.GetMethodFlags): New public method to get the
8578         TypeManager.MethodFlags for this method.
8579         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
8580         private methods.
8581         (Method.Define): Get and apply the Obsolete and Conditional attributes;
8582         if we're overriding a virtual function, set the new private variable
8583         `parent_method'; call the new TypeManager.AddMethod().
8584
8585         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
8586         the MethodBuilder and the Method in a PtrHashtable.
8587         (TypeManager.builder_to_method): Added for this purpose.
8588         (TypeManager.MethodFlags): Added IsObsoleteError.
8589         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
8590         Obsolete and Conditional arguments in MethodBuilders.  If we discover
8591         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
8592         the message from the attribute.
8593
8594 2002-07-24  Martin Baulig  <martin@gnome.org>
8595
8596         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
8597         preprocessor directives, ensure that the argument to #define/#undef is
8598         exactly one identifier and that it's actually an identifier.
8599
8600         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
8601         did not work ....
8602
8603 2002-07-24  Martin Baulig  <martin@gnome.org>
8604
8605         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
8606         initialize it to TypeManager.object_type in the constructor.
8607         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
8608         of the `hm.get_current' method if we're using the collection pattern.
8609         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
8610         for the explicit conversion to make it work when we're using the collection
8611         pattern and the `Current' property has a different return type than `object'.
8612         Fixes #27713.
8613
8614 2002-07-24  Martin Baulig  <martin@gnome.org>
8615
8616         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
8617         does not match, but don't report any errors.  This method is called in
8618         order for all methods in a MethodGroupExpr until a matching method is
8619         found, so we don't want to bail out if the first method doesn't match.
8620         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
8621         matches, report the 123.  Fixes #28070.
8622
8623 2002-07-24  Martin Baulig  <martin@gnome.org>
8624
8625         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
8626         TypeManager.TypeToCoreType() to the top of the method so the
8627         following equality checks will work.  Fixes #28107.
8628
8629 2002-07-24  Martin Baulig  <martin@gnome.org>
8630
8631         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
8632         operand is of type uint, and the other operand is of type sbyte,
8633         short or int, the operands are converted to type long." -
8634         Actually do what this comment already told us.  Fixes bug #28106,
8635         added test-150.cs.
8636
8637 2002-07-24  Martin Baulig  <martin@gnome.org>
8638
8639         * class.cs (MethodBase): New abstract class.  This is now a base
8640         class for Property, Indexer and Event to avoid some code duplication
8641         in their Define() and DefineMethods() methods.
8642         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
8643         generic methods for Define() and DefineMethods().
8644         (FieldBase): Derive from MemberBase, not MemberCore.
8645         (Property): Derive from MemberBase, not MemberCore.
8646         (Property.DefineMethod): Moved all the code from this method to the
8647         new MethodBase.DefineAccessor(), just call it with appropriate
8648         argumetnts.
8649         (Property.Define): Call the new Property.DoDefine(), this does some
8650         sanity checks and we don't need to duplicate the code everywhere.
8651         (Event): Derive from MemberBase, not MemberCore.
8652         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
8653         accessors, this will also make them work with interface events.
8654         (Indexer): Derive from MemberBase, not MemberCore.
8655         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
8656         (Indexer.Define): Use the new MethodBase functions.
8657
8658         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
8659         argument to the constructor.
8660         (Interface.FindMembers): Added support for interface events.
8661         (Interface.PopluateEvent): Implemented.
8662
8663         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
8664
8665 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
8666
8667         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
8668         but this is required to check for a method name being the same as
8669         the containing class.  
8670
8671         Handle this now.
8672
8673 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8674
8675         * interface.cs: initialize variable.
8676
8677 2002-07-23  Martin Baulig  <martin@gnome.org>
8678
8679         Implemented the IndexerName attribute in interfaces.
8680
8681         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
8682         name if this is an explicit interface implementation.
8683         (Indexer.InterfaceIndexerName): New public variable.  If we're
8684         implementing an interface indexer, this is the IndexerName in that
8685         interface.  Otherwise, it's the IndexerName.
8686         (Indexer.DefineMethod): If we're implementing interface indexer,
8687         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
8688         and Pending.ImplementIndexer methods.
8689         (Indexer.Define): Also define the PropertyBuilder if we're
8690         implementing an interface indexer and this is neither an explicit
8691         interface implementation nor do the IndexerName match the one in
8692         the interface.
8693
8694         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
8695         If a method is defined here, then we always need to create a proxy
8696         for it.  This is used when implementing interface indexers.
8697         (Pending.IsInterfaceIndexer): New public method.
8698         (Pending.ImplementIndexer): New public method.
8699         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
8700         This is used when implementing interface indexers to define a proxy
8701         if necessary.
8702         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
8703         define a proxy if necessary.
8704
8705         * interface.cs (Interface.IndexerName): New public variable.
8706         (Interface.PopulateIndexer): Set the IndexerName.
8707         (Interface.DefineIndexers): New private method.  Populate all the
8708         indexers and make sure their IndexerNames match.
8709
8710         * typemanager.cs (IndexerPropertyName): Added support for interface
8711         indexers.
8712
8713 2002-07-22  Martin Baulig  <martin@gnome.org>
8714
8715         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
8716         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
8717         ret if HasReturnLabel.
8718         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
8719         variables.
8720
8721         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
8722         and set the ec.LoopBeginTryCatchLevel.
8723         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
8724         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
8725         the current ec.TryCatchLevel, the branch goes out of an exception
8726         block.  In this case, we need to use Leave and not Br.
8727
8728 2002-07-22  Martin Baulig  <martin@gnome.org>
8729
8730         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
8731         block unless the block does not always return or it is contained in
8732         another try { ... } catch { ... } block.  Fixes bug #26506.
8733         Added verify-1.cs to the test suite.
8734
8735 2002-07-22  Martin Baulig  <martin@gnome.org>
8736
8737         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
8738         then we do not always return.  Fixes bug #24985.
8739
8740 2002-07-22  Martin Baulig  <martin@gnome.org>
8741
8742         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
8743         lookup on a per-class level; ie. walk up the class hierarchy until we
8744         found at least one applicable method, then choose the best among them.
8745         Fixes bug #24463 and test-29.cs.
8746
8747 2002-07-22  Martin Baulig  <martin@gnome.org>
8748
8749         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
8750         return types of the methods.  The return type is not part of the
8751         signature and we must not check it to make the `new' modifier work.
8752         Fixes bug #27999, also added test-147.cs.
8753         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
8754
8755         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
8756         on the method's return type.
8757
8758 2002-07-21  Martin Baulig  <martin@gnome.org>
8759
8760         * assign.cs: Make this work if the rightmost source is a constant and
8761         we need to do an implicit type conversion.  Also adding a few more tests
8762         to test-38.cs which should have caught this.
8763
8764         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
8765         target in the makefile for this.  The makefile.gnu is primarily intended
8766         for end-users who don't want to debug the compiler.
8767
8768 2002-07-21  Martin Baulig  <martin@gnome.org>
8769
8770         * assign.cs: Improved the Assign class so it can now handle embedded
8771         assignments (X = Y = Z = something).  As a side-effect this'll now also
8772         consume less local variables.  test-38.cs now passes with MCS, added
8773         a few new test cases to that test.
8774
8775 2002-07-20  Martin Baulig  <martin@gnome.org>
8776
8777         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
8778         instructions.  Fixes bug #27977, also added test-146.cs.
8779
8780 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8781
8782         * cs-tokenizer.cs: fixed getHex ().
8783
8784 2002-07-19  Martin Baulig  <martin@gnome.org>
8785
8786         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
8787         not Type.GetType() to lookup the array type.  This is needed when
8788         we're constructing an array of a user-defined type.
8789         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
8790         single-dimensional arrays, but also for single-dimensial arrays of
8791         type decimal.
8792
8793 2002-07-19  Martin Baulig  <martin@gnome.org>
8794
8795         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
8796         this function is called, it's not allowed to share LocalBuilders
8797         among ILGenerators.
8798
8799 2002-07-19  Martin Baulig  <martin@gnome.org>
8800
8801         * expression.cs (Argument.Resolve): Report an error 118 when trying
8802         to pass a type as argument.
8803
8804 2002-07-18  Martin Baulig  <martin@gnome.org>
8805
8806         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
8807         Conv_R_Un for the signed `long' type.
8808
8809 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
8810
8811         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
8812         `expr' for the temporary result, as that will fail if we do
8813         multiple resolves on the same expression.
8814
8815 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
8816
8817         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
8818         ec.TypeContainer for looking up aliases. 
8819
8820         * class.cs (TypeContainer): Remove LookupAlias from here.
8821
8822         * decl.cs (DeclSpace); Move here.
8823
8824 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
8825
8826         * class.cs (FindMembers): Only call filter if the constructor
8827         bulider is not null.
8828
8829         Also handle delegates in `NestedTypes' now.  Now we will perform
8830         type lookups using the standard resolution process.  This also
8831         fixes a bug.
8832
8833         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
8834         This uses Expressions (the limited kind that can be parsed by the
8835         tree) instead of strings.
8836
8837         * expression.cs (ComposedCast.ToString): Implement, used to flag
8838         errors since now we have to render expressions.
8839
8840         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
8841         FormArrayType. 
8842
8843         * ecore.cs (SimpleName.ToString): ditto.
8844
8845         * cs-parser.jay: Instead of using strings to assemble types, use
8846         Expressions to assemble the type (using SimpleName, ComposedCast,
8847         MemberAccess).  This should fix the type lookups in declarations,
8848         because we were using a different code path for this.
8849
8850         * statement.cs (Block.Resolve): Continue processing statements
8851         even when there is an error.
8852
8853 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
8854
8855         * class.cs (Event.Define): Also remove the `remove' method from
8856         the list of pending items.
8857
8858         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
8859         generate more compact code. 
8860
8861 2002-07-17  Martin Baulig  <martin@gnome.org>
8862
8863         * const.cs (Const.LookupConstantValue): Add support for constant
8864         `unchecked' and `checked' expressions.
8865         Also adding test case test-140.cs for this.
8866
8867 2002-07-17  Martin Baulig  <martin@gnome.org>
8868
8869         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
8870         check whether mi.ReturnType implements the IEnumerator interface; the
8871         `==' and the IsAssignableFrom() will fail in this situation.
8872
8873 2002-07-16  Ravi Pratap  <ravi@ximian.com>
8874
8875         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
8876         here too.
8877
8878 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8879
8880         * expression.cs: fixed bug #27811.
8881
8882 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
8883
8884         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
8885         Molaro: when we are a ref, the value already contains a pointer
8886         value, do not take the address of it.
8887
8888 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
8889         * removed mb-parser.jay and mb-tokenizer.cs
8890
8891 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
8892
8893         * expression.cs: check against the building corlib void type.
8894
8895 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
8896
8897         * ecore.cs: fix for valuetype static readonly fields: when 
8898         initializing them, we need their address, not the address of a copy.
8899
8900 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
8901
8902         * typemanager.cs: register also enum_type in corlib.
8903
8904 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
8905
8906         * class.cs: allow calling this (but not base) initializers in structs.
8907
8908 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
8909
8910         * ecore.cs: make sure we compare against the building base types
8911         in GetTypeSize ().
8912
8913 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
8914
8915         * typemanager.cs: fix TypeToCoreType() to handle void and object
8916         (corlib gets no more typerefs after this change).
8917
8918 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
8919
8920         * expression.cs (ArrayCreation.EmitArrayArguments): use
8921         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
8922
8923         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
8924         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
8925         array indexes, the runtime actually forbids them.
8926
8927         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
8928         for array arguments here.
8929
8930         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
8931         instead of the default for ValueTypes.
8932
8933         (New.DoEmit): Use IsValueType instead of
8934         IsSubclassOf (value_type)
8935         (New.DoResolve): ditto.
8936         (Invocation.EmitCall): ditto.
8937
8938         * assign.cs (Assign): ditto.
8939
8940         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
8941         Statements *are* currently doing part of their resolution during
8942         Emit.  
8943
8944         Expressions do always resolve during resolve, but statements are
8945         only required to propagate resolution to their children.
8946
8947 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
8948
8949         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
8950
8951         (LoadAssembly): Do not add the dll if it is already specified
8952
8953         (MainDriver): Add the System directory to the link path at the end,
8954         after all the other -L arguments. 
8955
8956         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
8957         wrong opcode for loading bytes and bools (ldelem.i1 instead of
8958         ldelem.u1) and using the opposite for sbytes.
8959
8960         This fixes Digger, and we can finally run it.
8961
8962         * driver.cs (UnixParseOption): Move the option parsing here.  
8963         (CSCParseOption): Implement CSC-like parsing of options.
8964
8965         We now support both modes of operation, the old Unix way, and the
8966         new CSC-like way.  This should help those who wanted to make cross
8967         platform makefiles.
8968
8969         The only thing broken is that /r:, /reference: and /lib: are not
8970         implemented, because I want to make those have the same semantics
8971         as the CSC compiler has, and kill once and for all the confussion
8972         around this.   Will be doing this tomorrow.
8973
8974         * statement.cs (Unsafe.Resolve): The state is checked during
8975         resolve, not emit, so we have to set the flags for IsUnsfe here.
8976
8977 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
8978
8979         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
8980         not catch the Error_ObjectRefRequired in SimpleName (as it is
8981         possible to have a class/instance variable name that later gets
8982         deambiguated), we have to check this here.      
8983
8984 2002-07-10  Ravi Pratap  <ravi@ximian.com>
8985
8986         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
8987         make static and put into Expression.
8988
8989         (Event.Define): Register the private field of the event with the 
8990         TypeManager so that GetFieldFromEvent can get at it.
8991
8992         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
8993         keep track of the private field associated with an event which
8994         has no accessors.
8995
8996         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
8997         private field.
8998
8999         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
9000
9001 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
9002
9003         * expression.cs (Binary.EmitBranchable): this routine emits the
9004         Binary expression in a branchable context.  This basically means:
9005         we need to branch somewhere, not just get the value on the stack.
9006
9007         This works together with Statement.EmitBoolExpression.
9008
9009         * statement.cs (Statement.EmitBoolExpression): Use
9010         EmitBranchable. 
9011
9012 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
9013
9014         * statement.cs (For): Reduce the number of jumps in loops.
9015
9016         (For): Implement loop inversion for the For statement.
9017
9018         (Break): We can be breaking out of a Try/Catch controlled section
9019         (foreach might have an implicit try/catch clause), so we need to
9020         use Leave instead of Br.
9021
9022         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
9023         now).  If the instace expression supports IMemoryLocation, we use
9024         the AddressOf method from the IMemoryLocation to extract the
9025         address instead of emitting the instance.
9026
9027         This showed up with `This', as we were emitting the instance
9028         always (Emit) instead of the Address of This.  Particularly
9029         interesting when This is a value type, as we dont want the Emit
9030         effect (which was to load the object).
9031
9032 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
9033
9034         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
9035
9036         * statement.cs (Checked): Set the CheckedState during the resolve
9037         process too, as the ConvCast operations track the checked state on
9038         the resolve process, and not emit.
9039
9040         * cs-parser.jay (namespace_member_declaration): Flag that we have
9041         found a declaration when we do.  This is used to flag error 1529
9042
9043         * driver.cs: Report ok when we display the help only.
9044
9045 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
9046
9047         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
9048
9049 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
9050
9051         * cs-tokenizer.cs (define): We also have to track locally the
9052         defines.  AllDefines is just used for the Conditional Attribute,
9053         but we also need the local defines for the current source code. 
9054
9055 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
9056
9057         * statement.cs (While, For, Do): These loops can exit through a
9058         Break statement, use this information to tell whether the
9059         statement is the last piece of code.
9060
9061         (Break): Flag that we break.
9062
9063         * codegen.cs (EmitContexts): New `Breaks' state variable.
9064
9065 2002-07-03  Martin Baulig  <martin@gnome.org>
9066
9067         * class.cs (TypeContainer.MethodModifiersValid): Allow override
9068         modifiers in method declarations in structs.  Otherwise, you won't
9069         be able to override things like Object.Equals().
9070
9071 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
9072
9073         * class.cs (Method, Property, Indexer): Do not allow the public
9074         modifier to be used in explicit interface implementations.
9075
9076         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
9077         override modifiers in method declarations in structs
9078
9079 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
9080
9081         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
9082         integer or real overflow, report an error
9083
9084 2002-07-02  Martin Baulig  <martin@gnome.org>
9085
9086         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
9087         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
9088         to tell the runtime about our newly created System.Object and
9089         System.ValueType types.
9090
9091 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
9092
9093         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
9094         struct instead of Ldarg/Starg.
9095
9096 2002-07-02  Martin Baulig  <martin@gnome.org>
9097
9098         * expression.cs (Indirection.Indirection): Call
9099         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
9100
9101 2002-07-02  Martin Baulig  <martin@gnome.org>
9102
9103         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
9104         ValueType, call TypeManager.TypeToCoreType() on it.
9105         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
9106         the OpCodes.Newarr argument.
9107
9108 2002-07-02  Martin Baulig  <martin@gnome.org>
9109
9110         * expression.cs (Invocation.EmitCall): When compiling corlib,
9111         replace all calls to the system's System.Array type to calls to
9112         the newly created one.
9113
9114         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
9115         System.Array methods.
9116         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
9117         from the system's System.Array type which must be replaced.
9118
9119 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
9120
9121         * typemanager.cs: load unverifiable_code_ctor so we can build
9122         corlib using the correct type. Avoid using GetTypeCode() with
9123         TypeBuilders.
9124         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
9125         TypeManager.object_type to allow building corlib.
9126
9127 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
9128
9129         * ecore.cs: handle System.Enum separately in LoadFromPtr().
9130
9131 2002-07-01  Martin Baulig  <martin@gnome.org>
9132
9133         * class.cs: Make the last change actually work, we need to check
9134         whether `ifaces != null' to avoid a crash.
9135
9136 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
9137
9138         * class.cs: when we build structs without fields that implement
9139         interfaces, we need to add the interfaces separately, since there is
9140         no API to both set the size and add the interfaces at type creation
9141         time.
9142
9143 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
9144
9145         * expression.cs: the dimension arguments to the array constructors
9146         need to be converted if they are a long.
9147
9148 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
9149
9150         * class.cs: don't emit ldarg.0 if there is no parent constructor
9151         (fixes showstopper for corlib).
9152
9153 2002-06-29  Martin Baulig  <martin@gnome.org>
9154
9155         MCS now compiles corlib on GNU/Linux :-)
9156
9157         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
9158         ie. check for MethodImplOptions.InternalCall.
9159
9160         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
9161         and TypeManager.attribute_type are null, so we must explicitly check
9162         whether parent is not null to find out whether it's an attribute type.
9163         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
9164         and SetBuilder, not only if the property is neither abstract nor external.
9165         This is necessary to set the MethodImplOptions on the accessor methods.
9166         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
9167         SetBuilder, see Property.Emit().
9168
9169         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
9170         populate "System.Object", "System.ValueType" and "System.Attribute" since
9171         they've already been populated from BootCorlib_PopulateCoreTypes().
9172
9173 2002-06-29  Martin Baulig  <martin@gnome.org>
9174
9175         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
9176         is the NullLiteral, we also need to make sure that target_type is not
9177         an enum type.   
9178
9179 2002-06-29  Martin Baulig  <martin@gnome.org>
9180
9181         * rootcontext.cs (RootContext.ResolveCore): We must initialize
9182         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
9183         before calling BootstrapCorlib_ResolveDelegate ().
9184
9185 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9186
9187         * statement.cs: fixed build-breaker. All tests passed ok.
9188
9189 2002-06-27  Martin Baulig  <martin@gnome.org>
9190
9191         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
9192         for System.Decimal when compiling corlib.
9193
9194 2002-06-27  Martin Baulig  <martin@gnome.org>
9195
9196         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
9197         switch blocks which contain nothing but a default clause.
9198
9199 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
9200
9201        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
9202
9203 2002-06-27  Martin Baulig  <martin@gnome.org>
9204
9205         * ecore.cs (PropertyExpr.PropertyExpr): Call
9206         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
9207
9208         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
9209         is already a TypeBuilder.
9210
9211 2002-06-27  Martin Baulig  <martin@gnome.org>
9212
9213         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
9214         `target_type == TypeManager.array_type', not IsAssignableFrom() in
9215         the "from an array-type to System.Array" case.  This makes it work
9216         when compiling corlib.
9217
9218 2002-06-27  Martin Baulig  <martin@gnome.org>
9219
9220         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
9221         non-static PropertyExpr, set its InstanceExpression.  This makes
9222         the `ICollection.Count' property work in System/Array.cs.
9223
9224 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
9225
9226         * driver.cs: Made error handling more consistent.  Errors now
9227         tracked by Report class, so many methods which used to return int
9228         now return void.  Main() now prints success/failure and 
9229         errors/warnings message.
9230
9231         Renamed '--probe' compiler argument to '--expect-error'.  Removed
9232         the magic number return values (123 and 124).  Now, if the
9233         expected error occurs, the compiler exits with success (exit value
9234         0).  If the compilation completes without seeing that particular
9235         error, the compiler exits with failure (exit value 1).  The
9236         makefile in mcs/errors has been changed to handle the new behaviour.
9237
9238         * report.cs: Made 'expected error' number a property and renamed
9239         it from 'Probe' to 'ExpectedError'.
9240
9241         * genericparser.cs: Removed error handling support, since it is
9242         now all done by Report class.
9243
9244         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
9245         class, so parse() no longer returns an int.
9246
9247         * namespace.cs: Use Report.Error instead of GenericParser.error
9248
9249 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
9250
9251         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
9252         TypeContainer.AddOperator): At the front of the list put the
9253         explicit implementations, so they get resolved/defined first. 
9254
9255 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
9256
9257         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
9258         interface type is implemented by this TypeContainer.  Used during
9259         explicit interface implementation.
9260
9261         (Property.Define, Indexer.Define, Method.Define): Validate that
9262         the given interface in the explicit implementation is one of the
9263         base classes for the containing type.
9264
9265         Also if we are explicitly implementing an interface, but there is
9266         no match in the pending implementation table, report an error.
9267
9268         (Property.Define): Only define the property if we are
9269         not explicitly implementing a property from an interface.  Use the
9270         correct name also for those properties (the same CSC uses,
9271         although that is really not needed).
9272
9273         (Property.Emit): Do not emit attributes for explicitly implemented
9274         properties, as there is no TypeBuilder.
9275
9276         (Indexer.Emit): ditto.
9277
9278         Hiding then means that we do not really *implement* a pending
9279         implementation, which makes code fail.
9280
9281 2002-06-22  Martin Baulig  <martin@gnome.org>
9282
9283         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
9284         the return value of Object.GetType().  [FIXME: we need to do this whenever
9285         we get a type back from the reflection library].
9286
9287 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
9288
9289         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
9290
9291 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
9292
9293         * attribute.cs: Return null if we can not look up the type.
9294
9295         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
9296         the interface types found.
9297
9298         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
9299         interface types found.
9300
9301         * typemanager.cs (GetInterfaces): Make this routine returns alll
9302         the interfaces and work around the lame differences between
9303         System.Type and System.Reflection.Emit.TypeBuilder in the results
9304         result for GetInterfaces.
9305
9306         (ExpandInterfaces): Given an array of interface types, expand and
9307         eliminate repeated ocurrences of an interface.  This expands in
9308         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
9309         be IA, IB, IC.
9310
9311 2002-06-21  Martin Baulig  <martin@gnome.org>
9312
9313         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
9314         on System.Enum.
9315
9316 2002-06-21  Martin Baulig  <martin@gnome.org>
9317
9318         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
9319         and called with one of the core types, return the corresponding typebuilder for
9320         that type.
9321
9322         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
9323         element type.
9324
9325 2002-06-21  Martin Baulig  <martin@gnome.org>
9326
9327         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
9328         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
9329         (Expression.ConvertReferenceExplicit): Likewise.
9330
9331         * expression.cs (ElementAccess.DoResolve): Likewise.
9332         (ElementAccess.DoResolveLValue): Likewise.
9333
9334 2002-06-10  Martin Baulig  <martin@gnome.org>
9335
9336         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
9337         add the "value" parameter to the parameter list.
9338
9339         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
9340         to our caller.
9341
9342 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
9343
9344         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
9345         the argument to an int, uint, long or ulong, per the spec.  Also
9346         catch negative constants in array creation.
9347
9348 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
9349
9350         * class.cs: do not allow the same interface to appear twice in
9351         the definition list.
9352
9353 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
9354
9355         * ecore.cs: don't use ldlen with System.Array.
9356
9357 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
9358
9359         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
9360
9361 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
9362
9363         * modifiers.cs: produce correct field attributes for protected
9364         internal. Easy fix so miguel can work on ther harder stuff:-)
9365
9366 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
9367
9368         * pending.cs: New file.  Move the code from class.cs here.
9369         Support clearning the pending flag for all methods (when not doing
9370         explicit interface implementation).
9371
9372 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
9373
9374         * rootcontext.cs: added a couple more types needed to bootstrap.
9375
9376 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
9377
9378         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
9379         constructor in the type, instead of any constructor in the type
9380         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
9381         a bug in the Mono runtime when applying the params attribute). 
9382
9383 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
9384         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
9385
9386 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
9387
9388         * expression.cs (Unary.ResolveOperator): Use TypeManager
9389         to resolve the type.
9390
9391 2002-06-13  Ravi Pratap  <ravi@ximian.com>
9392
9393         * cs-parser.jay (enum_member_declaration): Pass in the attributes
9394         attached.
9395
9396         * enum.cs (AddEnumMember): Add support to store the attributes associated 
9397         with each member too.
9398
9399         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
9400         field builders too - this takes care of the enum member case.
9401
9402 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
9403
9404         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
9405         address-of operator on both value types and pointers.
9406
9407 2002-06-10  Martin Baulig  <martin@gnome.org>
9408
9409         * interface.cs (Interface.PopulateIndexer): Add the indexer's
9410         PropertyBuilder to the `property_builders' list.
9411
9412         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
9413         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
9414         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
9415         find any indexers which are inherited from an interface.
9416
9417 2002-06-09  Martin Baulig  <martin@gnome.org>
9418
9419         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
9420         the same type as the constant if necessary.  There's also a test-130.cs
9421         for this.
9422
9423         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
9424
9425         * typemanager.cs (TypeManager.ChangeType): Previously known as
9426         Enum.ChangeEnumType().
9427
9428 2002-06-09  Martin Baulig  <martin@gnome.org>
9429
9430         * expression.cs (Cast.TryReduce): Added support for consts.
9431
9432 2002-06-08  Ravi Pratap  <ravi@ximian.com>
9433
9434         * class.cs (Accessor): Hold attributes information so we can pass
9435         it along.
9436
9437         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
9438         Modify to pass in attributes attached to the methods.
9439
9440         (add_accessor_declaration, remove_accessor_declaration): Ditto.
9441
9442         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
9443         to handle the Accessor kind :-)
9444
9445         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
9446
9447 2002-06-08  Martin Baulig  <martin@gnome.org>
9448
9449         * expression.cs (Unary.TryReduceNegative): Added support for
9450         ULongConstants.
9451
9452 2002-06-08  Martin Baulig  <martin@gnome.org>
9453
9454         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
9455         name can't be found in the `defined_names' - the caller will do a
9456         MemberLookup in this case and thus find methods in System.Enum
9457         such as Enum.IsDefined().
9458
9459 2002-06-08  Martin Baulig  <martin@gnome.org>
9460
9461         * enum.cs (Enum.ChangeEnumType): This is a custom version of
9462         Convert.ChangeType() which works with TypeBuilder created types.
9463         (Enum.LookupEnumValue, Enum.Define): Use it here.
9464
9465         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
9466         `TypeBuilder.BaseType != null' check.
9467         (TypeContainer.FindMembers): Only lookup parent members if we
9468         actually have a parent.
9469         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
9470         (ConstructorInitializer.Resolve): Likewise.
9471
9472         * interface.cs (Interface.FindMembers): Added
9473         `TypeBuilder.BaseType != null' check.
9474
9475         * rootcontext.cs (RootContext.ResolveCore): Added
9476         "System.Runtime.CompilerServices.IndexerNameAttribute" to
9477         classes_second_stage.
9478
9479         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
9480         debug_type and trace_type when compiling with --nostdlib.       
9481
9482 2002-06-07  Martin Baulig  <martin@gnome.org>
9483
9484         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
9485         (AddField): Set it to true when adding a non-static field.
9486         (DefineType): Use `have_nonstatic_fields' to find out whether we
9487         have non-static fields, not `Fields != null'.
9488
9489 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
9490
9491         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
9492         dereferencing a null on the static-field code path)
9493
9494 2002-05-30  Martin Baulig  <martin@gnome.org>
9495
9496         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
9497         to take command line arguments.  Use reflection to call the new
9498         custom `Initialize' function on the symbol writer and pass it the
9499         command line arguments.
9500
9501         * driver.cs (--debug-args): New command line argument to pass command
9502         line arguments to the symbol writer.
9503
9504 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
9505
9506         * assign.cs (DoResolve): Forgot to do the implicit conversion to
9507         the target type for indexers and properties.  Thanks to Joe for
9508         catching this.
9509
9510 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
9511
9512         * typemanager.cs (MethodFlags): returns the method flags
9513         (Obsolete/ShouldIgnore) that control warning emission and whether
9514         the invocation should be made, or ignored. 
9515
9516         * expression.cs (Invocation.Emit): Remove previous hack, we should
9517         not do this on matching a base type, we should do this based on an attribute
9518
9519         Only emit calls to System.Diagnostics.Debug and
9520         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
9521         on the command line.
9522
9523         * rootcontext.cs: Global settings for tracing and debugging.
9524
9525         * cs-tokenizer.cs (define): New utility function to track
9526         defines.   Set the global settings for TRACE and DEBUG if found.
9527
9528 2002-05-25  Ravi Pratap  <ravi@ximian.com>
9529
9530         * interface.cs (Populate*): Pass in the TypeContainer as well as
9531         the DeclSpace as parameters so that we can create EmitContexts and
9532         then use that to apply attributes etc.
9533
9534         (PopulateMethod, PopulateEvent, PopulateProperty)
9535         (PopulateIndexer): Apply attributes everywhere.
9536
9537         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
9538         etc.
9539
9540         (ApplyAttributes): Update accordingly.
9541
9542         We now apply interface attributes for all members too.
9543
9544 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
9545
9546         * class.cs (Indexer.Define); Correctly check if we are explicit
9547         implementation (instead of checking the Name for a ".", we
9548         directly look up if the InterfaceType was specified).
9549
9550         Delay the creation of the PropertyBuilder.
9551
9552         Only create the PropertyBuilder if we are not an explicit
9553         interface implementation.   This means that explicit interface
9554         implementation members do not participate in regular function
9555         lookups, and hence fixes another major ambiguity problem in
9556         overload resolution (that was the visible effect).
9557
9558         (DefineMethod): Return whether we are doing an interface
9559         implementation. 
9560
9561         * typemanager.cs: Temporary hack until we get attributes in
9562         interfaces (Ravi is working on that) and we get IndexerName
9563         support in interfaces.
9564
9565         * interface.cs: Register the indexers as properties.
9566
9567         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
9568         warning, I have verified that this is a bug in the .NET runtime
9569         (JavaScript suffers of the same problem).
9570
9571         * typemanager.cs (MemberLookup): When looking up members for
9572         interfaces, the parent of an interface is the implicit
9573         System.Object (so we succeed in searches of Object methods in an
9574         interface method invocation.  Example:  IEnumerable x;  x.ToString
9575         ()) 
9576
9577 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
9578
9579         * class.cs (Event): Events should also register if they do
9580         implement the methods that an interface requires.
9581
9582         * typemanager.cs (MemberLookup); use the new GetInterfaces
9583         method. 
9584
9585         (GetInterfaces): The code used to lookup interfaces for a type is
9586         used in more than one place, factor it here. 
9587
9588         * driver.cs: Track the errors at the bottom of the file, we kept
9589         on going.
9590
9591         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
9592         instance if the method we are calling is static!
9593
9594 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
9595
9596         * attribute.cs (ApplyAttributes): Make this function filter out
9597         the IndexerName attribute (as that attribute in reality is never
9598         applied) and return the string constant for the IndexerName
9599         attribute. 
9600
9601         * class.cs (TypeContainer.Emit): Validate that all the indexers
9602         have the same IndexerName attribute, and if so, set the
9603         DefaultName attribute on the class. 
9604
9605         * typemanager.cs: The return value might contain other stuff (not
9606         only methods).  For instance, consider a method with an "Item"
9607         property and an Item method.
9608
9609         * class.cs: If there is a problem with the parameter types,
9610         return. 
9611
9612 2002-05-24  Ravi Pratap  <ravi@ximian.com>
9613
9614         * ecore.cs (ImplicitConversionExists): Wrapper function which also
9615         looks at user defined conversion after making a call to 
9616         StandardConversionExists - we need this for overload resolution.
9617
9618         * expression.cs : Update accordingly the various method calls.
9619
9620         This fixes 2 bugs filed against implicit user defined conversions 
9621
9622 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
9623
9624         * statement.cs: Track the result of the assignment.
9625
9626 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
9627
9628         * expression.cs (MemberAccess): Improved error reporting for
9629         inaccessible members.
9630
9631 2002-05-22  Martin Baulig  <martin@gnome.org>
9632
9633         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
9634         itself with debugging support.
9635
9636 2002-05-22  Martin Baulig  <martin@gnome.org>
9637
9638         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
9639         Removed, this isn't needed anymore.
9640
9641 2002-05-20  Martin Baulig  <martin@gnome.org>
9642
9643         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
9644         be underlying type for an enum.
9645
9646 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
9647
9648         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
9649         that splits out the loading of just the core types.
9650
9651         * rootcontext.cs (ResolveCore): Split the struct resolution in
9652         two, so we can load the enumeration underlying types before any
9653         enums are used.
9654
9655         * expression.cs (Is): Bandaid until we fix properly Switch (see
9656         bug #24985 for details).
9657
9658         * typemanager.cs (ImplementsInterface): The hashtable will contain
9659         a null if there are no interfaces implemented.
9660
9661 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
9662
9663         * cs-parser.jay (indexer_declarator): It is fine to have array
9664         parameters
9665
9666 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
9667
9668         * typemanager.cs: (RegisterBuilder): New function used to register
9669         TypeBuilders that implement interfaces.  Since
9670         TypeBuilder.GetInterfaces (as usual) does not work with lame
9671         Reflection.Emit. 
9672         (AddUserType): register interfaces.
9673
9674         (ImplementsInterface): Use the builder_to_ifaces hash if we are
9675         dealing with TypeBuilder.  Also, arrays are showing up as
9676         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
9677         methods can not be invoked on them!
9678
9679         * ecore.cs (ExplicitReferenceConversionExists): Made public.
9680         (ImplicitReferenceConversionExists): Split out from
9681         StandardConversionExists. 
9682
9683         * expression.cs (As): We were only implementing one of the three
9684         cases for the as operator.  We now implement them all.
9685         (Is): Implement the various other cases for Is as well.
9686
9687         * typemanager.cs (CACHE): New define used to control if we want or
9688         not the FindMembers cache.  Seems to have a negative impact on
9689         performance currently
9690
9691         (MemberLookup): Nested types have full acess to
9692         enclosing type members
9693
9694         Remove code that coped with instance/static returns for events, we
9695         now catch this in RealFindMembers.
9696
9697         (RealFindMembers): only perform static lookup if the instance
9698         lookup did not return a type or an event.  
9699
9700 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
9701
9702         * assign.cs (CompoundAssign): We pass more semantic information
9703         now to Compound Assignments than we did before: now we have all
9704         the information at hand, and now we resolve the target *before* we
9705         do the expression expansion, which allows the "CacheValue" method
9706         to have the effect we intended (before, a [x] += 1 would generate
9707         two differen ArrayAccess expressions from the ElementAccess,
9708         during the resolution process).
9709
9710         (CompoundAssign.DoResolve): Resolve target and original_source here.
9711
9712 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
9713
9714         * expression.cs (ArrayAccess): dropped debugging information. 
9715
9716         * typemanager.cs: Small bug fix: I was always returning i_members,
9717         instead of one of i_members or s_members (depending on which had
9718         the content).
9719
9720         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
9721         method is invoked before any code generation takes place, and it
9722         is a mechanism to inform that the expression will be invoked more
9723         than once, and that the method should use temporary values to
9724         avoid having side effects
9725
9726         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
9727
9728         * ecore.cs (Expression.CacheTemporaries): Provide empty default
9729         implementation.
9730
9731         * expression.cs (Indirection, ArrayAccess): Add support for
9732         CacheTemporaries in these two bad boys. 
9733
9734         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
9735         ldobj or ldind_ref.  
9736         (StoreFromPtr): Handle stobj as well.
9737
9738         * expression.cs (UnaryMutator): Share more code.
9739
9740         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
9741         down: I was not tracking the Filter function as well, which
9742         was affecting the results of the cache.
9743
9744 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
9745
9746         * attribute.cs: Remove the hack to handle the CharSet property on
9747         StructLayouts. 
9748
9749 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
9750
9751         * attribute.cs (DoResolve): More uglyness, we now only try to
9752         resolve the attribute partially, to extract the CharSet
9753         information (only if we are a StructLayout attribute).  Otherwise 
9754
9755         (GetExtraTypeInfo): Add some code to conditionally kill in the
9756         future this.   I am more and more convinced that the .NET
9757         framework has special code to handle the attribute setting on
9758         certain elements.
9759
9760         * expression.cs (IsParamsMethodApplicable): Revert my previous
9761         foreach change here, it was wrong.
9762
9763 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
9764
9765         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
9766         (pp_expr): do not abort on unknown input, just return.
9767         (eval): abort if there are pending chars.
9768
9769         * attribute.cs (Attribute.Resolve): Positional parameters are
9770         optional.  Deal with that case.
9771
9772         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
9773         the Ansi/Unicode/Auto information for the type.
9774
9775         (TypeContainer.DefineType): instantiate the EmitContext here, as
9776         we will be using it during the type definition (to resolve
9777         attributes) and during the emit phase.
9778
9779         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
9780         to pull type information out of the attributes
9781
9782         (Attribute.Resolve): track the constructor builder, and allow for
9783         multiple invocations (structs and classes will use this).
9784
9785         * ecore.cs (MemberLookupFinal): new version with all the
9786         parameters customizable.
9787
9788         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
9789         constructors.  Return if the result value is null (as the error
9790         would have been flagged already by MemberLookupFinal)
9791
9792         Do not allow instances of abstract classes or interfaces to be
9793         created.
9794
9795         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
9796         We have to compare the assembly property here when dealing with
9797         FamANDAssem and Assembly access modifiers, because we might be
9798         creating an assembly from *modules* (that means that we are not
9799         getting TypeBuilders for types defined in other modules that are
9800         part of this assembly).
9801
9802         (Method.Emit): If the method is marked abstract and has a body,
9803         emit an error. 
9804
9805         (TypeContainer.DefineMembers): If both the defined member and the
9806         parent name match are methods, then do not emit any warnings: let
9807         the Method.Define routine take care of flagging warnings.  But if
9808         there is a mismatch (method overrides something else, or method is
9809         overriwritten by something, then emit warning).
9810
9811         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
9812         set to null, this means `do not check for the return type on the
9813         signature'. 
9814
9815         (Method.Define): set the return type for the method signature to
9816         null, so that we get methods with the same name and parameters and
9817         different return types.  This is used to flag warning 114 (you are
9818         hiding a method, and you probably want to use the new/override
9819         keywords instead).
9820
9821         * typemanager.cs (MemberLookup): Implemented proper access
9822         control, closing a long standing set of bug reports.  The problem
9823         was that the Framework only has two bits: Public and NonPublic,
9824         and NonPublic includes private and protected methods, but we need
9825         to enforce the FamANDAssem, FamOrAssem and Family. 
9826
9827 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
9828
9829         * statement.cs (GotoCase): Return true: Ammounts to giving up
9830         knowledge on whether we return or not, and letting the other case
9831         be responsible for it.
9832
9833 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
9834
9835         * driver.cs: Do not load directories for each file processed, only
9836         do it if there is a pattern.
9837
9838         * ecore.cs: Report readonly assigns here as well, as we might have
9839         been resolved only by MemberAccess.
9840
9841         (SimpleName.SimpleNameResolve): Also be useful for LValue
9842         resolution.   We need this to propagate assign to local readonly variables
9843
9844         * typemanager.cs: Use a ptrhashtable for the criteria, because we
9845         do not want to reuse potential criteria memory.
9846
9847         * class.cs (MyEventBuilder): Set reflected_type;
9848
9849         * ecore.cs (Constantify): Added support for constifying bools.
9850
9851         (RootContext.LookupType): Added a cache for values looked up in
9852         the declaration space.
9853
9854         * typemanager.cs (FindMembers): Now is a front-end to
9855         RealFindMembers, and provides a two-level hashtable-based cache to
9856         the request.  
9857
9858         15% performance improvement: from 22.5 to 19.2 seconds.
9859
9860         * expression.cs (IsParamsMethodApplicable): use foreach.
9861         (Invocation.DoResolve): ditto.
9862         (New.DoResolve): ditto.
9863         (ArrayCreation.DoResolve): ditto.
9864
9865         * ecore.cs (FindMostEncompassingType): use foreach.
9866
9867         * delegate.cs (NewDelegate.DoResolve): Use foreach
9868
9869         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
9870         (RemoveMethods): use foreach.
9871
9872         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
9873         nested foreach statements instead of for, and also break out of
9874         the inner loop once a match is found.
9875
9876         (Invocation.OverloadResolve): Use foreach, simplify the code. 
9877
9878 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
9879
9880         * cfold.cs (BinaryFold): During an enumeration evaluation context,
9881         we actually unwrap the expression to allow for extra information
9882         to be extracted. 
9883
9884         * expression.cs: Use Shr_Un on unsigned operations. 
9885
9886 2002-05-08  Ravi Pratap  <ravi@ximian.com>
9887
9888         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
9889         applicable operators was not being considered correctly. This closes
9890         the bug Miguel reported.
9891
9892 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
9893
9894         * attribute.cs: check that the type derives from System.Attribute
9895         and report the correct error in that case (moved the duplicate code to
9896         its own method, too).
9897
9898 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
9899
9900         * attribute.cs: lookup attribute type name as the spec says: first the
9901         bare attribute name and then name + "Attribute" (nant compiles with
9902         mcs after this fix).
9903
9904 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
9905
9906         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
9907         Because of the way we parse things, we should try to see if a
9908         UIntConstant can fit in an integer.
9909
9910 2002-05-07  Ravi Pratap  <ravi@ximian.com>
9911
9912         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
9913         when we are in an explicit context.
9914
9915         (ConvertReferenceExplicit): When converting from Iface type S to Class
9916         T make sure the rules are implemented as an OR.
9917
9918         * parameter.cs (ParameterType): Make it a property for now although the
9919         purpose really isn't anything immediate.
9920
9921         * expression.cs (Is*Applicable): Do better checking on the parameter type
9922         of a ref/out parameter. The ones from the system assemblies are already 
9923         marked with the correct type so we don't need to do any correction.
9924
9925         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
9926         the object type is standard too so include that.
9927
9928 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
9929
9930         * ecore.cs (StandardConversionExists): Augment with missing code:
9931         deal with IntConstant, LongConstants and Enumerations.
9932
9933         * assign.cs: Report the error, instead of failing silently
9934
9935         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
9936         typecontainer that they are declared, because the
9937         typecontainer/namespace will have the list of using clauses that
9938         need to be applied.
9939
9940         Assembly Attributes were escaping the normal registration
9941         mechanism. 
9942
9943         (EmitCode): Apply attributes within an EmitContext that represents
9944         the container they were declared on.
9945
9946         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
9947
9948 2002-05-06  Ravi Pratap  <ravi@ximian.com>
9949
9950         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
9951         Revamp completely - make much cleaner as we now operate only
9952         on a set of Types.
9953
9954         (FindMostSpecificSource, FindMostSpecificTarget): New methods
9955         to implement the logic detailed in the spec more correctly.
9956
9957         (UserDefinedConversion): Update accordingly.
9958
9959 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
9960
9961         * statement.cs: Return flow analysis information up.
9962
9963         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
9964         and the default.
9965
9966         (token): Do not consume an extra character before calling
9967         decimal_digits.
9968
9969 2002-05-06  Piers Haken <piersh@friskit.com>
9970
9971         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
9972
9973 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
9974
9975         * class.cs (Constructor.Emit): Set the IsStatic flag in the
9976         EmitContext during the instance constructor initializer
9977         resolution, to stop access to instance variables.
9978
9979         This is mandated by the spec, last paragraph of the `constructor
9980         initializers' section. 
9981
9982 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
9983
9984         * cs-parser.jay, class.cs (Accessor): new class used to represent
9985         an accessor (get or set).  In the past we used `null' to represent
9986         a missing accessor.  But this is ambiguous because there was no
9987         way to tell in abstract indexers/properties if one of them was
9988         specified.
9989
9990         Now there is a way of addressing that.
9991
9992         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
9993         instead of FindMembers.
9994
9995         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
9996         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
9997
9998         * attribute.cs: Treat indexers and properties as the same in terms
9999         of applying attributes
10000
10001         * ecore.cs (FindMostEncompassedType): Use statically initialized
10002         EmptyExpressions()s like we do elsewhere to avoid creating useless
10003         objects (and we take this out of the tight loop).
10004
10005         (GetConversionOperators): Move the code to extract the actual
10006         operators to a separate routine to clean things up.
10007
10008 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
10009
10010         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
10011         events are always registered FieldBuilders.
10012
10013         * class.cs (FieldBase): New class shared by Fields 
10014
10015         * delegate.cs: If we are a toplevel delegate, use our full name.
10016         If we are a nested delegate, then only use our tail name.
10017
10018 2002-05-02  Ravi Pratap  <ravi@ximian.com>
10019
10020         * expression.cs (IsApplicable): Ensure that we add the "&" to
10021         ref/out types before comparing it with the type of the argument.
10022
10023         (IsParamsMethodApplicable): Ditto.
10024
10025         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
10026         silly me ;-)
10027
10028         * delegate.cs : Handle the case when we have more than one applicable
10029         method. Flag an error only when we finish checking all.
10030
10031 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
10032
10033         * expression.cs: Add support for boolean static initializers.
10034
10035 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
10036
10037         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
10038
10039         * parameter.cs (ComputeParameterTypes,
10040         ComputeAndDefineParameterTypes): Better error handling: now we
10041         clear the `types' cache if we fail during any of the type lookups.
10042         We also return the status code correctly to our caller
10043
10044         * delegate.cs: If we fail to define a delegate, abort the extra
10045         steps. 
10046
10047         * expression.cs (Binary.ResolveOperator): for
10048         operator==(object,object) and operator !=(object, object) we also
10049         have to verify that there is an implicit conversion from one to
10050         the other.
10051
10052         (ArrayAccess.DoResolve): Array Access can operate on
10053         non-variables. 
10054
10055 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
10056
10057         * assign.cs (CompoundAssign): A new class used as a "flag" that
10058         the assignment actually is happening as part of a compound
10059         assignment operator.
10060
10061         During compound assignment, a few new rules exist to enable things
10062         like:
10063
10064         byte b |= 1 + 2
10065
10066         From the spec:
10067
10068         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
10069         to the type of x) if y is implicitly convertible to the type of x,
10070         and the operator is a builtin operator and the return type of the
10071         operator is explicitly convertible to the type of x. 
10072
10073         * rootcontext.cs: Reset warning level to 2.  4 catches various
10074         "interesting" features in mcs, we must clean this up at some
10075         point, but currently am trying to kill other bugs ;-)
10076
10077         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
10078         in container classes as well.  
10079
10080         * expression.cs (Binary.ResolveOperator): Handle string case
10081         before anything else (as operator overloading does emit an error
10082         before doing anything else).
10083
10084         This code could go away when we move to a table driven model, but
10085         i could not come up with a good plan last night.
10086
10087 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
10088
10089         * typemanager.cs (CSharpName): reimplementation using regex.
10090         * class.cs: added null check for fields in Emit
10091         * rootcontext.cs: set warninglevel to 4
10092
10093 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
10094
10095         * typemanager.cs (CSharpName): reimplemented with Lupus
10096         suggestion.
10097
10098 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
10099
10100         * statement.cs (If): correclty implement Resolve, because we were
10101         not catching sem errors in there.  The same process is needed
10102         everywhere else. 
10103         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
10104
10105
10106         (Statement.Warning_DeadCodeFound): Factorize code.
10107         (While): Report dead code here too.
10108
10109         (Statement): Added Resolve virtual method to allow
10110         for resolution split from the emit code.
10111
10112 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
10113
10114         * statement.cs (EmitBoolExpression): No longer try to resolve the
10115         expression here.    
10116         (MakeBoolean): New utility function that resolve, implicitly
10117         converts to boolean and tags the expression. 
10118
10119
10120         (If, Do): Implement dead code elimination.
10121         (While): Implement loop inversion
10122
10123         (Do, While, For, If): Resolve the expression prior to calling our
10124         code generation.
10125
10126 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
10127
10128         * class.cs:
10129           - added method Report28 (warning: program has more than one entry point)
10130           - added method IsEntryPoint, implements paragraph 10.1 of the spec
10131           - modified method Method.Define, the part at the end of the method
10132
10133         * rootcontext.cs: added static public Location EntryPointLocation;
10134           
10135         * ../errors/cs0028.cs : Add test case for the above warning.              
10136
10137         * typemanager.cs:
10138           - modified method CSharpName to allow arrays of primitive type to
10139             be printed nicely (e.g. instead of System.Int32[][] it now prints
10140             int[][])
10141           - added method CSharpSignature: returns the signature of a method
10142             in string format to be used in reporting errors, warnings, etc.
10143
10144         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
10145         with String.Empty.
10146
10147 2002-04-26  Ravi Pratap  <ravi@ximian.com>
10148
10149         * delegate.cs (Define): Fix extremely silly bug where I was
10150         setting the type of the 'object' parameter of the BeginInvoke
10151         method to System.IAsyncResult instead of System.Object ;-)
10152
10153 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
10154
10155         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
10156         here. 
10157
10158         (Constructor.Emit): return if we fail to initialize the
10159         constructor.  Another door closed!  
10160
10161         * expression.cs (New.DoResolve): Improve error message (from -6 to
10162         1501).  Use DeclaredOnly lookup to find the exact constructor.
10163
10164         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
10165         loop.  This is useful.
10166
10167         * cs-parser.jay: Adjust the default parameters so that destructors
10168         have the proper signature.
10169
10170 2002-04-26  Martin Baulig  <martin@gnome.org>
10171
10172         * driver.cs (LoadAssembly): If `assembly' contains any characters
10173         which are only valid in path names and not in assembly names
10174         (currently slash, backslash and point), use Assembly.LoadFrom ()
10175         instead of Assembly.Load () on the `assembly' (before iteration
10176         over the link_paths).
10177
10178 2002-04-26  Martin Baulig  <martin@gnome.org>
10179
10180         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
10181
10182 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
10183
10184         * class.cs (Property): use the new typemanager.MemberLookup
10185
10186         (TypeContainer.MemberLookup): Implement using the
10187         TypeManager.MemberLookup now. 
10188
10189         * typemanager.cs: Make MemberLookup a function of the TypeManager,
10190         and return MemberInfos, so that these can be used without an
10191         EmitContext (what we had before).
10192
10193 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
10194
10195         * expression.cs: Fix the case where the argument to params if the
10196         type of the params.  I omitted handling this before.   Fixed
10197
10198 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
10199
10200         * driver.cs: Call BootCorlib_PopulateCoreType
10201
10202         * class.cs (Property.CheckBase): Check for properties only, not
10203         for all members. 
10204
10205         * interface.cs: Temporary hack: try/catch around the
10206         CustomAttributeBuilder, because I am getting an exception that I
10207         do not understand.
10208
10209         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
10210         types whose definitions are required to be there (attributes are
10211         defined before standard types).
10212
10213         Compute definitions as we boot the various types, as they are used
10214         immediately (value_type class will need object_type, but if we do
10215         not initialize object_type, we will pass a null, which will let
10216         the runtime pick the System.Object from the existing corlib, which
10217         is not what we want).
10218
10219 2002-04-22  Patrik Torstensson <totte@labs2.com>
10220
10221         * cs-tokenizer.cs: fixed a number of trim() issues.
10222
10223 2002-04-22  Ravi Pratap  <ravi@ximian.com>
10224
10225         * expression.cs (Argument.Type): Ensure that we return the correct
10226         type when we have out or ref parameters [in which case we 
10227         append a "&"].
10228
10229 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
10230
10231         * class.cs (Property, Indexer): Allow extern modifier in there. 
10232
10233         * typemanager.cs (InitBaseTypes): Initializes object_type and
10234         value_type, since those will be used early on during the bootstrap
10235         process to compile corlib.
10236
10237         (InitCoreTypes): Move code from here to InitBaseTypes.
10238
10239 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
10240
10241         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
10242         single-dimension arrays as using the ldlen opcode.  
10243
10244         Daniel Lewis discovered this optimization.  
10245
10246         * typemanager.cs: Add signature for System.Array::get_Length
10247
10248 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10249
10250         * statement.cs: report the error when the foreach does not apply to an
10251         array nor a collection.
10252
10253 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
10254
10255         * expression.cs: Add implicit conversions to the operator ~.
10256
10257         * constant.cs (DecimalConstant.Emit): Emit decimal value.
10258
10259         * typemanager.cs: Locate the decimal constructor.
10260
10261 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10262
10263         * attribute.cs: use the new property of TypeOf.
10264         * expression.cs: added 'get' property around typearg.
10265
10266         These changes fix a build breaker reported by NickD. Is this the
10267         correct way to fix?  If not, please, revert my changes and make it
10268         work :-).
10269
10270 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
10271
10272         * attribute.cs: Add support for typeof in attribute invocations.
10273         I am not sure that this is right though.
10274
10275 2002-04-14  Duncan Mak  <duncan@ximian.com>
10276
10277         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
10278         Binary.Operator.Division case.
10279
10280 2002-04-13  Ravi Pratap  <ravi@ximian.com>
10281
10282         * class.cs (DefineType): Ensure that we do a proper check on
10283         attribute types and also register it with the TypeManager.
10284
10285         (TypeContainer.Targets): The default for attribute types is
10286         AttributeTargets.All.
10287
10288         * attribute.cs (ApplyAttributes): Registering the attribute type
10289         is done elsewhere, not when we discover we have a Usage attribute.
10290
10291 2002-04-12  Ravi Pratap  <ravi@ximian.com>
10292
10293         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
10294         and get rid of is_delegate parameter.
10295
10296         * everywhere : update.
10297
10298 2002-04-12  Ravi Pratap  <ravi@ximian.com>
10299
10300         * cs-parser.jay (compilation_unit): Revamp completely to use
10301         some new ideas that I got from Rhys' grammar to solve the problems
10302         with assembly level attributes.
10303
10304         (outer_declaration): New grammar production.
10305
10306         (attribute_sections): Add.
10307
10308         (opt_attributes): Base on attribute_sections
10309
10310         (namespace_declaration): Allow opt_attributes to tackle the case
10311         when we have assembly level attributes - we are clever in this
10312         regard now ;-)
10313
10314         * attribute.cs (ApplyAttributes): Do not worry about assembly 
10315         attributes in the non-global context.
10316
10317         * rootcontext.cs (AddGlobalAttributes): Go back to using this
10318         instead of SetGlobalAttributes.
10319
10320         * class.cs, rootcontext.cs : Ensure we define and generate 
10321         attribute types before anything else.
10322
10323         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
10324         and flag the new error -20 for the case when the attribute type
10325         does not have valid targets specified. csc does not catch this.
10326
10327         * ../errors/errors.txt : update for error # -20
10328
10329 2002-04-11  Ravi Pratap  <ravi@ximian.com>
10330
10331         * support.cs (InternalParameters.ParameterModifier): Do some null
10332         checking and return sane values.
10333
10334         * class.cs (Method.Define): If we are a PInvoke method, ensure
10335         that we are static and extern. Report error # 601
10336
10337         * ../errors/cs0601.cs : Add test case for the above error.
10338
10339 2002-04-07  Ravi Pratap  <ravi@ximian.com>
10340
10341         * rootcontext.cs (attribute_types): We need to keep type of
10342         all attribute types separately and emit code for them first.
10343
10344         (RegisterAttribute) : Implement.
10345
10346         * class.cs (DefineType): Check if the current Type is a custom
10347         attribute type and register it accordingly.
10348
10349         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
10350         adding the first attribute twice and rename to
10351
10352         (SetGlobalAttributes): this.
10353
10354         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
10355         lookups.
10356
10357         * attribute.cs (ApplyAttributes): Take an additional argument telling us
10358         if we are processing global arguments. Hmm, I am unsure of this.
10359
10360 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10361
10362         * expression.cs: added static array of strings to avoid calling
10363         Enum.ToString () for Operator in Binary. Significant recover of
10364         performance.
10365
10366 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
10367
10368         * class.cs (FindMembers): Allow the Builders of the various
10369         members to be null.  If they are skip them.  This only happens
10370         during the PInvoke declaration.
10371
10372 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
10373
10374         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
10375         failure, so we do not keep going afterwards.
10376
10377         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
10378         wanted to pass `false' as the `is_delegate' argument.  If this is
10379         the case, why not use delegate_type == null to mean `is_delegate =
10380         false' and anything else as is_delegate = true.
10381
10382 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
10383
10384         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
10385         code for the section, not the beginning of the tests.
10386
10387 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
10388
10389         * cfold.cs: Handle operator + (Enum x, Underlying x) 
10390
10391         * expression.cs (Binary): same.  Warn about errors where we have
10392         Enum/Enum in operator + as well.
10393
10394 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
10395
10396         * statement.cs:
10397                 - added support for switch(bool)
10398                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
10399                 - add TableSwitchEmit() to handle table-based switch statements
10400
10401 2002-04-05  Ravi Pratap  <ravi@ximian.com>
10402
10403         * expression.cs (Invocation.OverloadResolve): Factor out code which
10404         does parameter compatibility checking with arguments so that we can 
10405         re-use the code even from Delegate.VerifyApplicability
10406
10407         (VerifyArgumentsCompat): Move above code here.
10408
10409         * delegate.cs (VerifyApplicability): Get rid of duplicate code
10410         and instead make a call to the above method.
10411
10412 2002-03-31  Ravi Pratap  <ravi@ximian.com>
10413
10414         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
10415         We use it to keep track of classes which are attribute types.
10416
10417 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
10418
10419         * delegate.cs (Delegate.Define): Correctly define the types in the
10420         presence of fixed and array parameters.
10421
10422         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
10423         doing FindMembers.
10424
10425         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
10426         include NonPublic after the first iteration.
10427
10428         * class.cs (Indexer.CheckBase): Only check if both parents are
10429         non-null. 
10430
10431         * cs-parser.jay (accessor_body): If empty, set to null.
10432
10433         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
10434         same code path here to resolve constants names that we did have in
10435         MemberAccess.DoResolve.  There is too much code duplicated here.
10436
10437 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
10438
10439         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
10440
10441         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
10442         to MakeUnionSet.
10443
10444         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
10445         tokens, numbers and strings.
10446
10447         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
10448         parenthesis.
10449
10450         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
10451         asyncronous parameters and the regular parameters.  
10452
10453         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
10454         specify the target directory.
10455
10456         * expression.cs: (This.DoResolve): Simplify
10457         (As.Emit): Optimize, do not generate IsInst if the expression is
10458         always of the given type.
10459
10460         (Is.DoResolve): Bug fix, we were reporting both always/never for
10461         the is expression.
10462
10463         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
10464         creating too many unnecessary arrays.
10465
10466 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
10467
10468         * class.cs (EmitFieldInitializer): Use Assign expression to assign
10469         fields instead of rolling our own initializer.   Takes care of all
10470         implicit conversions, and drops unnecessary static checks/argument.
10471
10472 2002-03-31  Dick Porter  <dick@ximian.com>
10473
10474         * driver.cs: use the GetDirectories() return values properly, and
10475         use "/" as path separator.
10476
10477 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
10478
10479         * expression.cs (Unary): Optimize - - expr into expr.
10480         (Binary): Optimize a + (-b) into a -b.
10481
10482         * codegen.cs (CodeGen): Made all methods static.
10483
10484 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
10485
10486         * rootcontext.cs: 
10487
10488         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
10489         TypeBuilder property.
10490
10491         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
10492         instead. 
10493
10494         * tree.cs: Removed the various RecordXXXX, and replaced with a
10495         single RecordDecl.  Removed all the accessor methods, and just
10496         left a single access point Type 
10497
10498         * enum.cs: Rename DefineEnum to DefineType.
10499
10500         * decl.cs: New abstract method `DefineType' used to unify the
10501         Defines for Enumerations, Interfaces, TypeContainers and
10502         Delegates.
10503
10504         (FindType): Moved LookupInterfaceOrClass here.  Moved the
10505         LookupBaseClasses method that used to live in class.cs and
10506         interface.cs here, and renamed to FindType.
10507
10508         * delegate.cs: Implement DefineType.  Take advantage of the
10509         refactored pattern for locating the parent builder without taking
10510         the parent_builder argument (which we know does not work if we are
10511         nested, and triggering a toplevel definition).
10512
10513 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
10514
10515         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
10516         accessibility of a member has changed during override and report
10517         an error if so.
10518
10519         * class.cs (Method.Define, Property.Define): Only complain on
10520         overrides if the method is private, any other accessibility is
10521         fine (and since we just checked the permission is the same, we are
10522         good to go).
10523
10524         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
10525         and elif are processed always.  The other pre-processing
10526         directives are only processed if we are "taking" the path
10527
10528 2002-03-29  Martin Baulig  <martin@gnome.org>
10529
10530         * class.cs (Method.Emit): Only emit symbolic debugging info if the
10531         current location is not Null.
10532
10533         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
10534         a separate method so we can profile it.
10535
10536         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
10537         `span.Seconds' are just seconds, but no minutes or hours.
10538         (MainDriver): Profile the CodeGen.SaveSymbols calls.
10539
10540 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
10541
10542         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
10543         Remove the gratuitous set of Final:
10544
10545                                 // If an interface implementation, then we can set Final.
10546                                 if (((flags & MethodAttributes.Abstract) == 0) &&
10547                                     implementing.DeclaringType.IsInterface)
10548                                         flags |= MethodAttributes.Final;
10549
10550         I do not know what I was smoking when I used that.
10551
10552
10553         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
10554         step into fixing the name resolution issues for delegates and
10555         unifying the toplevel name resolution.
10556
10557 2002-03-28  Martin Baulig  <martin@gnome.org>
10558
10559         * class.cs (Method.Emit): If we have a symbol writer, call its
10560         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
10561         tell it about the current method.
10562
10563         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
10564         writer that we're going to emit the first byte of IL code for a new
10565         statement (a new source line).
10566         (EmitContext.EmitTopBlock): If we have a symbol writer, call
10567         EmitContext.Mark() before emitting any code.
10568
10569         * location.cs (SymbolDocument): Return null when we're Null.
10570
10571         * statement.cs (Statement): Moved the `Location loc' variable here.
10572         (Statement.EmitBoolExpression): If we have a symbol writer, call
10573         ec.Mark() before emitting any code to tell it that we're at the
10574         beginning of a new statement.
10575         (StatementExpression): Added `Location' argument to the constructor.
10576         (Block): Added public readonly variable `StartLocation' and public
10577         variable `EndLocation'.  The latter is to be set using SetEndLocation().
10578         (Block): Added constructor which takes a start and end location.
10579         (Block.SetEndLocation): New method. This sets the end location.
10580         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
10581         local variables we create.
10582         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
10583         each statement and do also mark the begin and end of the block.
10584
10585         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
10586         tell it the current lexer.Location, use Location.Null for the end of the
10587         block.
10588         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
10589         current block, set its end location using SetEndLocation().
10590         (statement_expression): StatementExpression constructor now takes the
10591         lexer.Location as additional argument.
10592         (for_statement, declare_local_variables): Likewise.
10593         (declare_local_variables): When creating a new implicit block, use the
10594         new Block constructor and pass it the lexer.Location.
10595
10596 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
10597
10598         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
10599         members also on the parent interfaces recursively.
10600
10601 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
10602
10603         * report.cs: Use new formats, since Gonzalo finished the missing
10604         bits. 
10605
10606         * expression.cs (Binary.ResolveOperator): added missing operator|
10607         operator& and operator^ for bool/bool.
10608
10609         * cs-parser.jay: CheckDef now takes a Location argument that is
10610         used to report errors more precisly (instead of reporting the end
10611         of a definition, we try to track something which is a lot closer
10612         to the source of the problem).
10613
10614         * cs-tokenizer.cs: Track global token use, so we can properly flag
10615         the use of #define/#undef after the first token has been seen.
10616
10617         Also, rename the reportXXXX to Error_DescriptiveName
10618
10619         * decl.cs (DeclSpace.IsTopLevel): Move property here from
10620         TypeContainer, so that Enum and Interface can use this too.
10621
10622         * class.cs (TypeContainer.LookupInterfaceOrClass,
10623         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
10624         `builder' argument.  Typically this was used to pass the parent
10625         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
10626         the definition).  
10627
10628         The problem is that a nested class could trigger the definition of
10629         a toplevel class, and the builder would be obviously wrong in that
10630         case. 
10631
10632         So we drop this argument, and we compute dynamically the
10633         TypeBuilder/ModuleBuilder (the correct information was available
10634         to us anyways from DeclSpace.Parent)
10635
10636         * interface.cs (Interface.DefineInterface): Drop builder
10637         parameter cleanup like class.cs
10638
10639         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
10640         like class.cs
10641
10642         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
10643         values. 
10644
10645         (Try.Emit): Propagate the returns value from the statement.
10646
10647         (Return.Emit): Even if we are leavning 
10648
10649         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
10650
10651         * modifiers.cs: Fix the computation of MethodAttributes flags.
10652
10653 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
10654
10655         * driver.cs: allow compilation of files that start with '/'.
10656         Add a default case when checking the argument of --target.
10657
10658 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
10659
10660         * interface.cs: Implement the same search algorithm for types in
10661         the interface code.
10662
10663         * delegate.cs: Do not allow multiple definition.
10664
10665         * Recovered ChangeLog that got accidentally amputated
10666
10667         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
10668
10669         * rootcontext.cs: Load manually enum to allow core classes to
10670         contain enumerations.
10671
10672         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
10673         Update to new static methods in TypeManager.
10674
10675         * typemanager.cs (GetMethod, GetConstructor): Use our
10676         implementation of FindMembers to find the members, since during
10677         corlib compilation, the types are TypeBuilders and GetMethod and
10678         GetConstructor do not work.
10679
10680         Make all methods in TypeManager static.
10681
10682         (InitCodeHelpers): Split the functionality from
10683         the InitCodeTypes function.
10684
10685         * driver.cs: Call InitCodeHelpers after we have populated the
10686         types. 
10687
10688         * cs-parser.jay (delegate_declaration): we did not used to compute
10689         the delegate name correctly for void delegates.
10690
10691 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
10692
10693         * rootcontext.cs (RootContext): Init the interface_resolve_order
10694         and type_container_resolve_order always.
10695
10696         (ResolveCore, BootstrapCorlib_ResolveClass,
10697         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
10698         compiler when compiling with --nostdlib
10699
10700         * class.cs (TypeContainer.DefineType): Check that our parent is
10701         not null.  This test is most important when we are bootstraping
10702         the core types.
10703
10704         * codegen.cs: Split out the symbol writing code.
10705
10706 2002-03-25  Martin Baulig  <martin@gnome.org>
10707
10708         * driver.cs (-g): Made -g an alias for --debug.
10709
10710 2002-03-24  Martin Baulig  <martin@gnome.org>
10711
10712         * codegen.cs (SymbolWriter): New public variable. Returns the
10713         current symbol writer.
10714         (CodeGen): Added `bool want_debugging_support' argument to the
10715          constructor. If true, tell the ModuleBuild that we want debugging
10716         support and ask it for the ISymbolWriter.
10717         (Save): If we have a symbol writer, call it's Close() method after
10718         saving the assembly.
10719
10720         * driver.c (--debug): New command line argument to create a
10721         debugger information file.
10722
10723         * location.cs (SymbolDocument): New public property. Returns an
10724         ISymbolDocumentWriter object for the current source file or null
10725         if we don't have a symbol writer.
10726
10727 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
10728
10729         * driver.cs (LoadAssembly): Correctly return when all the paths
10730         have been tried and not before.
10731
10732         * statement.cs (Switch.Emit): return the actual coverage for this
10733         statement (returns/not-returns)
10734
10735         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
10736         switch of the statement if we are the last switch section.  That
10737         kills two problems: try/catch problems (we used to emit an empty
10738         nop at the end) and switch statements where all branches would
10739         return. 
10740
10741 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
10742
10743         * driver.cs: Add default assemblies (the equivalent to the
10744         Microsoft CSC.RSP file)
10745
10746         * cs-tokenizer.cs: When updating `cols and setting it to zero,
10747         also update tokens_seen and set it to false.
10748
10749         * driver.cs: Implement --recurse for Mike.
10750
10751         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
10752         correctly splitting out the paths.
10753
10754 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
10755
10756         * interface.cs (Interface.PopulateProperty): Instead of using
10757         `parent' as the declaration space for the set parameters, use
10758         `this' 
10759
10760         * support.cs (InternalParameters): InternalParameters constructor
10761         takes a DeclSpace instead of a TypeContainer.
10762
10763         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
10764         types are being initialized, load the address of it before calling
10765         the function.  
10766
10767         (New): Provide a mechanism to disable the generation of local
10768         value type temporaries when the caller will be providing us with
10769         an address to store it.
10770
10771         (ArrayCreation.EmitDynamicInitializers): Use it.
10772
10773 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
10774
10775         * expression.cs (Invocation.EmitArguments): Only probe for array
10776         property if there is more than one argument.  Sorry about that.
10777
10778         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
10779         empty param arrays.
10780
10781         * class.cs (Method.LabelParameters): Fix incorrect code path that
10782         prevented the `ParamArrayAttribute' from being applied to the
10783         params attribute.
10784
10785 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
10786
10787         * support.cs (ReflectionParameters): Correctly compute whether the
10788         last argument is a params array.  Fixes the problem with
10789         string.Split ('a')
10790
10791         * typemanager.cs: Make the assemblies array always be non-null
10792         (empty, but non-null)
10793
10794         * tree.cs (RecordDecl): New function that abstracts the recording
10795         of names.  This reports error 101, and provides a pointer to the
10796         previous declaration.  Fixes a crash in the compiler.
10797
10798         * cs-parser.jay (constructor_declaration): Update to new grammar,
10799         and provide a constructor_body that can be empty.
10800
10801 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
10802
10803         * driver.cs: Add support for --resources.
10804
10805         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
10806         Make all types for the various array helper methods be integer.
10807
10808         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
10809         CheckState to ConvCast.
10810
10811         (ConvCast): Now it takes a `checked' state argument, to avoid
10812         depending on the emit context for the conversion, and just using
10813         the resolve time setting.
10814
10815         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
10816         instead of Invocation.EmitArguments.  We do not emit the original
10817         arguments, instead we emit those which have been converted to
10818         unsigned int expressions.
10819
10820         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
10821
10822         * codegen.cs: ditto.
10823
10824         * expression.cs (LocalVariableReference): Drop the use of the
10825         Store function that depended on the variable index.
10826
10827         * statement.cs (VariableInfo): Drop the `Idx' property from this
10828         class, as this is not taking into account the indexes for
10829         temporaries tat we generate during the execution, getting the
10830         indexes wrong.
10831
10832         * class.cs: First emit class initializers, then call the parent
10833         constructor. 
10834
10835         * expression.cs (Binary): Fix opcode emision.
10836         (UnaryMutator.EmitCode): Support checked code generation
10837
10838         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
10839         matches for events for both the Static and Instance scans,
10840         pointing to the same element.   Fix that.
10841
10842 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
10843
10844         * rootcontext.cs (ResolveTree): Always set the
10845         interface_resolve_order, because nested interfaces will be calling
10846         into us.
10847
10848         * class.cs (GetInterfaceOrClass): Track the same resolution
10849         process used by TypeManager.LookupType.  This fixes the nested
10850         type lookups in class declarations (separate path from
10851         LookupType). 
10852
10853         (TypeContainer.DefineType): Also define nested interfaces.
10854         (TypeContainer.RegisterOrder): New public function used to
10855         register the order in which child interfaces need to be closed.
10856
10857         Nested interfaces need to be closed after their parents have been
10858         created. 
10859
10860         * interface.cs (InterfaceAttr): Put all the logic for computing
10861         the interface attribute here. 
10862
10863         (DefineInterface): Register our interface order with the
10864         RootContext or with the TypeContainer depending on the case.
10865
10866 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
10867
10868         * cs-parser.jay: rework foreach statement to work with the new
10869         changes to the policy on SimpleNames.
10870
10871         * report.cs: support Stacktrace on warnings as well.
10872
10873         * makefile: drop --unsafe and /unsafe from the compile.
10874
10875 2002-03-13  Ravi Pratap  <ravi@ximian.com>
10876
10877         * ecore.cs (StandardConversionExists): Modify to take an Expression
10878         as the first parameter. Ensure we do null -> reference type conversion
10879         checking.
10880
10881         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
10882         temporary Expression objects.
10883
10884 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
10885
10886         * interface.cs: workaround bug in method overloading resolution
10887         (there is already a bugzilla bug for it).
10888
10889 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
10890
10891         We could also solve this problem by having a separate path for
10892         performing type lookups, instead of DoResolve, we could have a
10893         ResolveType entry point, and only participating pieces of the
10894         production (simplename, deref, array) would implement this. 
10895
10896         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
10897         signal SimpleName to only resolve type names and not attempt to
10898         resolve anything else.
10899
10900         * expression.cs (Cast): Set the flag.
10901
10902         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
10903
10904         * class.cs: Only report 108 if there is no `new' modifier.
10905
10906         * cs-parser.jay: rework foreach statement to work with the new
10907         changes to the policy on SimpleNames.
10908
10909         * report.cs: support Stacktrace on warnings as well.
10910
10911         * makefile: drop --unsafe and /unsafe from the compile.
10912
10913 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
10914
10915         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
10916         lookups here, instead of doing that at parse time.  This means
10917         that our grammar will not introduce `LocalVariableReferences' as
10918         expressions at this point.  That solves the problem of code like
10919         this:
10920
10921         class X {
10922            static void Main ()
10923            { int X = 1;
10924             { X x = null }}}
10925
10926         This is only half the fix.  The full fix requires parameters to
10927         also be handled in this way.
10928
10929         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
10930         makes the use more obvious of the DeclSpace.  The
10931         ec.TypeContainer.TypeBuilder is now only used to pull the
10932         TypeBuilder for it.
10933
10934         My theory is that I can get rid of the TypeBuilder completely from
10935         the EmitContext, and have typecasts where it is used (from
10936         DeclSpace to where it matters).  
10937
10938         The only pending problem is that the code that implements Aliases
10939         is on TypeContainer, and probably should go in DeclSpace.
10940
10941         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
10942         lookups here, instead of doing that at parse time.  This means
10943         that our grammar will not introduce `LocalVariableReferences' as
10944         expressions at this point.  That solves the problem of code like
10945         this:
10946
10947         class X {
10948            static void Main ()
10949            { int X = 1;
10950             { X x = null }}}
10951
10952         This is only half the fix.  The full fix requires parameters to
10953         also be handled in this way.
10954
10955         * class.cs (Property.DefineMethod): When implementing an interface
10956         method, set newslot, when implementing an abstract method, do not
10957         set the flag (before we tried never setting it, or always setting
10958         it, which is the difference).
10959         (Indexer.DefineMethod): same.
10960         (Method.DefineMethod): same.
10961
10962         * ecore.cs: Only set the status used flag if we get back a Field.
10963
10964         * attribute.cs: Temporary hack, so Paolo can keep working.
10965
10966 2002-03-08  Ravi Pratap  <ravi@ximian.com>
10967
10968         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
10969         the unmanaged type in the case we have a MarshalAs attribute.
10970
10971         (Resolve): Handle the case when we are parsing the special MarshalAs
10972         attribute [we need to store the unmanaged type to use later]
10973
10974         * typemanager.cs (marshal_as_attr_type): Built in type for the 
10975         MarshalAs Attribute.
10976
10977         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
10978         on parameters and accordingly set the marshalling info.
10979
10980 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
10981
10982         * class.cs: Optimizing slightly by removing redundant code after
10983         we switched to the `NoTypes' return value.
10984         (Property.DefineMethod): use NoTypes here too.
10985
10986         This fixes the bug I introduced in my last batch of changes.
10987
10988 2002-03-05  Ravi Pratap  <ravi@ximian.com>
10989
10990         * tree.cs (RecordEnum): Add. We now keep track of enums too.
10991
10992         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
10993         Enums since those are types too. 
10994
10995         * cs-parser.jay (enum_declaration): Record enums as we parse them.
10996
10997         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
10998         thanks to a call during the lookup process.
10999
11000 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
11001
11002         * statement.cs (Foreach): Lots of work to accomodate a particular
11003         kind of foreach statement that I had not kept in mind.  It is
11004         possible to have foreachs on classes that provide a GetEnumerator
11005         method that return objects that implement the "pattern" for using
11006         a foreach, there is no need to support GetEnumerator
11007         specifically. 
11008
11009         This is needed to compile nant.
11010
11011         * decl.cs: Only report 114 if the member is not `Finalize' and if
11012         the warning level is at least 2.
11013
11014         * class.cs: Moved the compare function from Method to
11015         MethodSignature. 
11016
11017         (MethodSignature.InheritableMemberSignatureCompare): Add new
11018         filter function that is used to extract inheritable methods from a
11019         class. 
11020
11021         (Method.Define): Use the new `inheritable_method_signature_filter'
11022         delegate
11023
11024         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
11025         command. 
11026
11027 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
11028
11029         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
11030
11031         * cs-parser.jay: Add opt_semicolon to the interface declaration.
11032
11033         * expression.cs: Pass location information to
11034         ConvertImplicitStandard. 
11035
11036         * class.cs: Added debugging code to track return values from
11037         interfaces. 
11038
11039 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
11040
11041         * expression.cs (Is.DoResolve): If either side of the `is' is an
11042         interface, do not flag the warning.
11043
11044         * ecore.cs (ImplicitReferenceConversion): We need a separate test
11045         for interfaces
11046
11047         * report.cs: Allow for --fatal to be used with --probe.
11048
11049         * typemanager.cs (NoTypes): Move the definition for the empty Type
11050         array here. 
11051
11052         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
11053         properties. 
11054         (TypeContainer.DefineProxy): New function used to proxy to parent
11055         implementations when implementing interfaces.
11056         (TypeContainer.ParentImplements): used to lookup if our parent
11057         implements a public function that is required by an interface.
11058         (TypeContainer.VerifyPendingMethods): Hook this up.
11059
11060         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
11061         `modules' and `assemblies' arraylists into arrays.  We only grow
11062         these are the very early start up of the program, so this improves
11063         the speedof LookupType (nicely measured).
11064
11065         * expression.cs (MakeByteBlob): Replaced unsafe code with
11066         BitConverter, as suggested by Paolo.
11067
11068         * cfold.cs (ConstantFold.Binary): Special case: perform constant
11069         folding of string concatenation, but if either side is a string,
11070         and the other is not, then return null, and let the runtime use
11071         the concatenation on the string plus the object (using
11072         `Object.ToString'). 
11073
11074 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
11075
11076         Constant Folding has been implemented now.
11077
11078         * expression.cs (Unary.Reduce): Do not throw an exception, catch
11079         the error instead on types that are not supported in one's
11080         complement. 
11081
11082         * constant.cs (Constant and all children): New set of functions to
11083         perform implict and explicit conversions.
11084
11085         * ecore.cs (EnumConstant): Implement the new functions to perform
11086         conversion by proxying to the child expression.
11087
11088         * codegen.cs: (ConstantCheckState): Constant evaluation has its
11089         own separate setting that can not be turned off from the command
11090         line using --unchecked or --checked and is only controlled using
11091         the checked/unchecked statements and expressions.  This setting is
11092         used by the constant folder to flag errors.
11093
11094         * expression.cs (CheckedExpr, UncheckedExpr): Set the
11095         ConstantCheckState as well.   
11096
11097         During Resolve, they also have to flag the state, because the
11098         constant folder runs completely in the Resolve phase.
11099
11100         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
11101         well.
11102
11103 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
11104
11105         * cfold.cs: New file, this file contains the constant folder.
11106
11107         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
11108         argument to track whether we are using the resulting address to
11109         load or store a value and provide better error messages. 
11110
11111         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
11112         new AddressOf arguments.
11113
11114         * statement.cs (Foreach.EmitCollectionForeach): Update
11115
11116         * expression.cs (Argument.Emit): Call AddressOf with proper
11117         arguments to track usage.
11118
11119         (New.DoEmit): Call AddressOf with new arguments.
11120
11121         (Unary.Emit): Adjust AddressOf call.
11122
11123 2002-03-01  Ravi Pratap  <ravi@ximian.com>
11124
11125         * cs-parser.jay (member_access): Change the case for pre-defined types
11126         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
11127         this suggestion.
11128
11129         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
11130         a method body.
11131
11132         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
11133         essentially like methods and apply attributes like MethodImplOptions to them too.
11134
11135         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
11136         not being null.
11137
11138         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
11139         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
11140         is the DeclSpace.
11141
11142         * Update code everywhere accordingly.
11143
11144         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
11145
11146         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
11147
11148 2002-02-28  Ravi Pratap  <ravi@ximian.com>
11149
11150         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
11151         try performing lookups against those instead of jumping straight into using
11152         the 'using' clauses.
11153
11154         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
11155
11156         (LookupType): Perform lookups in implicit parents too.
11157
11158         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
11159         sequence as RootContext.LookupType. 
11160
11161         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
11162         the various cases of namespace lookups into this method.
11163
11164 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
11165
11166         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
11167         in positional arguments)
11168
11169         * class.cs (Operator): Update the AllowedModifiers to contain
11170         extern. 
11171
11172         * cs-parser.jay: Update operator declaration to allow for the
11173         operator body to be empty.
11174
11175         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
11176         values. 
11177
11178 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
11179
11180         * class.cs (Method.Emit): Label parameters.
11181
11182         * driver.cs: Return 1 or 0 as the program exit code.
11183
11184 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
11185
11186         * expression.cs: Special case the `null' object when trying to
11187         auto-compute the type, as anything can be explicitly converted to
11188         that. 
11189
11190         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
11191         spotting this Paolo.
11192
11193         (Expression.ImplicitNumericConversion): Perform comparissions of
11194         the type using the underlying type in the case of an enumeration
11195         rather than using the enumeration type for the compare.
11196
11197         Cope with the underlying == type case, which is not possible to
11198         catch before. 
11199
11200         (Expression.ConvertNumericExplicit): Perform comparissions of
11201         the type using the underlying type in the case of an enumeration
11202         rather than using the enumeration type for the compare.
11203
11204         * driver.cs: If the user does not supply an extension, assume .exe
11205
11206         * cs-parser.jay (if_statement): Rewrote so that we can track the
11207         location for the if statement.
11208
11209         * expression.cs (Binary.ConstantFold): Only concat strings when
11210         the operation is "+", not everything ;-)
11211
11212         * statement.cs (Statement.EmitBoolExpression): Take a location
11213         argument. 
11214         (If, While, Do): Track location.
11215
11216         * expression.cs (Binary.ResolveOperator): In the object + string
11217         case, I was missing a call to ConvertImplicit
11218
11219 2002-02-25  Ravi Pratap  <ravi@ximian.com>
11220
11221         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
11222         Location arguments. Ensure we use RootContext.LookupType to do our work
11223         and not try to do a direct Type.GetType and ModuleBuilder.GetType
11224
11225         * interface.cs (PopulateMethod): Handle the type of the parameter being
11226         null gracefully.
11227
11228         * expression.cs (Invocation.BetterFunction): Handle the case when we 
11229         have a params method with no fixed arguments and a call is made with no
11230         arguments.
11231
11232 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
11233
11234         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
11235         the verbatim-string-literal
11236
11237         * support.cs (InternalParameters.ParameterModifier): handle null
11238         fixed parameters.
11239         (InternalParameters.ParameterType): ditto.
11240
11241         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
11242         duplicating the name of the variable parameter.
11243         (GetParameterByName): Fix bug where we were not looking up array
11244         paramters if they were the only present (thanks Paolo!).
11245         (GetParameterInfo): We only have an empty set of types if both
11246         fixed and array are set to null.
11247         (GetParameterInfo-idx): Handle FixedParameter == null
11248
11249         * cs-parser.jay: Handle the case where there is no catch
11250         statements (missing null test).
11251
11252 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
11253
11254         * driver.cs (MainDriver): Be conservative on our command line
11255         handling.
11256
11257         Catch DirectoryNotFoundException when calling GetFiles.
11258
11259         (SplitPathAndPattern): Used to split the input specification into
11260         a path and a pattern that we can feed to Directory.GetFiles.
11261
11262 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
11263
11264         * statement.cs (Fixed): Implement the last case of the Fixed
11265         statement (string handling).
11266
11267         * expression.cs (StringPtr): New class used to return a char * to
11268         a string;  Used by the Fixed statement.
11269
11270         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
11271
11272         * expression.cs (Binary.ResolveOperator): Remove redundant
11273         MemberLookup pn parent type.
11274         Optimize union call, we do not need a union if the types are the same.
11275         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
11276         type.
11277
11278         Specialize the use of MemberLookup everywhere, instead of using
11279         the default settings. 
11280
11281         (StackAlloc): Implement stackalloc keyword.
11282
11283         * cs-parser.jay: Add rule to parse stackalloc.
11284
11285         * driver.cs: Handle /h, /help, /?
11286
11287         * expression.cs (MakeByteBlob): Removed the hacks we had in place
11288         before we supported unsafe code.
11289
11290         * makefile: add --unsafe to the self compilation of mcs.
11291
11292 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
11293
11294         * expression.cs (PointerArithmetic): New class that is used to
11295         perform pointer arithmetic.
11296         (Binary.Resolve): Handle pointer arithmetic
11297         Handle pointer comparission.
11298         (ArrayPtr): Utility expression class that is used to take the
11299         address of an array.
11300
11301         (ElementAccess): Implement array access for pointers
11302
11303         * statement.cs (Fixed): Implement fixed statement for arrays, we
11304         are missing one more case before we are done.
11305
11306         * expression.cs (Indirection): Implement EmitAssign and set the
11307         ExprClass to Variable.  This allows pointer dereferences to be
11308         treated as variables, and to have values assigned to them.
11309
11310         * ecore.cs (Expression.StoreFromPtr): New utility function to
11311         store values dereferencing.
11312
11313 2002-02-20  Ravi Pratap  <ravi@ximian.com>
11314
11315         * expression.cs (Binary.ResolveOperator): Ensure that we are
11316         not trying to operate on a void type - this fixes the reported
11317         bug.
11318
11319         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
11320         the parent implementation is sealed.
11321
11322         * ../errors/cs0239.cs : Add.
11323
11324         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
11325
11326         * typemanager.cs (unverifiable_code_type): Corresponds to 
11327         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
11328         which have unsafe code in them.
11329
11330         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
11331         unsafe context.
11332
11333 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
11334
11335         * cs-tokenizer.cs: Add support for @"litreal strings"
11336
11337         Make tokenizer accept pre-processor directives
11338         on any column (remove the old C-like limitation). 
11339
11340         * rootcontext.cs (EmitCode): Emit any global attributes.
11341         (AddGlobalAttributes): Used to keep track of assembly attributes. 
11342
11343         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
11344
11345         * cs-parser.jay: Add support for global attributes.  
11346
11347 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
11348
11349         * expression.cs (Indirection): New helper class.  Unary will
11350         create Indirection classes to be able to implement the
11351         IMemoryLocation interface on it.
11352
11353 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
11354
11355         * cs-parser.jay (fixed_statement): reference the right statement.
11356
11357         * statement.cs (Fixed.Emit): Finish implementing the fixed
11358         statement for the &x case.
11359
11360 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
11361
11362         * class.cs (Property.Define, Method.Define): Remove newslot when
11363         `implementing'.  
11364
11365         * modifiers.cs: My use of NewSlot when `Abstract' was set was
11366         wrong.  NewSlot should only be used if the `new' keyword is present.
11367
11368         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
11369         locating our system dir.  Sorry about this.
11370
11371 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
11372
11373         * driver.cs (GetSystemDir): Compute correctly the location of our
11374         system assemblies.  I was using the compiler directory instead of
11375         the library directory.
11376
11377 2002-02-13  Ravi Pratap  <ravi@ximian.com>
11378
11379         * expression.cs (BetterFunction): Put back in what Miguel commented out
11380         since it is the correct fix. The problem is elsewhere ;-)
11381
11382         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
11383         parameters of the parms method are themselves compatible or not !
11384
11385         (StandardConversionExists): Fix very dangerous bug where we were forgetting
11386         to check that a class implements an interface before saying that an implicit
11387         conversion was allowed. Use ImplementsInterface to do the checking.
11388
11389 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
11390
11391         * class.cs (Method.Define): Track whether we are an explicit
11392         implementation or not.  And only call DefineMethodOverride if we
11393         are an explicit implementation.
11394
11395         (Property.DefineMethod): Ditto.
11396
11397 2002-02-11  Ravi Pratap  <ravi@ximian.com>
11398
11399         * expression.cs (BetterFunction): Catch hideous bug which was
11400          preventing us from detecting ambiguous calls due to implicit casts i.e
11401         cs0121.
11402
11403 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
11404
11405         * support.cs (Pair): Remove un-needed method.  I figured why I was
11406         getting the error in cs-parser.jay, the variable in a foreach loop
11407         is readonly, and the compiler does not really treat this as a variable.
11408
11409         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
11410         instead of EQUALS in grammar.  
11411
11412         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
11413
11414         * expression.cs (Unary.DoResolve): Check whether the argument is
11415         managed or not.
11416
11417 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
11418
11419         * support.cs: Api for Pair to set a value.  Despite the fact that
11420         the variables are public the MS C# compiler refuses to compile
11421         code that accesses the field if the variable is part of a foreach
11422         statement. 
11423
11424         * statement.cs (Fixed): Begin implementation of the fixed
11425         statement.
11426
11427         (Block.AddVariable): Return the VariableInfo on success and null
11428         on failure instead of true/false. 
11429
11430         * cs-parser.jay (foreach): Catch errors on variables already
11431         defined (we were ignoring this value before) and properly unwind
11432         the block hierarchy
11433
11434         (fixed_statement): grammar for the fixed statement.
11435
11436 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
11437
11438         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
11439         pointer types to be incretemented.
11440
11441         (SizeOf): Implement.
11442
11443         * cs-parser.jay (pointer_member_access): Implement
11444         expr->IDENTIFIER production.
11445
11446         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
11447         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
11448         on safe contexts.
11449
11450         (Unary): Implement indirection.
11451
11452         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
11453         use in non-unsafe context).
11454
11455         (SimpleName.DoResolve): Check for pointers in field access on safe
11456         contexts. 
11457
11458         (Expression.LoadFromPtr): Factor the load-indirect code in this
11459         function.  This was duplicated in UnboxCast and ParameterReference
11460
11461 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
11462
11463         * expression.cs (ComposedCast): report an error if a pointer cast
11464         is used in a safe region.
11465
11466         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
11467         pointer type casts in unsafe context.
11468
11469         * codegen.cs (EmitContext): Set up IsUnsafe.
11470
11471         * cs-parser.jay (non_expression_type): Add productions for pointer
11472         casts. 
11473
11474         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
11475         code.  We should not use force into static mode if the method is
11476         not virtual.  Fixes bug in MIS
11477
11478         * statement.cs (Do.Emit, While.Emit, For.Emit,
11479         Statement.EmitBoolExpression): Add support to Do and While to
11480         propagate infinite loop as `I do return' semantics.
11481
11482         Improve the For case to also test for boolean constants.
11483
11484         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
11485         to the list of attributes we can add.
11486
11487         Remove `EmitContext' argument.
11488
11489         * class.cs (Method.Define): Apply parameter attributes.
11490         (Constructor.Define): Apply parameter attributes.
11491         (MethodCore.LabelParameters): Move here the core of labeling
11492         parameters. 
11493
11494         * support.cs (ReflectionParameters.ParameterModifier,
11495         InternalParameters.ParameterModifier): Use IsByRef on the type and
11496         only return the OUT bit for these parameters instead of in/out/ref
11497         flags.
11498
11499         This is because I miss-understood things.  The ParameterInfo.IsIn
11500         and IsOut represent whether the parameter has the [In] and [Out]
11501         attributes set.  
11502
11503 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
11504
11505         * ecore.cs (FieldExpr.Emit): Release temporaries.
11506
11507         * assign.cs (LocalTemporary.Release): new function.
11508
11509         * codegen.cs (EmitContext.GetTemporaryStorage,
11510         EmitContext.FreeTemporaryStorage): Rework the way we deal with
11511         temporary storage.  Now we can "put back" localbuilders when we
11512         are done with them
11513
11514 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
11515
11516         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
11517         need to make a copy of the variable to generate verifiable code.
11518
11519 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
11520
11521         * driver.cs: Compute dynamically the system directory.
11522
11523         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
11524         Slower, but more generally useful.  Used by the abstract
11525         registering implementation. 
11526
11527         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
11528         the rules for the special rule on Type/instances.  First check if
11529         we have the same name, and if so, try that special static path
11530         rather than the instance path.
11531
11532 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
11533
11534         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
11535         for, while and if.
11536
11537         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
11538         Enum, ValueType, Delegate or Array for non-corlib compiles.
11539
11540         * cs-tokenizer.cs: Catch long identifiers (645)
11541
11542         * typemanager.cs (IndexerPropetyName): Ravi never tested this
11543         piece of code.
11544
11545         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
11546         fix, we were returning too early, so we were not registering
11547         pending methods from abstract classes.
11548
11549         Do not register pending methods if the class is abstract.
11550
11551         * expression.cs (Conditional.DoResolve): Report circular implicit
11552         conversions when we neecd to compute it for conditional
11553         expressions. 
11554
11555         (Is.DoResolve): If the expression is always of the provided type,
11556         flag warning 183.  If the expression can not ever be of the
11557         provided type flag warning 184.
11558
11559         * class.cs: Catch 169 as well.
11560
11561         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
11562         read. 
11563
11564 2002-01-18  Nick Drochak  <ndrochak@gol.com>
11565
11566         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
11567
11568 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
11569
11570         * interface.cs: (PopulateMethod): Check for pointers being defined
11571         only if the unsafe context is active.
11572         (PopulateProperty): ditto.
11573         (PopulateIndexer): ditto.
11574
11575         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
11576         specified.  If pointers are present, make sure that they are
11577         present in an unsafe context.
11578         (Constructor, Constructor.Define): ditto.
11579         (Field, Field.Define): ditto.
11580         (Property, Property.Define): ditto.
11581         (Event, Event.Define): ditto.
11582
11583         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
11584         hashtable if there are classes or structs defined.
11585
11586         * expression.cs (LocalVariableReference.DoResolve): Simplify this
11587         code, as the constant resolution moved.
11588
11589         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
11590         the metadata, so we can flag error 133. 
11591
11592         * decl.cs (MemberCore.UnsafeOK): New function to test that a
11593         pointer is being declared in an unsafe context.
11594
11595 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
11596
11597         * modifiers.cs (Modifiers.Check): Require a Location argument.
11598         Report error 227 for Unsafe use.
11599
11600         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
11601
11602         * statement.cs (For.Emit): If the test is null, then report that
11603         we do `return', as we wont reach anything afterwards.
11604
11605         (Switch.SwitchGoverningType): Track the expression that matched
11606         the conversion.
11607
11608         * driver.cs: Allow negative numbers as an error code to flag.
11609
11610         * cs-parser.jay: Handle 1551.
11611
11612         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
11613
11614 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
11615
11616         * cs-parser.jay: Report 1518 (type declaration can only contain
11617         class, struct, interface, enum or delegate)
11618
11619         (switch_label): Report 1523 (keywords `case' or `default' must
11620         preced code)
11621
11622         (opt_switch_sections): Report 1522 (empty switch)
11623
11624         * driver.cs: Report 1515 (response file specified multiple times)
11625         Report 1516 (Source file specified multiple times).
11626
11627         * expression.cs (Argument.Resolve): Signal 1510
11628
11629         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
11630         access not allowed in static code)
11631
11632 2002-01-11  Ravi Pratap  <ravi@ximian.com>
11633
11634         * typemanager.cs (IsPointerType): Utility method which we are going
11635         to need a lot.
11636
11637         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
11638         the object type, so we take care of that.
11639
11640         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
11641
11642         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
11643         added to non-params parameters :-)
11644
11645         * typemanager.cs (CSharpName): Include 'void' type too. 
11646
11647         (void_ptr_type): Include in the set of core types.
11648
11649         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
11650         duplicating code.
11651
11652         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
11653         an unsafe context.
11654
11655         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
11656         completely forgotten about it.
11657
11658 2002-01-10  Ravi Pratap  <ravi@ximian.com>
11659
11660         * cs-parser.jay (pointer_type): Add. This begins our implementation
11661         of parsing rules for unsafe code.
11662
11663         (unsafe_statement): Implement.
11664
11665         (embedded_statement): Modify to include the above.
11666
11667         * statement.cs (Unsafe): Implement new class for unsafe blocks.
11668
11669         * codegen.cs (EmitContext.InUnsafe): Add. This determines
11670         if the current context is an unsafe one.
11671
11672         * cs-parser.jay (local_variable_pointer_type): Since local variable types
11673         are handled differently, we need separate rules for them.
11674
11675         (local_variable_declaration): Update to use local_variable_pointer_type
11676         to allow variable declarations of unmanaged pointer types.
11677
11678         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
11679         in unsafe contexts.
11680
11681         * ../errors/cs0214.cs : Add.
11682
11683 2002-01-16  Nick Drochak  <ndrochak@gol.com>
11684
11685         * makefile: remove 'response' file when cleaning.
11686
11687 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
11688
11689         * cs-parser.jay: Report 1524.
11690
11691 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
11692
11693         * typemanager.cs (RegisterMethod): drop checking if we have
11694         registered this from here
11695
11696 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
11697
11698         * class.cs (Method.EmitDestructor): Implement calling our base
11699         destructor. 
11700
11701         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
11702         value of InFinally.
11703
11704         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
11705         this routine and will wrap the call in a try/catch block.  Deal
11706         with the case.
11707
11708 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
11709
11710         * ecore.cs (Expression.MemberLookup): instead of taking a
11711         parameter `same_type' that was used to tell whether we could
11712         access private members we compute our containing type from the
11713         EmitContext.
11714
11715         (FieldExpr): Added partial support for volatile fields.  This does
11716         not work for volatile fields exposed from assemblies, as I can not
11717         figure out how to extract the modreq from it.
11718
11719         Updated all the source files to use this.
11720
11721         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
11722         because it is referenced by MemberLookup very often. 
11723
11724 2002-01-09  Ravi Pratap  <ravi@ximian.com>
11725
11726         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
11727         TypeBuilder.GetCustomAttributes to retrieve what we need.
11728
11729         Get rid of redundant default_member_attr_type as this is the same as
11730         default_member_type which already exists.
11731
11732         * interface.cs, attribute.cs : Update accordingly.
11733
11734 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
11735
11736         * typemanager.cs: Enable IndexerPropertyName again.  It does not
11737         work for TYpeBuilders though.  Ravi, can you please fix this?
11738
11739         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
11740
11741         * expression.cs (Argument.Emit): Handle the case of ref objects
11742         being passed to ref functions;  
11743
11744         (ParameterReference.EmitLoad): Loads the content of the pointer
11745         without dereferencing.
11746
11747 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
11748
11749         * cs-tokenizer.cs: Implemented the pre-processing expressions.
11750
11751 2002-01-08  Ravi Pratap  <ravi@ximian.com>
11752
11753         * class.cs (Indexer.DefineMethod): Incorporate the interface
11754         type in the name of the method if we are doing explicit interface
11755         implementation.
11756
11757         * expression.cs (ConversionExists): Remove as it is completely obsolete.
11758
11759         (BetterConversion): Fix extremely trivial bug where we were referring to
11760         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
11761         again !
11762
11763         * ../errors/bug16.cs : Add although we have fixed it.
11764
11765 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
11766
11767         * expression.cs (BaseIndexer): Begin implementation.
11768
11769         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
11770
11771         * cs-parser.jay (indexer_declarator): Use qualified_identifier
11772         production directly to remove a shift/reduce, and implement
11773         explicit interface implementation.
11774
11775         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
11776         after a floating point suffix.
11777
11778         * expression.cs (DoNumericPromotions): Improved the conversion for
11779         uint/uint.  If we have a constant, we avoid doing a typecast to a
11780         larger type.
11781
11782         * class.cs (Indexer): Implement explicit interface implementation
11783         for indexers.
11784
11785 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
11786
11787         * class.cs: make the default instance constructor public and hidebysig.
11788
11789 2001-01-03  Ravi Pratap  <ravi@ximian.com>
11790
11791         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
11792         so we can call it from elsewhere.
11793
11794         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
11795         we emit it internally if the class has a defined indexer; otherwise the user
11796         emits it by decorating the class definition with the DefaultMemberAttribute.
11797
11798         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
11799         attribute is not used on a type which defines an indexer.
11800
11801         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
11802         character when we skip whitespace.
11803
11804         * ../errors/cs0646.cs : Add.
11805
11806 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
11807
11808         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
11809         again. 
11810
11811         * makefile: Add practical target `mcs3.exe' which builds the third
11812         generation compiler. 
11813
11814         * expression.cs (New): Fix structures constructor calling.
11815
11816         * class.cs (Property, Method, Indexer): Emit Final flag on the
11817         method if we are an interface implementation and we are not
11818         abstract. 
11819
11820         * ecore.cs (PropertyExpr): New public field `IsBase', tells
11821         whether this property is referencing a `base' method.
11822
11823         * expression.cs (Invocation.EmitCall): take an extra argument:
11824         is_base, this is used to determine whether the `call' or
11825         `callvirt' opcode should be used.
11826
11827
11828         * delegate.cs: update EmitCall.
11829
11830         * class.cs (Method.Define): Set NewSlot for the cases where we are
11831         not implementing an interface method.
11832
11833         (Property.Define): ditto.
11834
11835 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
11836
11837         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
11838         'r'.  Allows mcs to parse itself fully.
11839
11840 2002-01-02  Ravi Pratap  <ravi@ximian.com>
11841
11842         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
11843         of the number of initializers that require the InitializeArray method.
11844
11845         (CheckIndices): Store the Expression in all cases - not the plain value. Also
11846         update the above field where necessary.
11847
11848         (MakeByteBlob): Update accordingly.
11849
11850         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
11851         greater than 2.
11852
11853         (EmitDynamicInitializers): Update in accordance with the new optimization.
11854
11855         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
11856         same OpCode applies.
11857
11858         * cs-parser.jay : Fix some glaring errors I introduced.
11859
11860 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
11861
11862         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
11863         so that we can check for name clashes there too.
11864
11865         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
11866         for interface indexers.
11867
11868         * interfaces.cs (Define): Emit the default member attribute.
11869
11870         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
11871         variable was being referred to while setting the value ;-)
11872
11873 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
11874
11875         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
11876         byte-by-byte information when we know the data is zero.
11877
11878         Make the block always a multiple of 4, because
11879         DefineInitializedData has a bug.
11880
11881         * assign.cs: Fix, we should assign from the temporary, not from
11882         the source. 
11883
11884         * expression.cs (MakeByteBlob): Fix my incorrect code.
11885
11886 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
11887
11888         * typemanager.cs (EnumToUnderlying): This function is used to get
11889         the underlying type from an enumeration, because it does not
11890         always work. 
11891
11892         * constant.cs: Use the I4_S form for values between -128 and 127.
11893
11894         * statement.cs (Block.LookupLabel): Looks up a label.
11895         (Block): Drop support for labeled blocks.
11896
11897         (LabeledStatement): New kind of statement that represents a label
11898         only.
11899
11900         (Goto): Finally implement this bad boy.
11901
11902         * cs-parser.jay: Update to reflect new mechanism to implement
11903         labels.
11904
11905 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
11906
11907         * codegen.cs (EmitContext.This): a codegen property that keeps the
11908         a single instance of this instead of creating many different this
11909         instances. 
11910
11911         * delegate.cs (Delegate.DoResolve): Update to use the property;
11912
11913         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
11914
11915         * expression.cs (BaseAccess.DoResolve): Ditto.
11916
11917 2001-12-29  Ravi Pratap  <ravi@ximian.com>
11918
11919         * typemanager.cs (methodimpl_attr_type): Add to hold the type
11920         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
11921
11922         (InitCoreTypes): Update accordingly.
11923
11924         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
11925         so we can quickly store the state.
11926
11927         (ApplyAttributes): Set the correct implementation flags
11928         for InternalCall methods.
11929
11930 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
11931
11932         * expression.cs (EmitCall): if a method is not virtual, then do
11933         not use callvirt on it.
11934
11935         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
11936         user defined stuff) requires the use of stobj, which takes an
11937         address on the stack instead of an array and an index.  So emit
11938         the Ldelema operation for it.
11939
11940         (EmitStoreOpcode): Use stobj for valuetypes.
11941
11942         (UnaryMutator.EmitCode): Use the right 1 value depending on
11943         whether we are dealing with int64/uint64, float or doubles.
11944
11945         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
11946         constructors that I implemented last night.
11947
11948         (Constructor.IsDefault): Fix to work properly for static
11949         constructors.
11950
11951         * cs-parser.jay (CheckDef): report method signature errors.
11952         Update error number 103 to be 132.
11953
11954         * decl.cs: New AdditionResult enumeration value: MethodExists.
11955         Although we do this check for methods later on in the semantic
11956         analysis, catching repeated default constructors is so easy that
11957         we catch these here. 
11958
11959         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
11960         promotions code.
11961
11962         (ParameterReference.EmitAssign, Emit): handle
11963         bools as bytes.
11964
11965         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
11966         (ArrayAccess.EmitStoreOpcode): ditto.
11967
11968         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
11969
11970         * expression.cs (MakeByteBlob): Complete all the missing types
11971         (uint, short, ushort, byte, sbyte)
11972
11973         * class.cs: Only init instance field initializers on instance
11974         constructors. 
11975
11976         Rename `constructors' to instance_constructors. 
11977
11978         (TypeContainer.AddConstructor): Only add constructors to the list
11979         if it is not static.
11980
11981         Make sure that we handle default_static_constructor independently
11982         everywhere where we handle instance_constructors
11983
11984 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
11985
11986         * class.cs: Do not lookup or create a base initializer for a
11987         static constructor.
11988
11989         (ConstructorInitializer.Resolve): use the proper type to lookup
11990         for constructors.
11991
11992         * cs-parser.jay: Report error 1585 (modifiers between type and name).
11993
11994         * enum.cs, interface.cs: Remove CloseType, this is taken care by
11995         in DeclSpace. 
11996
11997         * decl.cs: CloseType is now an virtual method, the default
11998         implementation just closes this type.
11999
12000 2001-12-28  Ravi Pratap  <ravi@ximian.com>
12001
12002         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
12003         to PreserveSig by default. Also emit HideBySig on such methods.
12004
12005         Basically, set the defaults to standard values.
12006
12007         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
12008         argument, if candidate is better, it can't be worse than the best !
12009
12010         (Invocation): Re-write bits to differentiate between methods being
12011         applicable in their expanded form and their normal form - for params
12012         methods of course.
12013
12014         Get rid of use_standard everywhere as only standard conversions are allowed
12015         in overload resolution. 
12016
12017         More spec conformance.
12018
12019 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
12020
12021         * driver.cs: Add --timestamp, to see where the compiler spends
12022         most of its time.
12023
12024         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
12025         `this' in static code.
12026
12027         (SimpleName.DoResolve): Implement in terms of a helper function
12028         that allows static-references to be passed upstream to
12029         MemberAccess.
12030
12031         (Expression.ResolveWithSimpleName): Resolve specially simple
12032         names when called by MemberAccess to implement the special
12033         semantics. 
12034
12035         (Expression.ImplicitReferenceConversion): Handle conversions from
12036         Null to reference types before others, as Null's type is
12037         System.Object. 
12038
12039         * expression.cs (Invocation.EmitCall): Handle the special case of
12040         calling methods declared on a reference type from a ValueType
12041         (Base classes System.Object and System.Enum)
12042
12043         (MemberAccess.Resolve): Only perform lookups on Enumerations if
12044         the left hand side is a TypeExpr, not on every enumeration. 
12045
12046         (Binary.Resolve): If types are reference types, then do a cast to
12047         object on operators != and == of both arguments.
12048
12049         * typemanager.cs (FindMembers): Extract instance and static
12050         members if requested.
12051
12052         * interface.cs (PopulateProperty): Use void_type instead of null
12053         as the return type for the setter method.
12054
12055         (PopulateIndexer): ditto.
12056
12057 2001-12-27  Ravi Pratap  <ravi@ximian.com>
12058
12059         * support.cs (ReflectionParameters): Fix minor bug where we
12060         were examining the wrong parameter for the ParamArray attribute.
12061
12062         Cope with requests for the type of the parameter at position
12063         greater than the params parameter's. We now return the element
12064         type of the params array as that makes more sense.
12065
12066         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
12067         accordingly as we no longer have to extract the element type
12068         ourselves.
12069
12070         (Invocation.OverloadResolve): Update.
12071
12072 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
12073
12074         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
12075         against IEnumerator, test whether the return value is a descendant
12076         of the IEnumerator interface.
12077
12078         * class.cs (Indexer.Define): Use an auxiliary method to implement
12079         the other bits of the method definition.  Begin support for
12080         explicit interface implementation.
12081
12082         (Property.DefineMethod): Use TypeManager.void_type instead of null
12083         for an empty return value.
12084
12085 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
12086
12087         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
12088         dealing with a FieldExpr which is composed of a FieldBuilder, in
12089         the code path we did extract the constant, but we should have
12090         obtained the underlying value to be able to cast it (otherwise we
12091         end up in an infinite loop, this is what Ravi was running into).
12092
12093         (ArrayCreation.UpdateIndices): Arrays might be empty.
12094
12095         (MemberAccess.ResolveMemberAccess): Add support for section
12096         14.5.4.1 that deals with the special case of E.I when E is a type
12097         and something else, that I can be a reference to a static member.
12098
12099         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
12100         handle a particular array type to create byte blobs, it is just
12101         something we dont generate byteblobs for.
12102
12103         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
12104         arguments. 
12105
12106         * location.cs (Push): remove the key from the hashtable that we
12107         are about to add.   This happens for empty files.
12108
12109         * driver.cs: Dispose files after we have parsed them.
12110
12111         (tokenize): new function that only runs the tokenizer on its
12112         input, for speed testing.
12113
12114 2001-12-26  Ravi Pratap  <ravi@ximian.com>
12115
12116         * class.cs (Event.Define): Define the private field only if there
12117         are no accessors defined.
12118
12119         * expression.cs (ResolveMemberAccess): If there is no associated
12120         field with the event, that means we have an event defined with its
12121         own accessors and we should flag error cs0070 since transforming
12122         ourselves into a field is not valid in that case.
12123
12124         * ecore.cs (SimpleName.DoResolve): Same as above.
12125
12126         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
12127         and charset to sane values.
12128
12129 2001-12-25  Ravi Pratap  <ravi@ximian.com>
12130
12131         * assign.cs (DoResolve): Perform check on events only if they 
12132         are being accessed outside the declaring type.
12133
12134         * cs-parser.jay (event_declarations): Update rules to correctly
12135         set the type of the implicit parameter etc.
12136
12137         (add_accessor, remove_accessor): Set current local parameters.
12138
12139         * expression.cs (Binary): For delegate addition and subtraction,
12140         cast the return value from the method into the appropriate delegate
12141         type.
12142
12143 2001-12-24  Ravi Pratap  <ravi@ximian.com>
12144
12145         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
12146         of these as the workaround is unnecessary.
12147
12148         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
12149         delegate data - none of that is needed at all.
12150
12151         Re-write bits to extract the instance expression and the delegate method
12152         correctly.
12153
12154         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
12155         on delegates too.
12156
12157         * attribute.cs (ApplyAttributes): New method to take care of common tasks
12158         of attaching attributes instead of duplicating code everywhere.
12159
12160         * everywhere : Update code to do attribute emission using the above method.
12161
12162 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
12163
12164         * expression.cs (IsParamsMethodApplicable): if there are not
12165         parameters, return immediately.
12166
12167         * ecore.cs: The 0 literal can be implicity converted to an enum
12168         type. 
12169
12170         (SimpleName.DoResolve): First lookup the type, then lookup the
12171         members. 
12172
12173         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
12174         want to get its address.  If the InstanceExpression is not
12175         addressable, store the result in a temporary variable, then get
12176         the address of it.
12177
12178         * codegen.cs: Only display 219 errors on warning level or above. 
12179
12180         * expression.cs (ArrayAccess): Make it implement the
12181         IMemoryLocation interface.
12182
12183         (Binary.DoResolve): handle the operator == (object a, object b)
12184         and operator != (object a, object b) without incurring into a
12185         BoxedCast (because 5 != o should never be performed).
12186
12187         Handle binary enumerator operators.
12188
12189         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
12190         value type, otherwise use Ldelem_ref.
12191
12192         Use precomputed names;
12193
12194         (AddressOf): Implement address of
12195
12196         * cs-parser.jay (labeled_statement): Fix recursive block
12197         addition by reworking the production.
12198
12199         * expression.cs (New.DoEmit): New has a special case:
12200                 
12201                  If we are dealing with a ValueType, we have a few
12202                  situations to deal with:
12203                 
12204                     * The target of New is a ValueType variable, that is
12205                       easy, we just pass this as the variable reference
12206                 
12207                     * The target of New is being passed as an argument,
12208                       to a boxing operation or a function that takes a
12209                       ValueType.
12210                 
12211                       In this case, we need to create a temporary variable
12212                       that is the argument of New.
12213
12214
12215 2001-12-23  Ravi Pratap  <ravi@ximian.com>
12216
12217         * rootcontext.cs (LookupType): Check that current_type is not null before
12218         going about looking at nested types.
12219
12220         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
12221         not implement the IAssignMethod interface any more.
12222
12223         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
12224         where we tranform them into FieldExprs if they are being resolved from within
12225         the declaring type.
12226
12227         * ecore.cs (SimpleName.DoResolve): Do the same here.
12228
12229         * assign.cs (DoResolve, Emit): Clean up code considerably. 
12230
12231         * ../errors/bug10.cs : Add.
12232
12233         * ../errors/cs0070.cs : Add.
12234
12235         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
12236
12237         * assign.cs : Get rid of EventIsLocal everywhere.
12238
12239 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
12240
12241         * ecore.cs (ConvertIntLiteral): finished the implementation.
12242
12243         * statement.cs (SwitchLabel): Convert the value we are using as a
12244         key before looking up the table.
12245
12246 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
12247
12248         * codegen.cs (EmitTopBlock): Require a Location argument now.
12249
12250         * cs-parser.jay (constructor_declarator): We need to setup
12251         current_local_parameters before we parse the
12252         opt_constructor_initializer, to allow the variables to be bound
12253         to the constructor arguments.
12254
12255         * rootcontext.cs (LookupType): First lookup nested classes in our
12256         class and our parents before we go looking outside our class.
12257
12258         * expression.cs (ConstantFold): Extract/debox the values at the
12259         beginnning. 
12260
12261         * rootcontext.cs (EmitCode): Resolve the constants first before we
12262         resolve the types.  This is not really needed, but it helps debugging.
12263
12264         * statement.cs: report location.
12265
12266         * cs-parser.jay: pass location to throw statement.
12267
12268         * driver.cs: Small bug fix.
12269
12270         * report.cs: Updated format to be 4-zero filled digits.
12271
12272 2001-12-22  Ravi Pratap  <ravi@ximian.com>
12273
12274         * expression.cs (CheckIndices): Fix minor bug where the wrong
12275         variable was being referred to ;-)
12276
12277         (DoEmit): Do not call EmitStaticInitializers when the 
12278         underlying type is System.Object.
12279
12280 2001-12-21  Ravi Pratap  <ravi@ximian.com>
12281
12282         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
12283         and do the usual workaround for SRE.
12284
12285         * class.cs (MyEventBuilder.EventType): New member to get at the type
12286         of the event, quickly.
12287
12288         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
12289
12290         * assign.cs (Assign.DoResolve): Handle the case when the target
12291         is an EventExpr and perform the necessary checks.
12292
12293         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
12294         interface.
12295
12296         (SimpleName.MemberStaticCheck): Include check for EventExpr.
12297
12298         (EventExpr): Set the type in the constructor itself since we 
12299         are meant to be born fully resolved.
12300
12301         (EventExpr.Define): Revert code I wrote earlier.
12302                 
12303         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
12304         instance expression is null. The instance expression is a This in that case
12305         or a null, depending on whether it is a static method or not.
12306
12307         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
12308         refers to more than one method.
12309
12310         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
12311         and accordingly flag errors.
12312
12313 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
12314
12315         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
12316
12317 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
12318
12319         * location.cs (ToString): Provide useful rutine.
12320
12321 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
12322
12323         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
12324         objects, return the actual integral boxed.
12325
12326         * statement.cs (SwitchLabel): define an ILLabel for each
12327         SwitchLabel. 
12328
12329         (Switch.CheckSwitch): If the value is a Literal, extract
12330         the underlying literal.
12331
12332         Also in the unused hashtable we had, add the SwitchLabel so we can
12333         quickly look this value up.
12334
12335         * constant.cs: Implement a bunch of new constants.  Rewrite
12336         Literal based on this.  Made changes everywhere to adapt to this.
12337
12338         * expression.cs (Expression.MakeByteBlob): Optimize routine by
12339         dereferencing array only once, and also copes with enumrations.
12340
12341         bytes are two bytes wide, not one.
12342
12343         (Cast): Perform constant conversions.
12344
12345         * ecore.cs (TryImplicitIntConversion): Return literals instead of
12346         wrappers to the literals here.
12347
12348         * expression.cs (DoNumericPromotions): long literals can converted
12349         to ulong implicity (this is taken care of elsewhere, but I was
12350         missing this spot).
12351
12352         * ecore.cs (Expression.Literalize): Make the return type Literal,
12353         to improve type checking.
12354
12355         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
12356
12357 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
12358
12359         * literal.cs: Revert code from ravi that checked the bounds.  The
12360         bounds are sane by the definition of the type itself. 
12361
12362         * typemanager.cs: Fix implementation of ImplementsInterface.  We
12363         need to actually look up in our parent hierarchy for interfaces
12364         implemented. 
12365
12366         * const.cs: Use the underlying type for enumerations
12367
12368         * delegate.cs: Compute the basename for the delegate creation,
12369         that should fix the delegate test case, and restore the correct
12370         Type Lookup semantics in rootcontext
12371
12372         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
12373         referencing a nested type with the Reflection API is using the "+"
12374         sign. 
12375
12376         * cs-parser.jay: Do not require EOF token at the end.
12377
12378 2001-12-20  Ravi Pratap  <ravi@ximian.com>
12379
12380         * rootcontext.cs (LookupType): Concatenate type names with
12381         a '.' instead of a '+' The test suite passes again.
12382
12383         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
12384         field of the enumeration.
12385
12386         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
12387         the case when the member is an EventExpr.
12388
12389         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
12390         static has an associated instance expression.
12391
12392         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
12393
12394         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
12395
12396         * class.cs (Event.Define): Register event and perform appropriate checks
12397         for error #111.
12398
12399         We define the Add and Remove methods even if the use provides none because
12400         in that case, we provide default implementations ourselves.
12401
12402         Define a private field of the type of the event. This is done by the CSC compiler
12403         and we should be doing it too ;-)
12404
12405         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
12406         More methods we use in code we generate.
12407
12408         (multicast_delegate_type, delegate_type): Two separate types since the distinction
12409         is important.
12410
12411         (InitCoreTypes): Update accordingly for the above.
12412
12413         * class.cs (Event.Emit): Generate code for default accessors that we provide
12414
12415         (EmitDefaultMethod): Do the job in the above.
12416
12417         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
12418         appropriate place.
12419
12420 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
12421
12422         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
12423         builders even if we were missing one.
12424
12425         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
12426         pass the Basename as our class name instead of the Name.  The
12427         basename will be correctly composed for us.
12428
12429         * parameter.cs (Paramters): Now takes a Location argument.
12430
12431         * decl.cs (DeclSpace.LookupType): Removed convenience function and
12432         make all the code call directly LookupType in RootContext and take
12433         this chance to pass the Location information everywhere.
12434
12435         * Everywhere: pass Location information.
12436
12437 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
12438
12439         * class.cs (Constructor.Define): Updated way of detecting the
12440         length of the parameters.
12441
12442         (TypeContainer.DefineType): Use basename as the type name for
12443         nested types.
12444
12445         (TypeContainer.Define): Do not recursively define types here, as
12446         definition is taken care in order by the RootContext.
12447
12448         * tree.cs: Keep track of namespaces in a per-file basis.
12449
12450         * parameter.cs (Parameter.ComputeSignature): Update to use
12451         DeclSpace. 
12452
12453         (Parameters.GetSignature): ditto.
12454
12455         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
12456         instead of a TypeContainer.
12457
12458         (Interface.SemanticAnalysis): Use `this' instead of our parent to
12459         resolve names.  Because we need to be resolve in our context, not
12460         our parents.
12461
12462         * driver.cs: Implement response files.
12463
12464         * class.cs (TypeContainer.DefineType): If we are defined, do not
12465         redefine ourselves.
12466
12467         (Event.Emit): Emit the code for add/remove handlers.
12468         (Event.Define): Save the MethodBuilders for add/remove.
12469
12470         * typemanager.cs: Use pair here too.
12471
12472         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
12473         DictionaryEntry requires the first argument to be non-null.  
12474
12475         (enum_declaration): Compute full name for registering the
12476         enumeration.
12477
12478         (delegate_declaration): Instead of using
12479         formal_parameter_list, use opt_formal_parameter_list as the list
12480         can be empty.
12481
12482         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
12483         (EventParsing): New property that controls whether `add' and
12484         `remove' are returned as tokens or identifiers (for events);
12485
12486 2001-12-19  Ravi Pratap  <ravi@ximian.com>
12487
12488         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
12489         use MyEventBuilder only and let it wrap the real builder for us.
12490
12491         (MyEventBuilder): Revamp constructor etc.
12492
12493         Implement all operations that we perform on EventBuilder in precisely the same
12494         way here too.
12495
12496         (FindMembers): Update to use the EventBuilder member.
12497
12498         (Event.Emit): Update accordingly.
12499
12500 2001-12-18  Ravi Pratap  <ravi@ximian.com>
12501
12502         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
12503         by calling the appropriate methods.
12504
12505         (GetCustomAttributes): Make stubs as they cannot possibly do anything
12506         useful.
12507
12508         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
12509
12510 2001-12-17  Ravi Pratap  <ravi@ximian.com>
12511
12512         * delegate.cs (Delegate.Populate): Check that the return type
12513         and various parameters types are indeed accessible.
12514
12515         * class.cs (Constructor.Define): Same here.
12516
12517         (Field.Define): Ditto.
12518
12519         (Event.Define): Ditto.
12520
12521         (Operator.Define): Check that the underlying Method defined itself
12522         correctly - so it's MethodBuilder should not be null.
12523
12524         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
12525         expression happens to be null.
12526
12527         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
12528         members but as of now we don't seem to be able to do anything really useful with it.
12529
12530         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
12531         not the EventBuilder.
12532
12533 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
12534
12535         * cs-tokenizer.cs: Add support for defines.
12536         Add support for #if, #elif, #else, #endif
12537
12538         (eval_var): evaluates a variable.
12539         (eval): stubbed for evaluating functions.
12540
12541         * cs-parser.jay: Pass the defines information
12542
12543         * driver.cs: Add --define command line option.
12544
12545         * decl.cs: Move MemberCore here.
12546
12547         Make it the base class for DeclSpace.  This allows us to catch and
12548         report 108 and 109 for everything now.
12549
12550         * class.cs (TypeContainer.Define): Extract all the members
12551         before populating and emit the warning 108 (new keyword required
12552         to override) instead of having each member implement this.
12553
12554         (MemberCore.Define): New abstract method, we will be using this in
12555         the warning reporting engine in Populate.
12556
12557         (Operator.Define): Adjust to new MemberCore protocol. 
12558
12559         * const.cs (Const): This does not derive from Expression, it is a
12560         temporary object we use to create fields, it is a MemberCore. 
12561
12562         * class.cs (Method.Define): Allow the entry point to be in a
12563         specific class.
12564
12565         * driver.cs: Rewrite the argument handler to clean it up a bit.
12566
12567         * rootcontext.cs: Made it just an auxiliary namespace feature by
12568         making everything static.
12569
12570         * driver.cs: Adapt code to use RootContext type name instead of
12571         instance variable.
12572
12573         * delegate.cs: Remove RootContext argument.
12574
12575         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
12576         argument. 
12577
12578         * class.cs (Event.Define): The lookup can fail.
12579
12580         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
12581
12582         * expression.cs: Resolve the this instance before invoking the code.
12583
12584 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
12585
12586         * cs-parser.jay: Add a production in element_access that allows
12587         the thing to become a "type" reference.  This way we can parse
12588         things like "(string [])" as a type.
12589
12590         Note that this still does not handle the more complex rules of
12591         casts. 
12592
12593
12594         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
12595
12596         * ecore.cs: (CopyNewMethods): new utility function used to
12597         assemble the list of methods from running FindMembers.
12598
12599         (MemberLookup): Rework FindMembers so that 
12600
12601 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
12602
12603         * class.cs (TypeContainer): Remove Delegates who fail to be
12604         defined.
12605
12606         * delegate.cs (Populate): Verify that we dont get null return
12607         values.   TODO: Check for AsAccessible.
12608
12609         * cs-parser.jay: Use basename to emit error 574 (destructor should
12610         have the same name as container class), not the full name.
12611
12612         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
12613         possible representation.  
12614
12615         Also implements integer type suffixes U and L.
12616
12617 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
12618
12619         * expression.cs (ArrayCreation.DoResolve): We need to do the
12620         argument resolution *always*.
12621
12622         * decl.cs: Make this hold the namespace.  Hold the root context as
12623         well.
12624         (LookupType): Move here.
12625
12626         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
12627
12628         * location.cs (Row, Name): Fixed the code, it was always returning
12629         references to the first file.
12630
12631         * interface.cs: Register properties defined through interfaces.
12632
12633         * driver.cs: Add support for globbing on the command line
12634
12635         * class.cs (Field): Make it derive from MemberCore as well.
12636         (Event): ditto.
12637
12638 2001-12-15  Ravi Pratap  <ravi@ximian.com>
12639
12640         * class.cs (Event::Define): Check that the type of the event is a delegate
12641         type else flag error #66.
12642
12643         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
12644         same.
12645
12646         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
12647         values of EntryPoint, CharSet etc etc.
12648
12649         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
12650
12651         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
12652         be null and we should ignore this. I am not sure if this is really clean. Apparently,
12653         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
12654         which needs this to do its work.
12655
12656         * ../errors/cs0066.cs : Add.
12657
12658 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
12659
12660         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
12661         helper functions.
12662
12663         * class.cs: (MethodSignature.MethodSignature): Removed hack that
12664         clears out the parameters field.
12665         (MemberSignatureCompare): Cleanup
12666
12667         (MemberCore): New base class used to share code between MethodCore
12668         and Property.
12669
12670         (RegisterRequiredImplementations) BindingFlags.Public requires
12671         either BindingFlags.Instace or Static.  Use instance here.
12672
12673         (Property): Refactored code to cope better with the full spec.
12674
12675         * parameter.cs (GetParameterInfo): Return an empty array instead
12676         of null on error.
12677
12678         * class.cs (Property): Abstract or extern properties have no bodies.
12679
12680         * parameter.cs (GetParameterInfo): return a zero-sized array.
12681
12682         * class.cs (TypeContainer.MethodModifiersValid): Move all the
12683         method modifier validation to the typecontainer so we can reuse
12684         this on properties.
12685
12686         (MethodCore.ParameterTypes): return an empty sized array of types.
12687
12688         (Property.Define): Test property modifier validity.
12689
12690         Add tests for sealed/override too.
12691
12692         (Method.Emit): abstract or extern methods have no bodies.
12693
12694 2001-12-14  Ravi Pratap  <ravi@ximian.com>
12695
12696         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
12697         thing.
12698
12699         (Method::Define, ::Emit): Modify accordingly.
12700
12701         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
12702
12703         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
12704
12705         * makefile: Pass in /unsafe.
12706
12707 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
12708
12709         * class.cs (MakeKey): Kill routine.
12710
12711         * class.cs (TypeContainer.Define): Correctly define explicit
12712         method implementations (they require the full interface name plus
12713         the method name).
12714
12715         * typemanager.cs: Deply the PtrHashtable here and stop using the
12716         lame keys.  Things work so much better.
12717
12718         This of course broke everyone who depended on `RegisterMethod' to
12719         do the `test for existance' test.  This has to be done elsewhere.
12720
12721         * support.cs (PtrHashtable): A hashtable that avoid comparing with
12722         the object stupid Equals method (because, that like fails all over
12723         the place).  We still do not use it.
12724
12725         * class.cs (TypeContainer.SetRequiredInterface,
12726         TypeContainer.RequireMethods): Killed these two routines and moved
12727         all the functionality to RegisterRequiredImplementations.
12728
12729         (TypeContainer.RegisterRequiredImplementations): This routine now
12730         registers all the implementations required in an array for the
12731         interfaces and abstract methods.  We use an array of structures
12732         which can be computed ahead of time to reduce memory usage and we
12733         also assume that lookups are cheap as most classes will not
12734         implement too many interfaces.
12735
12736         We also avoid creating too many MethodSignatures.
12737
12738         (TypeContainer.IsInterfaceMethod): Update and optionally does not
12739         clear the "pending" bit if we find that there are problems with
12740         the declaration.
12741
12742         (TypeContainer.VerifyPendingMethods): Update to report errors of
12743         methods that look like implementations but are not.
12744
12745         (TypeContainer.Define): Add support for explicit interface method
12746         implementation. 
12747
12748 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
12749
12750         * typemanager.cs: Keep track of the parameters here instead of
12751         being a feature of the TypeContainer.
12752
12753         * class.cs: Drop the registration of parameters here, as
12754         InterfaceMethods are also interface declarations.
12755
12756         * delegate.cs: Register methods with the TypeManager not only with
12757         the TypeContainer.  This code was buggy.
12758
12759         * interface.cs: Full registation here.
12760
12761 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
12762
12763         * expression.cs: Remove reducer for binary expressions, it can not
12764         be done this way.
12765
12766         * const.cs: Put here the code that used to go into constant.cs
12767
12768         * constant.cs: Put here the code for constants, this is a new base
12769         class for Literals.
12770
12771         * literal.cs: Make Literal derive from Constant.
12772
12773 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
12774
12775         * statement.cs (Return.Emit): Report error 157 if the user
12776         attempts to return from a finally block.
12777
12778         (Return.Emit): Instead of emitting a return, jump to the end of
12779         the function.
12780
12781         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
12782         LocalBuilder to store the result of the function.  ReturnLabel is
12783         the target where we jump.
12784
12785
12786 2001-12-09  Radek Doulik  <rodo@ximian.com>
12787
12788         * cs-parser.jay: remember alias in current namespace
12789
12790         * ecore.cs (SimpleName::DoResolve): use aliases for types or
12791         namespaces
12792
12793         * class.cs (LookupAlias): lookup alias in my_namespace
12794
12795         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
12796         aliases hashtable
12797         (LookupAlias): lookup alias in this and if needed in parent
12798         namespaces
12799
12800 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
12801
12802         * support.cs: 
12803
12804         * rootcontext.cs: (ModuleBuilder) Made static, first step into
12805         making things static.  I need this to avoid passing the
12806         TypeContainer when calling ParameterType.
12807
12808         * support.cs (InternalParameters.ParameterType): Remove ugly hack
12809         that did string manipulation to compute the type and then call
12810         GetType.  Use Parameter.ParameterType instead.
12811
12812         * cs-tokenizer.cs: Consume the suffix for floating values.
12813
12814         * expression.cs (ParameterReference): figure out whether this is a
12815         reference parameter or not.  Kill an extra variable by computing
12816         the arg_idx during emission.
12817
12818         * parameter.cs (Parameters.GetParameterInfo): New overloaded
12819         function that returns whether a parameter is an out/ref value or not.
12820
12821         (Parameter.ParameterType): The type of the parameter (base,
12822         without ref/out applied).
12823
12824         (Parameter.Resolve): Perform resolution here.
12825         (Parameter.ExternalType): The full type (with ref/out applied).
12826
12827         * statement.cs (Using.Emit, Using.EmitExpression): Implement
12828         support for expressions on the using statement.
12829
12830 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
12831
12832         * statement.cs (Using.EmitLocalVariableDecls): Split the
12833         localvariable handling of the using statement.
12834
12835         (Block.EmitMeta): Keep track of variable count across blocks.  We
12836         were reusing slots on separate branches of blocks.
12837
12838         (Try.Emit): Emit the general code block, we were not emitting it. 
12839
12840         Check the type of the declaration to be an IDisposable or
12841         something that can be implicity converted to it. 
12842
12843         Emit conversions if required.
12844
12845         * ecore.cs (EmptyExpression): New utility class.
12846         (Expression.ImplicitConversionExists): New utility function.
12847
12848 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
12849
12850         * statement.cs (Using): Implement.
12851
12852         * expression.cs (LocalVariableReference): Support read only variables.
12853
12854         * statement.cs: Remove the explicit emit for the Leave opcode.
12855         (VariableInfo): Add a readonly field.
12856
12857 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
12858
12859         * ecore.cs (ConvCast): new class used to encapsulate the various
12860         explicit integer conversions that works in both checked and
12861         unchecked contexts.
12862
12863         (Expression.ConvertNumericExplicit): Use new ConvCast class to
12864         properly generate the overflow opcodes.
12865
12866 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
12867
12868         * statement.cs: The correct type for the EmptyExpression is the
12869         element_type, not the variable type.  Ravi pointed this out.
12870
12871 2001-12-04  Ravi Pratap  <ravi@ximian.com>
12872
12873         * class.cs (Method::Define): Handle PInvoke methods specially
12874         by using DefinePInvokeMethod instead of the usual one.
12875
12876         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
12877         above to do the task of extracting information and defining the method.
12878
12879 2001-12-04  Ravi Pratap  <ravi@ximian.com>
12880
12881         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
12882         of the condition for string type.
12883
12884         (Emit): Move that here. 
12885
12886         (ArrayCreation::CheckIndices): Keep string literals in their expression
12887         form.
12888
12889         (EmitDynamicInitializers): Handle strings appropriately.
12890
12891 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
12892
12893         * codegen.cs (EmitContext): Replace multiple variables with a
12894         single pointer to the current Switch statement.
12895
12896         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
12897         EmitContext.
12898
12899 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
12900
12901         * statement.cs 
12902
12903         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
12904         default'.
12905
12906         (Foreach.Emit): Foreach on arrays was not setting
12907         up the loop variables (for break/continue).
12908
12909         (GotoCase): Semi-implented.
12910
12911 2001-12-03  Ravi Pratap  <ravi@ximian.com>
12912
12913         * attribute.cs (CheckAttribute): Handle system attributes by using
12914         Attribute.GetAttributes to examine information we need.
12915
12916         (GetValidPlaces): Same here.
12917
12918         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
12919
12920         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
12921
12922         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
12923
12924         (Method::Define): Set appropriate flags if we have a DllImport attribute.
12925
12926         (Method::Emit): Handle the case when we are a PInvoke method.
12927
12928 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
12929
12930         * expression.cs: Use ResolveWithSimpleName on compound names.
12931
12932 2001-12-02  Ravi Pratap  <ravi@ximian.com>
12933
12934         * constant.cs (EmitConstant): Make sure we resolve the associated expression
12935         before trying to reduce it.
12936
12937         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
12938
12939         * constant.cs (LookupConstantValue): Implement.
12940
12941         (EmitConstant): Use the above in emitting the constant.
12942
12943         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
12944         that are user-defined by doing a LookupConstantValue on them.
12945
12946         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
12947         too, like above.
12948
12949 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
12950
12951         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
12952
12953         (BaseAccess.DoResolve): Implement.
12954
12955         (MemberAccess.DoResolve): Split this routine into a
12956         ResolveMemberAccess routine that can be used independently
12957
12958 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
12959
12960         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
12961         As that share bits of the implementation.  Is returns a boolean,
12962         while As returns the Type that is being probed.
12963
12964 2001-12-01  Ravi Pratap  <ravi@ximian.com>
12965
12966         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
12967         instead of a Literal - much easier.
12968
12969         (EnumInTransit): Remove - utterly useless :-)
12970
12971         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
12972
12973         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
12974
12975         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
12976         chain when we have no associated expression.
12977
12978 2001-11-30  Ravi Pratap  <ravi@ximian.com>
12979
12980         * constant.cs (Define): Use Location while reporting the errror.
12981
12982         Also emit a warning when 'new' is used and there is no inherited
12983         member to hide.
12984
12985         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
12986         populated.
12987
12988         (LookupEnumValue): Implement to lookup an enum member's value and define it
12989         if necessary.
12990
12991         (Populate): Re-write accordingly to use the above routine.
12992
12993 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
12994
12995         * expression.cs (This): Fix prototype for DoResolveLValue to
12996         override the base class DoResolveLValue.
12997
12998         * cs-parser.cs: Report errors cs574 and cs575 (destructor
12999         declarations) 
13000
13001         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
13002         (we need to load the address of the field here).  This fixes
13003         test-22. 
13004
13005         (FieldExpr.DoResolveLValue): Call the DoResolve
13006         function to initialize the Instance expression.
13007
13008         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
13009         correctly the GetEnumerator operation on a value type.
13010
13011         * cs-parser.jay: Add more simple parsing error catches.
13012
13013         * statement.cs (Switch): Add support for string switches.
13014         Handle null specially.
13015
13016         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
13017
13018 2001-11-28  Ravi Pratap  <ravi@ximian.com>
13019
13020         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
13021
13022         (declare_local_constant): New helper function.
13023
13024         * statement.cs (AddConstant): Keep a separate record of constants
13025
13026         (IsConstant): Implement to determine if a variable is a constant.
13027
13028         (GetConstantExpression): Implement.
13029
13030         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
13031
13032         * statement.cs (IsVariableDefined): Re-write.
13033
13034 2001-11-27  Ravi Pratap  <ravi@ximian.com>
13035
13036         * class.cs (TypeContainer::FindMembers): Look for constants
13037         in the case when we are looking for MemberTypes.Field
13038
13039         * expression.cs (MemberAccess::DoResolve): Check that in the
13040         case we are a FieldExpr and a Literal, we are not being accessed
13041         by an instance reference.
13042
13043         * cs-parser.jay (local_constant_declaration): Implement.
13044
13045         (declaration_statement): Implement for constant declarations.
13046
13047 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
13048
13049         * statement.cs (Switch): Catch double defaults.
13050
13051         (Switch): More work on the switch() statement
13052         implementation.  It works for integral values now, need to finish
13053         string support.
13054
13055
13056 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
13057
13058         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
13059         integer literals into other integer literals.  To be used by
13060         switch. 
13061
13062 2001-11-24  Ravi Pratap  <ravi@ximian.com>
13063
13064         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
13065         some memory.
13066
13067         (EmitDynamicInitializers): Cope with the above since we extract data
13068         directly from ArrayData now.
13069
13070         (ExpectInitializers): Keep track of whether initializers are mandatory
13071         or not.
13072
13073         (Bounds): Make it a hashtable to prevent the same dimension being 
13074         recorded for every element in that dimension.
13075
13076         (EmitDynamicInitializers): Fix bug which prevented the Set array method
13077         from being found.
13078
13079         Also fix bug which was causing the indices to be emitted in the reverse
13080         order.
13081
13082 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
13083
13084         * expression.cs (ArrayCreation): Implement the bits that Ravi left
13085         unfinished.  They do not work, because the underlying code is
13086         sloppy.
13087
13088 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13089
13090         * cs-parser.jay: Remove bogus fixme.
13091
13092         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
13093         on Switch statement.
13094
13095 2001-11-23  Ravi Pratap  <ravi@ximian.com>
13096
13097         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
13098         the same. 
13099
13100         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
13101         parameter. Apparently, any expression is allowed. 
13102
13103         (ValidateInitializers): Update accordingly.
13104
13105         (CheckIndices): Fix some tricky bugs thanks to recursion.
13106
13107         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
13108         I was being completely brain-dead.
13109
13110         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
13111         and re-write acordingly.
13112
13113         (DelegateInvocation): Re-write accordingly.
13114
13115         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
13116
13117         (MakeByteBlob): Handle types more correctly.
13118
13119         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
13120         initialization from expressions but it is incomplete because I am a complete
13121         Dodo :-|
13122
13123 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13124
13125         * statement.cs (If.Emit): Fix a bug that generated incorrect code
13126         on If.  Basically, we have to return `true' (ie, we do return to
13127         our caller) only if both branches of the if return.
13128
13129         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
13130         short-circuit operators, handle them as short circuit operators. 
13131
13132         (Cast.DoResolve): Resolve type.
13133         (Cast.Cast): Take an expression as the target type.
13134
13135         * cs-parser.jay (cast_expression): Remove old hack that only
13136         allowed a limited set of types to be handled.  Now we take a
13137         unary_expression and we resolve to a type during semantic
13138         analysis.
13139
13140         Use the grammar productions from Rhys to handle casts (this is
13141         not complete like Rhys syntax yet, we fail to handle that corner
13142         case that C# has regarding (-x), but we will get there.
13143
13144 2001-11-22  Ravi Pratap  <ravi@ximian.com>
13145
13146         * class.cs (EmitFieldInitializer): Take care of the case when we have a
13147         field which is an array type.
13148
13149         * cs-parser.jay (declare_local_variables): Support array initialization too.
13150
13151         * typemanager.cs (MakeKey): Implement.
13152
13153         (everywhere): Use the above appropriately.
13154
13155         * cs-parser.jay (for_statement): Update for array initialization while
13156         declaring variables.
13157
13158         * ecore.cs : The error message was correct, it's the variable's names that
13159         were misleading ;-) Make the code more readable.
13160
13161         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
13162         the correct type etc.
13163
13164         (ConvertExplicit): Handle Enum types by examining the underlying type.
13165
13166 2001-11-21  Ravi Pratap  <ravi@ximian.com>
13167
13168         * parameter.cs (GetCallingConvention): Always return
13169         CallingConventions.Standard for now.
13170
13171 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13172
13173         * expression.cs (Binary.ResolveOperator): Update the values of `l'
13174         and `r' after calling DoNumericPromotions.
13175
13176         * ecore.cs: Fix error message (the types were in the wrong order).
13177
13178         * statement.cs (Foreach.ProbeCollectionType): Need to pass
13179         BindingFlags.Instance as well 
13180
13181         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
13182         implicit int literal conversion in an empty cast so that we
13183         propagate the right type upstream.
13184
13185         (UnboxCast): new class used to unbox value types.
13186         (Expression.ConvertExplicit): Add explicit type conversions done
13187         by unboxing.
13188
13189         (Expression.ImplicitNumericConversion): Oops, forgot to test for
13190         the target type before applying the implicit LongLiterals to ULong
13191         literal cast.
13192
13193 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
13194
13195         * cs-parser.jay (for_statement): Reworked the way For works: now
13196         we declare manually any variables that are introduced in
13197         for_initializer to solve the problem of having out-of-band code
13198         emition (that is what got for broken).
13199
13200         (declaration_statement): Perform the actual variable declaration
13201         that used to be done in local_variable_declaration here.
13202
13203         (local_variable_declaration): Do not declare anything, just pass
13204         the information on a DictionaryEntry
13205
13206 2001-11-20  Ravi Pratap  <ravi@ximian.com>
13207
13208         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
13209         re-write of the logic to now make it recursive.
13210
13211         (UpdateIndices): Re-write accordingly.
13212
13213         Store element data in a separate ArrayData list in the above methods.
13214
13215         (MakeByteBlob): Implement to dump the array data into a byte array.
13216
13217 2001-11-19  Ravi Pratap  <ravi@ximian.com>
13218
13219         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
13220         into CheckIndices.
13221
13222         * constant.cs (Define): Implement.
13223
13224         (EmitConstant): Re-write fully.
13225
13226         Pass in location info.
13227
13228         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
13229         respectively.
13230
13231         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
13232         DictionaryEntry since we need location info too.
13233
13234         (constant_declaration): Update accordingly.
13235
13236         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
13237         code into another method : UpdateIndices.
13238
13239 2001-11-18  Ravi Pratap  <ravi@ximian.com>
13240
13241         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
13242         some type checking etc.
13243
13244 2001-11-17  Ravi Pratap  <ravi@ximian.com>
13245
13246         * expression.cs (ArrayCreation::ValidateInitializers): Implement
13247         bits to provide dimension info if the user skips doing that.
13248
13249         Update second constructor to store the rank correctly.
13250
13251 2001-11-16  Ravi Pratap  <ravi@ximian.com>
13252
13253         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
13254         and try to implement.
13255
13256         * ../errors/cs0150.cs : Add.
13257
13258         * ../errors/cs0178.cs : Add.
13259
13260 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
13261
13262         * statement.cs: Implement foreach on multi-dimensional arrays. 
13263
13264         * parameter.cs (Parameters.GetParameterByName): Also lookup the
13265         name of the params argument.
13266
13267         * expression.cs: Use EmitStoreOpcode to get the right opcode while
13268         initializing the array.
13269
13270         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
13271         we can use this elsewhere.
13272
13273         * statement.cs: Finish implementation of foreach for single
13274         dimension arrays.
13275
13276         * cs-parser.jay: Use an out-of-band stack to pass information
13277         around, I wonder why I need this.
13278
13279         foreach_block: Make the new foreach_block the current_block.
13280
13281         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
13282         function used to return a static Parameters structure.  Used for
13283         empty parameters, as those are created very frequently.
13284
13285         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
13286
13287 2001-11-15  Ravi Pratap  <ravi@ximian.com>
13288
13289         * interface.cs : Default modifier is private, not public. The
13290         make verify test passes again.
13291
13292 2001-11-15  Ravi Pratap  <ravi@ximian.com>
13293
13294         * support.cs (ReflectionParameters): Fix logic to determine
13295         whether the last parameter is a params one. Test 9 passes again.
13296
13297         * delegate.cs (Populate): Register the builders we define with
13298         RegisterParameterForBuilder. Test 19 passes again.
13299
13300         * cs-parser.jay (property_declaration): Reference $6 instead
13301         of $$ to get at the location.
13302
13303         (indexer_declaration): Similar stuff.
13304
13305         (attribute): Ditto.
13306
13307         * class.cs (Property): Register parameters for the Get and Set methods
13308         if they exist. Test 23 passes again.
13309
13310         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
13311         call to EmitArguments as we are sure there aren't any params arguments. 
13312         Test 32 passes again.
13313
13314         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
13315         IndexOutOfRangeException. 
13316
13317         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
13318         Test 33 now passes again.
13319
13320 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
13321
13322         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
13323         broke a bunch of things.  Will have to come up with a better way
13324         of tracking locations.
13325
13326         * statement.cs: Implemented foreach for single dimension arrays.
13327
13328 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
13329
13330         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
13331         an error.  This removes the lookup from the critical path.
13332
13333         * cs-parser.jay: Removed use of temporary_loc, which is completely
13334         broken. 
13335
13336 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
13337
13338         * support.cs (ReflectionParameters.ParameterModifier): Report
13339         whether the argument is a PARAMS argument or not.
13340
13341         * class.cs: Set the attribute `ParamArrayAttribute' on the
13342         parameter argument.
13343
13344         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
13345         and cons_param_array_attribute (ConstructorInfo for
13346         ParamArrayAttribute)., 
13347
13348         * codegen.cs: Emit the return using the `Return' statement, that
13349         way we can report the error correctly for missing return values. 
13350
13351         * class.cs (Method.Emit): Clean up.
13352
13353         * expression.cs (Argument.Resolve): Take another argument: the
13354         location where this argument is used.  Notice that this is not
13355         part of the "Argument" class as to reduce the size of the
13356         structure (we know the approximate location anyways).
13357
13358         Test if the argument is a variable-reference, if not, then
13359         complain with a 206.
13360
13361         (Argument.Emit): Emit addresses of variables.
13362
13363         (Argument.FullDesc): Simplify.
13364
13365         (Invocation.DoResolve): Update for Argument.Resolve.
13366
13367         (ElementAccess.DoResolve): ditto.
13368
13369         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
13370         method should be virtual, as this method is always virtual.
13371
13372         (NewDelegate.DoResolve): Update for Argument.Resolve.
13373
13374         * class.cs (ConstructorInitializer.DoResolve): ditto.
13375
13376         * attribute.cs (Attribute.Resolve): ditto.
13377
13378 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
13379
13380         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
13381
13382         * expression.cs (ParameterReference): Drop IStackStorage and implement
13383         IAssignMethod instead. 
13384
13385         (LocalVariableReference): ditto.
13386
13387         * ecore.cs (FieldExpr): Drop IStackStorage and implement
13388         IAssignMethod instead. 
13389
13390 2001-11-13  Miguel de Icaza <miguel@ximian.com>
13391
13392         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
13393         enumerations that are used in heavily used structures derive from
13394         byte in a laughable and pathetic attempt to reduce memory usage.
13395         This is the kind of pre-optimzations that you should not do at
13396         home without adult supervision.
13397
13398         * expression.cs (UnaryMutator): New class, used to handle ++ and
13399         -- separatedly from the other unary operators.  Cleans up the
13400         code, and kills the ExpressionStatement dependency in Unary.
13401
13402         (Unary): Removed `method' and `Arguments' from this class, making
13403         it smaller, and moving it all to SimpleCall, so I can reuse this
13404         code in other locations and avoid creating a lot of transient data
13405         strucutres when not required.
13406
13407         * cs-parser.jay: Adjust for new changes.
13408
13409 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
13410
13411         * enum.cs (Enum.Populate): If there is a failure during
13412         definition, return
13413
13414         * cs-parser.jay (opt_enum_base): we used to catch type errors
13415         here, but this is really incorrect.  The type error should be
13416         catched during semantic analysis.
13417
13418 2001-12-11  Ravi Pratap  <ravi@ximian.com>
13419
13420         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
13421         current_local_parameters as expected since I, in my stupidity, had forgotten
13422         to do this :-)
13423
13424         * attribute.cs (GetValidPlaces): Fix stupid bug.
13425
13426         * class.cs (Method::Emit): Perform check on applicability of attributes.
13427
13428         (Constructor::Emit): Ditto.
13429
13430         (Field::Emit): Ditto.
13431
13432         (Field.Location): Store location information.
13433
13434         (Property, Event, Indexer, Operator): Ditto.
13435
13436         * cs-parser.jay (field_declaration): Pass in location for each field.
13437
13438         * ../errors/cs0592.cs : Add.
13439
13440 2001-11-12  Ravi Pratap  <ravi@ximian.com>
13441
13442         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
13443
13444         (InitCoreTypes): Update accordingly.
13445
13446         (RegisterAttrType, LookupAttr): Implement.
13447
13448         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
13449         info about the same.
13450
13451         (Resolve): Update to populate the above as necessary.
13452
13453         (Error592): Helper.
13454
13455         (GetValidPlaces): Helper to the above.
13456
13457         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
13458
13459         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
13460
13461 2001-11-12  Ravi Pratap  <ravi@ximian.com>
13462
13463         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
13464
13465         * ../errors/cs0617.cs : Add.
13466
13467 2001-11-11  Ravi Pratap  <ravi@ximian.com>
13468
13469         * enum.cs (Emit): Rename to Populate to be more consistent with what
13470         we expect it to do and when exactly it is called.
13471
13472         * class.cs, rootcontext.cs : Update accordingly.
13473
13474         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
13475         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
13476
13477         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
13478
13479         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
13480         of a fieldinfo using the above, when dealing with a FieldBuilder.
13481
13482 2001-11-10  Ravi Pratap  <ravi@ximian.com>
13483
13484         * ../errors/cs0031.cs : Add.
13485
13486         * ../errors/cs1008.cs : Add.
13487
13488         * ../errrors/cs0543.cs : Add.
13489
13490         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
13491         enum type.
13492
13493         (FindMembers): Implement.
13494
13495         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
13496         enums and delegates too.
13497
13498         (enum_types): Rename to builder_to_enum.
13499
13500         (delegate_types): Rename to builder_to_delegate.
13501
13502         * delegate.cs (FindMembers): Implement.
13503
13504 2001-11-09  Ravi Pratap  <ravi@ximian.com>
13505
13506         * typemanager.cs (IsEnumType): Implement.
13507
13508         * enum.cs (Emit): Re-write parts to account for the underlying type
13509         better and perform checking etc.
13510
13511         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
13512         of the underlying type.
13513
13514         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
13515         value
13516
13517         * enum.cs (error31): Helper to report error #31.
13518
13519         * cs-parser.jay (enum_declaration): Store location of each member too.
13520
13521         * enum.cs (member_to_location): New hashtable. 
13522
13523         (AddEnumMember): Update location hashtable.
13524
13525         (Emit): Use the location of each member while reporting errors.
13526
13527 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
13528
13529         * cs-parser.jay: A for_initializer if is a
13530         local_variable_declaration really ammount to have an implicit
13531         block with the variable declaration and no initializer for for.
13532
13533         * statement.cs (For.Emit): Cope with null initializers.
13534
13535         This fixes the infinite loop on for initializers.
13536
13537 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
13538
13539         * enum.cs: More cleanup.
13540
13541         * ecore.cs: Remove dead code.
13542
13543         * class.cs (Property.Emit): More simplification.
13544         (Event.Emit): ditto.
13545
13546         Reworked to have less levels of indentation.
13547
13548 2001-11-08  Ravi Pratap  <ravi@ximian.com>
13549
13550         * class.cs (Property): Emit attributes.
13551
13552         (Field): Ditto.
13553
13554         (Event): Ditto.
13555
13556         (Indexer): Ditto.
13557
13558         (Operator): Ditto.
13559
13560         * enum.cs (Emit): Ditto.
13561
13562         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
13563         Enums too.
13564
13565         * class.cs (Field, Event, etc.): Move attribute generation into the
13566         Emit method everywhere.
13567
13568         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
13569         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
13570         as we had no way of defining nested enums !
13571
13572         * rootcontext.cs : Adjust code accordingly.
13573
13574         * typemanager.cs (AddEnumType): To keep track of enum types separately.
13575
13576 2001-11-07  Ravi Pratap  <ravi@ximian.com>
13577
13578         * expression.cs (EvalConstantExpression): Move into ecore.cs
13579
13580         * enum.cs (Enum): Rename some members and make them public and readonly
13581         according to our convention.
13582
13583         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
13584         nothing else.
13585
13586         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
13587
13588         (Enum::Emit): Write a simple version for now which doesn't try to compute
13589         expressions. I shall modify this to be more robust in just a while.
13590
13591         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
13592
13593         (TypeContainer::CloseType): Create the Enum types too.
13594
13595         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
13596
13597         * expression.cs (EvalConstantExpression): Get rid of completely.
13598
13599         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
13600         user-defined values and other cases.
13601
13602         (IsValidEnumLiteral): Helper function.
13603
13604         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
13605         out there in the case we had a literal FieldExpr.
13606
13607         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
13608
13609         (Literalize): Revamp a bit to take two arguments.
13610
13611         (EnumLiteral): New class which derives from Literal to wrap enum literals.
13612
13613 2001-11-06  Ravi Pratap  <ravi@ximian.com>
13614
13615         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
13616
13617         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
13618
13619         (Resolve): Use the above to ensure we have proper initializers.
13620
13621 2001-11-05  Ravi Pratap  <ravi@ximian.com>
13622
13623         * expression.cs (Expression::EvalConstantExpression): New method to 
13624         evaluate constant expressions.
13625
13626         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
13627
13628 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
13629
13630         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
13631         in an array.
13632
13633         (Binary.ResolveOperator): Handle operator != (object a, object b)
13634         and operator == (object a, object b);
13635
13636         (Binary.DoNumericPromotions): Indicate whether the numeric
13637         promotion was possible.
13638
13639         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
13640         Implement.  
13641
13642         Made the ArrayAccess implement interface IAssignMethod instead of
13643         IStackStore as the order in which arguments are passed reflects
13644         this.
13645
13646         * assign.cs: Instead of using expr.ExprClass to select the way of
13647         assinging, probe for the IStackStore/IAssignMethod interfaces.
13648
13649         * typemanager.cs: Load InitializeArray definition.
13650
13651         * rootcontext.cs (RootContext.MakeStaticData): Used to define
13652         static data that can be used to initialize arrays. 
13653
13654 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
13655
13656         * expression.cs: Handle operator== and operator!= for booleans.
13657
13658         (Conditioal.Reduce): Implement reducer for the ?: operator.
13659
13660         (Conditional.Resolve): Implement dead code elimination.
13661
13662         (Binary.Resolve): Catch string literals and return a new
13663         concatenated string.
13664
13665         (Unary.Reduce): Implement reduction of unary expressions.
13666
13667         * ecore.cs: Split out the expression core handling here.
13668
13669         (Expression.Reduce): New method used to perform constant folding
13670         and CSE.  This is needed to support constant-expressions. 
13671
13672         * statement.cs (Statement.EmitBoolExpression): Pass true and false
13673         targets, and optimize for !x.
13674
13675 2001-11-04  Ravi Pratap  <ravi@ximian.com>
13676
13677         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
13678         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
13679         set custom atttributes.
13680
13681         * literal.cs (Literal::GetValue): New abstract method to return the actual
13682         value of the literal, cast as an object.
13683
13684         (*Literal): Implement GetValue method.
13685
13686         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
13687         expressions to the arraylist but objects of type Argument.
13688
13689         * class.cs (TypeContainer::Emit): Emit our attributes too.
13690
13691         (Method::Emit, Constructor::Emit): Ditto.
13692
13693         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
13694         to be ignoring earlier.
13695
13696 2001-11-03  Ravi Pratap  <ravi@ximian.com>
13697
13698         * attribute.cs (AttributeSection::Define): Implement to do the business
13699         of constructing a CustomAttributeBuilder.
13700
13701         (Attribute): New trivial class. Increases readability of code.  
13702
13703         * cs-parser.jay : Update accordingly.
13704
13705         (positional_argument_list, named_argument_list, named_argument): New rules
13706
13707         (attribute_arguments): Use the above so that we are more correct.
13708
13709 2001-11-02  Ravi Pratap  <ravi@ximian.com>
13710
13711         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
13712         to perform all checks for a method with a params parameter.
13713
13714         (Invocation::OverloadResolve): Update to use the above method and therefore
13715         cope correctly with params method invocations.
13716
13717         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
13718         params too.
13719
13720         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
13721         constructors in our parent too because we can't afford to miss out on 
13722         protected ones ;-)
13723
13724         * attribute.cs (AttributeSection): New name for the class Attribute
13725
13726         Other trivial changes to improve readability.
13727
13728         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
13729         use the new class names.
13730
13731 2001-11-01  Ravi Pratap  <ravi@ximian.com>
13732
13733         * class.cs (Method::Define): Complete definition for params types too
13734
13735         (Indexer::Define): Ditto.
13736
13737         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
13738         Cope everywhere with a request for info about the array parameter.
13739
13740 2001-11-01  Ravi Pratap  <ravi@ximian.com>
13741
13742         * tree.cs (RecordNamespace): Fix up to check for the correct key.
13743
13744         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
13745         local_variable_type to extract the string corresponding to the type.
13746
13747         (local_variable_type): Fixup the action to use the new helper method.
13748
13749         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
13750         go.
13751
13752         * expression.cs : Clean out code which uses the above.
13753
13754 2001-10-31  Ravi Pratap  <ravi@ximian.com>
13755
13756         * typemanager.cs (RegisterMethod): Check if we already have an existing key
13757         and bale out if necessary by returning a false.
13758
13759         (RegisterProperty): Ditto.
13760
13761         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
13762         and print out appropriate error messages.
13763
13764         * interface.cs (everywhere): Ditto.
13765
13766         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
13767         location to constructor.
13768
13769         * class.cs (Property, Event, Indexer): Update accordingly.
13770
13771         * ../errors/cs111.cs : Added.
13772
13773         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
13774         of a method, as laid down by the spec.
13775
13776         (Invocation::OverloadResolve): Use the above method.
13777
13778 2001-10-31  Ravi Pratap  <ravi@ximian.com>
13779
13780         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
13781         now take a TypeContainer and a Parameters object.
13782
13783         (ParameterData): Modify return type of ParameterModifier method to be 
13784         Parameter.Modifier and not a string.
13785
13786         (ReflectionParameters, InternalParameters): Update accordingly.
13787
13788         * expression.cs (Argument::GetParameterModifier): Same here.
13789
13790         * support.cs (InternalParameters::ParameterType): Find a better way of determining
13791         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
13792         symbol in it at all so maybe this is only for now.
13793
13794 2001-10-30  Ravi Pratap  <ravi@ximian.com>
13795
13796         * support.cs (InternalParameters): Constructor now takes an extra argument 
13797         which is the actual Parameters class.
13798
13799         (ParameterDesc): Update to provide info on ref/out modifiers.
13800
13801         * class.cs (everywhere): Update call to InternalParameters to pass in
13802         the second argument too.
13803
13804         * support.cs (ParameterData): Add ParameterModifier, which is a method 
13805         to return the modifier info [ref/out etc]
13806
13807         (InternalParameters, ReflectionParameters): Implement the above.
13808
13809         * expression.cs (Argument::ParameterModifier): Similar function to return
13810         info about the argument's modifiers.
13811
13812         (Invocation::OverloadResolve): Update to take into account matching modifiers 
13813         too.
13814
13815         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
13816         a new SetFormalParameters object which we pass to InternalParameters.
13817
13818 2001-10-30  Ravi Pratap  <ravi@ximian.com>
13819
13820         * expression.cs (NewArray): Merge into the ArrayCreation class.
13821
13822 2001-10-29  Ravi Pratap  <ravi@ximian.com>
13823
13824         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
13825         NewUserdefinedArray into one as there wasn't much of a use in having
13826         two separate ones.
13827
13828         * expression.cs (Argument): Change field's name to ArgType from Type.
13829
13830         (Type): New readonly property which returns the proper type, taking into 
13831         account ref/out modifiers.
13832
13833         (everywhere): Adjust code accordingly for the above.
13834
13835         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
13836         whether we are emitting for a ref or out parameter.
13837
13838         * expression.cs (Argument::Emit): Use the above field to set the state.
13839
13840         (LocalVariableReference::Emit): Update to honour the flag and emit the
13841         right stuff.
13842
13843         * parameter.cs (Attributes): Set the correct flags for ref parameters.
13844
13845         * expression.cs (Argument::FullDesc): New function to provide a full desc.
13846
13847         * support.cs (ParameterData): Add method ParameterDesc to the interface.
13848
13849         (ReflectionParameters, InternalParameters): Implement the above method.
13850
13851         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
13852         reporting errors.
13853
13854         (Invocation::FullMethodDesc): Ditto. 
13855
13856 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
13857
13858         * cs-parser.jay: Add extra production for the second form of array
13859         creation. 
13860
13861         * expression.cs (ArrayCreation): Update to reflect the above
13862         change. 
13863
13864         * Small changes to prepare for Array initialization.
13865
13866 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
13867
13868         * typemanager.cs (ImplementsInterface): interface might be null;
13869         Deal with this problem;
13870
13871         Also, we do store negative hits on the cache (null values), so use
13872         this instead of calling t.GetInterfaces on the type everytime.
13873
13874 2001-10-28  Ravi Pratap  <ravi@ximian.com>
13875
13876         * typemanager.cs (IsBuiltinType): New method to help determine the same.
13877
13878         * expression.cs (New::DoResolve): Get rid of array creation code and instead
13879         split functionality out into different classes.
13880
13881         (New::FormArrayType): Move into NewBuiltinArray.
13882
13883         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
13884         quite useless.
13885
13886         (NewBuiltinArray): New class to handle creation of built-in arrays.
13887
13888         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
13889         account creation of one-dimensional arrays.
13890
13891         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
13892
13893         (NewUserdefinedArray::DoResolve): Implement.
13894
13895         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
13896
13897         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
13898         we maintain inside the TypeManager. This is necessary to perform lookups on the
13899         module builder.
13900
13901         (LookupType): Update to perform GetType on the module builders too.     
13902
13903         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
13904
13905         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
13906
13907 2001-10-23  Ravi Pratap  <ravi@ximian.com>
13908
13909         * expression.cs (New::DoResolve): Implement guts of array creation.
13910
13911         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
13912
13913 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
13914
13915         * expression.cs: Fix bug I introduced lsat night that broke
13916         Delegates. 
13917
13918         (Expression.Resolve): Report a 246 error (can not resolve name)
13919         if we find a SimpleName in the stream.
13920
13921         (Expression.ResolveLValue): Ditto.
13922
13923         (Expression.ResolveWithSimpleName): This function is a variant of
13924         ResolveName, this one allows SimpleNames to be returned without a
13925         warning.  The only consumer of SimpleNames is MemberAccess
13926
13927 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
13928
13929         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
13930         might arrive here.  I have my doubts that this is correct.
13931
13932         * statement.cs (Lock): Implement lock statement.
13933
13934         * cs-parser.jay: Small fixes to support `lock' and `using'
13935
13936         * cs-tokenizer.cs: Remove extra space
13937
13938         * driver.cs: New flag --checked, allows to turn on integer math
13939         checking. 
13940
13941         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
13942         Threading.Monitor.Exit 
13943
13944 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
13945
13946         * expression.cs (IndexerAccess::DoResolveLValue): Set the
13947         Expression Class to be IndexerAccess.
13948
13949         Notice that Indexer::DoResolve sets the eclass to Value.
13950
13951 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
13952
13953         * class.cs (TypeContainer::Emit): Emit code for indexers.
13954
13955         * assign.cs (IAssignMethod): New interface implemented by Indexers
13956         and Properties for handling assignment.
13957
13958         (Assign::Emit): Simplify and reuse code. 
13959
13960         * expression.cs (IndexerAccess, PropertyExpr): Implement
13961         IAssignMethod, clean up old code. 
13962
13963 2001-10-22  Ravi Pratap  <ravi@ximian.com>
13964
13965         * typemanager.cs (ImplementsInterface): New method to determine if a type
13966         implements a given interface. Provides a nice cache too.
13967
13968         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
13969         method.
13970
13971         (ConvertReferenceExplicit): Ditto.
13972
13973         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
13974         various methods, with correct names etc.
13975
13976         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
13977         Operator.UnaryNegation.
13978
13979         * cs-parser.jay (operator_declarator): Be a little clever in the case where
13980         we have a unary plus or minus operator.
13981
13982         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
13983         UnaryMinus.
13984
13985         * everywhere : update accordingly.
13986
13987         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
13988         respectively.
13989
13990         * class.cs (Method::Define): For the case where we are implementing a method
13991         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
13992         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
13993
13994 2001-10-21  Ravi Pratap  <ravi@ximian.com>
13995
13996         * interface.cs (FindMembers): Implement to work around S.R.E
13997         lameness.
13998
13999         * typemanager.cs (IsInterfaceType): Implement.
14000
14001         (FindMembers): Update to handle interface types too.
14002
14003         * expression.cs (ImplicitReferenceConversion): Re-write bits which
14004         use IsAssignableFrom as that is not correct - it doesn't work.
14005
14006         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
14007         and accordingly override EmitStatement.
14008
14009         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
14010         using the correct logic :-)
14011
14012 2001-10-19  Ravi Pratap  <ravi@ximian.com>
14013
14014         * ../errors/cs-11.cs : Add to demonstrate error -11 
14015
14016 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
14017
14018         * assign.cs (Assign::Resolve): Resolve right hand side first, and
14019         then pass this as a hint to ResolveLValue.
14020
14021         * expression.cs (FieldExpr): Add Location information
14022
14023         (FieldExpr::LValueResolve): Report assignment to readonly
14024         variable. 
14025
14026         (Expression::ExprClassFromMemberInfo): Pass location information.
14027
14028         (Expression::ResolveLValue): Add new method that resolves an
14029         LValue. 
14030
14031         (Expression::DoResolveLValue): Default invocation calls
14032         DoResolve. 
14033
14034         (Indexers): New class used to keep track of indexers in a given
14035         Type. 
14036
14037         (IStackStore): Renamed from LValue, as it did not really describe
14038         what this did.  Also ResolveLValue is gone from this interface and
14039         now is part of Expression.
14040
14041         (ElementAccess): Depending on the element access type
14042
14043         * typemanager.cs: Add `indexer_name_type' as a Core type
14044         (System.Runtime.CompilerServices.IndexerNameAttribute)
14045
14046         * statement.cs (Goto): Take a location.
14047
14048 2001-10-18  Ravi Pratap  <ravi@ximian.com>
14049
14050         * delegate.cs (Delegate::VerifyDelegate): New method to verify
14051         if two delegates are compatible.
14052
14053         (NewDelegate::DoResolve): Update to take care of the case when
14054         we instantiate a delegate from another delegate.
14055
14056         * typemanager.cs (FindMembers): Don't even try to look up members
14057         of Delegate types for now.
14058
14059 2001-10-18  Ravi Pratap  <ravi@ximian.com>
14060
14061         * delegate.cs (NewDelegate): New class to take care of delegate
14062         instantiation.
14063
14064         * expression.cs (New): Split the delegate related code out into 
14065         the NewDelegate class.
14066
14067         * delegate.cs (DelegateInvocation): New class to handle delegate 
14068         invocation.
14069
14070         * expression.cs (Invocation): Split out delegate related code into
14071         the DelegateInvocation class.
14072
14073 2001-10-17  Ravi Pratap  <ravi@ximian.com>
14074
14075         * expression.cs (New::DoResolve): Implement delegate creation fully
14076         and according to the spec.
14077
14078         (New::DoEmit): Update to handle delegates differently.
14079
14080         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
14081         because of which we were printing out arguments in reverse order !
14082
14083         * delegate.cs (VerifyMethod): Implement to check if the given method
14084         matches the delegate.
14085
14086         (FullDelegateDesc): Implement.
14087
14088         (VerifyApplicability): Implement.
14089
14090         * expression.cs (Invocation::DoResolve): Update to accordingly handle
14091         delegate invocations too.
14092
14093         (Invocation::Emit): Ditto.
14094
14095         * ../errors/cs1593.cs : Added.
14096
14097         * ../errors/cs1594.cs : Added.
14098
14099         * delegate.cs (InstanceExpression, TargetMethod): New properties.
14100
14101 2001-10-16  Ravi Pratap  <ravi@ximian.com>
14102
14103         * typemanager.cs (intptr_type): Core type for System.IntPtr
14104
14105         (InitCoreTypes): Update for the same.
14106
14107         (iasyncresult_type, asynccallback_type): Ditto.
14108
14109         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
14110         correct.
14111
14112         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
14113         too.
14114
14115         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
14116         the builders for the 4 members of a delegate type :-)
14117
14118         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
14119         type.
14120
14121         * expression.cs (New::DoResolve): Implement guts for delegate creation.
14122
14123         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
14124
14125 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
14126
14127         * statement.cs (Break::Emit): Implement.   
14128         (Continue::Emit): Implement.
14129
14130         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14131         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14132         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14133         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
14134         end loop
14135
14136         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
14137         properties that track the label for the current loop (begin of the
14138         loop and end of the loop).
14139
14140 2001-10-15  Ravi Pratap  <ravi@ximian.com>
14141
14142         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
14143         use of emitting anything at all.
14144
14145         * class.cs, rootcontext.cs : Get rid of calls to the same.
14146
14147         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
14148
14149         (Populate): Define the constructor correctly and set the implementation
14150         attributes.
14151
14152         * typemanager.cs (delegate_types): New hashtable to hold delegates that
14153         have been defined.
14154
14155         (AddDelegateType): Implement.
14156
14157         (IsDelegateType): Implement helper method.
14158
14159         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
14160
14161         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
14162         and accordingly handle it.
14163
14164         * delegate.cs (Populate): Take TypeContainer argument.
14165         Implement bits to define the Invoke method. However, I still haven't figured out
14166         how to take care of the native int bit :-(
14167
14168         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
14169         Qualify the name of the delegate, not its return type !
14170
14171         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
14172         conversion.
14173
14174         (StandardConversionExists): Checking for array types turns out to be recursive.
14175
14176         (ConvertReferenceExplicit): Implement array conversion.
14177
14178         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
14179
14180 2001-10-12  Ravi Pratap  <ravi@ximian.com>
14181
14182         * cs-parser.jay (delegate_declaration): Store the fully qualified
14183         name as it is a type declaration.
14184
14185         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
14186         readonly.
14187
14188         (DefineDelegate): Renamed from Define. Does the same thing essentially,
14189         as TypeContainer::DefineType.
14190
14191         (Populate): Method in which all the definition of the various methods (Invoke)
14192         etc is done.
14193
14194         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
14195         see.
14196
14197         (CloseDelegate): Finally creates the delegate.
14198
14199         * class.cs (TypeContainer::DefineType): Update to define delegates.
14200         (Populate, Emit and CloseType): Do the same thing here too.
14201
14202         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
14203         delegates in all these operations.
14204
14205 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
14206
14207         * expression.cs: LocalTemporary: a new expression used to
14208         reference a temporary that has been created.
14209
14210         * assign.cs: Handle PropertyAccess back here, so that we can
14211         provide the proper semantic access to properties.
14212
14213         * expression.cs (Expression::ConvertReferenceExplicit): Implement
14214         a few more explicit conversions. 
14215
14216         * modifiers.cs: `NEW' modifier maps to HideBySig.
14217
14218         * expression.cs (PropertyExpr): Make this into an
14219         ExpressionStatement, and support the EmitStatement code path. 
14220
14221         Perform get/set error checking, clean up the interface.
14222
14223         * assign.cs: recognize PropertyExprs as targets, and if so, turn
14224         them into toplevel access objects.
14225
14226 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
14227
14228         * expression.cs: PropertyExpr::PropertyExpr: use work around the
14229         SRE.
14230
14231         * typemanager.cs: Keep track here of our PropertyBuilders again to
14232         work around lameness in SRE.
14233
14234 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
14235
14236         * expression.cs (LValue::LValueResolve): New method in the
14237         interface, used to perform a second resolution pass for LValues. 
14238
14239         (This::DoResolve): Catch the use of this in static methods.
14240
14241         (This::LValueResolve): Implement.
14242
14243         (This::Store): Remove warning, assigning to `this' in structures
14244         is 
14245
14246         (Invocation::Emit): Deal with invocation of
14247         methods on value types.  We need to pass the address to structure
14248         methods rather than the object itself.  (The equivalent code to
14249         emit "this" for structures leaves the entire structure on the
14250         stack instead of a pointer to it). 
14251
14252         (ParameterReference::DoResolve): Compute the real index for the
14253         argument based on whether the method takes or not a `this' pointer
14254         (ie, the method is static).
14255
14256         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
14257         value types returned from functions when we need to invoke a
14258         method on the sturcture.
14259
14260
14261 2001-10-11  Ravi Pratap  <ravi@ximian.com>
14262
14263         * class.cs (TypeContainer::DefineType): Method to actually do the business of
14264         defining the type in the Modulebuilder or Typebuilder. This is to take
14265         care of nested types which need to be defined on the TypeBuilder using
14266         DefineNestedMethod.
14267
14268         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
14269         methods in RootContext, only ported to be part of TypeContainer.
14270
14271         (TypeContainer::GetInterfaceOrClass): Ditto.
14272
14273         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
14274
14275         * interface.cs (Interface::DefineInterface): New method. Does exactly
14276         what RootContext.CreateInterface did earlier, only it takes care of nested types 
14277         too.
14278
14279         (Interface::GetInterfaces): Move from RootContext here and port.
14280
14281         (Interface::GetInterfaceByName): Same here.
14282
14283         * rootcontext.cs (ResolveTree): Re-write.
14284
14285         (PopulateTypes): Re-write.
14286
14287         * class.cs (TypeContainer::Populate): Populate nested types too.
14288         (TypeContainer::Emit): Emit nested members too.
14289
14290         * typemanager.cs (AddUserType): Do not make use of the FullName property,
14291         instead just use the name argument passed in as it is already fully
14292         qualified.
14293
14294         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
14295         to TypeContainer mapping to see if a type is user-defined.
14296
14297         * class.cs (TypeContainer::CloseType): Implement. 
14298
14299         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
14300         the default constructor.
14301
14302         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
14303         twice.
14304
14305         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
14306
14307         * interface.cs (CloseType): Create the type here.
14308
14309         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
14310         the hierarchy.
14311
14312         Remove all the methods which are now in TypeContainer.
14313
14314 2001-10-10  Ravi Pratap  <ravi@ximian.com>
14315
14316         * delegate.cs (Define): Re-write bits to define the delegate
14317         correctly.
14318
14319 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
14320
14321         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
14322
14323         * expression.cs (ImplicitReferenceConversion): handle null as well
14324         as a source to convert to any reference type.
14325
14326         * statement.cs (Return): Perform any implicit conversions to
14327         expected return type.  
14328
14329         Validate use of return statement.  
14330
14331         * codegen.cs (EmitContext): Pass the expected return type here.
14332
14333         * class.cs (Method, Constructor, Property): Pass expected return
14334         type to EmitContext.
14335
14336 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
14337
14338         * expression.cs: Make DoResolve take an EmitContext instead of a
14339         TypeContainer.
14340
14341         Replaced `l' and `location' for `loc', for consistency.
14342
14343         (Error, Warning): Remove unneeded Tc argument.
14344
14345         * assign.cs, literal.cs, constant.cs: Update to new calling
14346         convention. 
14347
14348         * codegen.cs: EmitContext now contains a flag indicating whether
14349         code is being generated in a static method or not.
14350
14351         * cs-parser.jay: DecomposeQI, new function that replaces the old
14352         QualifiedIdentifier.  Now we always decompose the assembled
14353         strings from qualified_identifier productions into a group of
14354         memberaccesses.
14355
14356 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
14357
14358         * rootcontext.cs: Deal with field-less struct types correctly now
14359         by passing the size option to Define Type.
14360
14361         * class.cs: Removed hack that created one static field. 
14362
14363 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
14364
14365         * statement.cs: Moved most of the code generation here. 
14366
14367 2001-10-09  Ravi Pratap  <ravi@ximian.com>
14368
14369         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
14370         seem very right.
14371
14372         (ElementAccess): Remove useless bits for now - keep checks as the spec
14373         says.
14374
14375 2001-10-08  Ravi Pratap  <ravi@ximian.com>
14376
14377         * expression.cs (ElementAccess::DoResolve): Remove my crap code
14378         and start performing checks according to the spec.
14379
14380 2001-10-07  Ravi Pratap  <ravi@ximian.com>
14381
14382         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
14383         rank_specifiers instead.
14384
14385         (rank_specifiers): Change the order in which the rank specifiers are stored
14386
14387         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
14388
14389         * expression.cs (ElementAccess): Implement the LValue interface too.
14390
14391 2001-10-06  Ravi Pratap  <ravi@ximian.com>
14392
14393         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
14394         except that user defined conversions are not included.
14395
14396         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
14397         perform the conversion of the return type, if necessary.
14398
14399         (New::DoResolve): Check whether we are creating an array or an object
14400         and accordingly do the needful.
14401
14402         (New::Emit): Same here.
14403
14404         (New::DoResolve): Implement guts of array creation.
14405
14406         (New::FormLookupType): Helper function.
14407
14408 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
14409
14410         * codegen.cs: Removed most of the code generation here, and move the
14411         corresponding code generation bits to the statement classes. 
14412
14413         Added support for try/catch/finalize and throw.
14414
14415         * cs-parser.jay: Added support for try/catch/finalize.
14416
14417         * class.cs: Catch static methods having the flags override,
14418         virtual or abstract.
14419
14420         * expression.cs (UserCast): This user cast was not really doing
14421         what it was supposed to do.  Which is to be born in fully resolved
14422         state.  Parts of the resolution were being performed at Emit time! 
14423
14424         Fixed this code.
14425
14426 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
14427
14428         * expression.cs: Implicity convert the result from UserCast.
14429
14430 2001-10-05  Ravi Pratap  <ravi@ximian.com>
14431
14432         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
14433         prevented it from working correctly. 
14434
14435         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
14436         merely ConvertImplicit.
14437
14438 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
14439
14440         * typemanager.cs: Make the LookupTypeContainer function static,
14441         and not per-instance.  
14442
14443         * class.cs: Make static FindMembers (the one that takes a Type
14444         argument). 
14445
14446         * codegen.cs: Add EmitForeach here.
14447
14448         * cs-parser.jay: Make foreach a toplevel object instead of the
14449         inline expansion, as we need to perform semantic analysis on it. 
14450
14451 2001-10-05  Ravi Pratap  <ravi@ximian.com>
14452
14453         * expression.cs (Expression::ImplicitUserConversion): Rename to
14454         UserDefinedConversion.
14455
14456         (Expression::UserDefinedConversion): Take an extra argument specifying 
14457         whether we look for explicit user conversions too.
14458
14459         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
14460
14461         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
14462
14463         (ExplicitUserConversion): Make it a call to UserDefinedConversion
14464         with the appropriate arguments.
14465
14466         * cs-parser.jay (cast_expression): Record location too.
14467
14468         * expression.cs (Cast): Record location info.
14469
14470         (Expression::ConvertExplicit): Take location argument.
14471
14472         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
14473         to determine if we are doing explicit conversions.
14474
14475         (UserCast::Emit): Update accordingly.
14476
14477         (Expression::ConvertExplicit): Report an error if everything fails.
14478
14479         * ../errors/cs0030.cs : Add.
14480
14481 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
14482
14483         * modifiers.cs: If the ABSTRACT keyword is present, also set the
14484         virtual and newslot bits. 
14485
14486         * class.cs (TypeContainer::RegisterRequiredImplementations):
14487         Record methods we need.
14488
14489         (TypeContainer::MakeKey): Helper function to make keys for
14490         MethodBases, since the Methodbase key is useless.
14491
14492         (TypeContainer::Populate): Call RegisterRequiredImplementations
14493         before defining the methods.   
14494
14495         Create a mapping for method_builders_to_methods ahead of time
14496         instead of inside a tight loop.
14497
14498         (::RequireMethods):  Accept an object as the data to set into the
14499         hashtable so we can report interface vs abstract method mismatch.
14500
14501 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
14502
14503         * report.cs: Make all of it static.
14504
14505         * rootcontext.cs: Drop object_type and value_type computations, as
14506         we have those in the TypeManager anyways.
14507
14508         Drop report instance variable too, now it is a global.
14509
14510         * driver.cs: Use try/catch on command line handling.
14511
14512         Add --probe option to debug the error reporting system with a test
14513         suite. 
14514
14515         * report.cs: Add support for exiting program when a probe
14516         condition is reached.
14517
14518 2001-10-03  Ravi Pratap  <ravi@ximian.com>
14519
14520         * expression.cs (Binary::DoNumericPromotions): Fix the case when
14521         we do a forcible conversion regardless of type, to check if 
14522         ForceConversion returns a null.
14523
14524         (Binary::error19): Use location to report error.
14525
14526         (Unary::error23): Use location here too.
14527
14528         * ../errors/cs0019.cs : Check in.
14529
14530         * ../errors/cs0023.cs : Check in.
14531
14532         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
14533         case of a non-null MethodInfo object with a length of 0 !
14534
14535         (Binary::ResolveOperator): Flag error if overload resolution fails to find
14536         an applicable member - according to the spec :-)
14537         Also fix logic to find members in base types.
14538
14539         (Unary::ResolveOperator): Same here.
14540
14541         (Unary::report23): Change name to error23 and make first argument a TypeContainer
14542         as I was getting thoroughly confused between this and error19 :-)
14543
14544         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
14545         (::FindMostEncompassedType): Implement.
14546         (::FindMostEncompassingType): Implement.
14547         (::StandardConversionExists): Implement.
14548
14549         (UserImplicitCast): Re-vamp. We now need info about most specific
14550         source and target types so that we can do the necessary conversions.
14551
14552         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
14553         mathematical union with no duplicates.
14554
14555 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
14556
14557         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
14558         in order from base classes to child classes, so that we can in
14559         child classes look up in our parent for method names and
14560         attributes (required for handling abstract, virtual, new, override
14561         constructs: we need to instrospect our base class, and if we dont
14562         populate the classes in order, the introspection might be
14563         incorrect.  For example, a method could query its parent before
14564         the parent has any methods and would determine that the parent has
14565         no abstract methods (while it could have had them)).
14566
14567         (RootContext::CreateType): Record the order in which we define the
14568         classes.
14569
14570 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
14571
14572         * class.cs (TypeContainer::Populate): Also method definitions can
14573         fail now, keep track of this.
14574
14575         (TypeContainer::FindMembers): Implement support for
14576         DeclaredOnly/noDeclaredOnly flag.
14577
14578         (Constructor::Emit) Return the ConstructorBuilder.
14579
14580         (Method::Emit) Return the MethodBuilder. 
14581         Check for abstract or virtual methods to be public.
14582
14583         * rootcontext.cs (RootContext::CreateType): Register all the
14584         abstract methods required for the class to be complete and the
14585         interface methods that must be implemented. 
14586
14587         * cs-parser.jay: Report error 501 (method requires body if it is
14588         not marked abstract or extern).
14589
14590         * expression.cs (TypeOf::Emit): Implement.
14591
14592         * typemanager.cs: runtime_handle_type, new global type.
14593
14594         * class.cs (Property::Emit): Generate code for properties.
14595
14596 2001-10-02  Ravi Pratap  <ravi@ximian.com>
14597
14598         * expression.cs (Unary::ResolveOperator): Find operators on base type
14599         too - we now conform exactly to the spec.
14600
14601         (Binary::ResolveOperator): Same here.
14602
14603         * class.cs (Operator::Define): Fix minor quirk in the tests.
14604
14605         * ../errors/cs0215.cs : Added.
14606
14607         * ../errors/cs0556.cs : Added.
14608
14609         * ../errors/cs0555.cs : Added.
14610
14611 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
14612
14613         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
14614         single integer which is really efficient
14615
14616 2001-10-01  Ravi Pratap  <ravi@ximian.com>
14617
14618         *  expression.cs (Expression::ImplicitUserConversion): Use location
14619         even in the case when we are examining True operators.
14620  
14621         * class.cs (Operator::Define): Perform extensive checks to conform
14622         with the rules for operator overloading in the spec.
14623
14624         * expression.cs (Expression::ImplicitReferenceConversion): Implement
14625         some of the other conversions mentioned in the spec.
14626
14627         * typemanager.cs (array_type): New static member for the System.Array built-in
14628         type.
14629
14630         (cloneable_interface): For System.ICloneable interface.
14631
14632         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
14633         we start resolving the tree and populating types.
14634
14635         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
14636  
14637 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
14638
14639         * expression.cs (Expression::ExprClassFromMemberInfo,
14640         Expression::Literalize): Create literal expressions from
14641         FieldInfos which are literals.
14642
14643         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
14644         type casts, because they were wrong.  The test suite in tests
14645         caught these ones.
14646
14647         (ImplicitNumericConversion): ushort to ulong requires a widening
14648         cast. 
14649
14650         Int32 constant to long requires widening cast as well.
14651
14652         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
14653         for integers because the type on the stack is not i4.
14654
14655 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
14656
14657         * expression.cs (report118): require location argument. 
14658
14659         * parameter.cs: Do not dereference potential null value.
14660
14661         * class.cs: Catch methods that lack the `new' keyword when
14662         overriding a name.  Report warnings when `new' is used without
14663         anything being there to override.
14664
14665         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
14666
14667         * class.cs: Only add constructor to hashtable if it is non-null
14668         (as now constructors can fail on define).
14669
14670         (TypeManager, Class, Struct): Take location arguments.
14671
14672         Catch field instance initialization in structs as errors.
14673
14674         accepting_filter: a new filter for FindMembers that is static so
14675         that we dont create an instance per invocation.
14676
14677         (Constructor::Define): Catch errors where a struct constructor is
14678         parameterless 
14679
14680         * cs-parser.jay: Pass location information for various new
14681         constructs. 
14682
14683         * delegate.cs (Delegate): take a location argument.
14684
14685         * driver.cs: Do not call EmitCode if there were problesm in the
14686         Definition of the types, as many Builders wont be there. 
14687
14688         * decl.cs (Decl::Decl): Require a location argument.
14689
14690         * cs-tokenizer.cs: Handle properly hex constants that can not fit
14691         into integers, and find the most appropiate integer for it.
14692
14693         * literal.cs: Implement ULongLiteral.
14694
14695         * rootcontext.cs: Provide better information about the location of
14696         failure when CreateType fails.
14697
14698 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
14699
14700         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
14701         as well.
14702
14703         * expression.cs (Binary::CheckShiftArguments): Add missing type
14704         computation.
14705         (Binary::ResolveOperator): Add type to the logical and and logical
14706         or, Bitwise And/Or and Exclusive Or code paths, it was missing
14707         before.
14708
14709         (Binary::DoNumericPromotions): In the case where either argument
14710         is ulong (and most signed types combined with ulong cause an
14711         error) perform implicit integer constant conversions as well.
14712
14713 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
14714
14715         * expression.cs (UserImplicitCast): Method should always be
14716         non-null. 
14717         (Invocation::BetterConversion): Simplified test for IntLiteral.
14718
14719         (Expression::ImplicitNumericConversion): Split this routine out.
14720         Put the code that performs implicit constant integer conversions
14721         here. 
14722
14723         (Expression::Resolve): Become a wrapper around DoResolve so we can
14724         check eclass and type being set after resolve.
14725
14726         (Invocation::Badness): Remove this dead function
14727
14728         (Binary::ResolveOperator): Do not compute the expensive argumnets
14729         unless we have a union for it.
14730
14731         (Probe::Emit): Is needs to do an isinst and then
14732         compare against null.
14733
14734         (::CanConvert): Added Location argument.  If the Location argument
14735         is null (Location.Null), then we do not report errors.  This is
14736         used by the `probe' mechanism of the Explicit conversion.  We do
14737         not want to generate an error for something that the user
14738         explicitly requested to be casted.  But the pipeline for an
14739         explicit cast first tests for potential implicit casts.
14740
14741         So for now, if the Location is null, it means `Probe only' to
14742         avoid adding another argument.   Might have to revise this
14743         strategy later.
14744
14745         (ClassCast): New class used to type cast objects into arbitrary
14746         classes (used in Explicit Reference Conversions).
14747
14748         Implement `as' as well.
14749
14750         Reverted all the patches from Ravi below: they were broken:
14751
14752                 * The use of `level' as a mechanism to stop recursive
14753                   invocations is wrong.  That was there just to catch the
14754                   bug with a strack trace but not as a way of addressing
14755                   the problem.
14756
14757                   To fix the problem we have to *understand* what is going
14758                   on and the interactions and come up with a plan, not
14759                   just get things going.
14760
14761                 * The use of the type conversion cache that I proposed
14762                   last night had an open topic: How does this work across
14763                   protection domains.  A user defined conversion might not
14764                   be public in the location where we are applying the
14765                   conversion, a different conversion might be selected
14766                   (ie, private A->B (better) but public B->A (worse),
14767                   inside A, A->B applies, but outside it, B->A will
14768                   apply).
14769
14770                 * On top of that (ie, even if the above is solved),
14771                   conversions in a cache need to be abstract.  Ie, `To
14772                   convert from an Int to a Short use an OpcodeCast', not
14773                   `To convert from an Int to a Short use the OpcodeCast on
14774                   the variable 5' (which is what this patch was doing).
14775
14776 2001-09-28  Ravi Pratap  <ravi@ximian.com>
14777
14778         * expression.cs (Invocation::ConversionExists): Re-write to use
14779         the conversion cache
14780
14781         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
14782         cache all conversions done, not just user-defined ones.
14783
14784         (Invocation::BetterConversion): The real culprit. Use ConversionExists
14785         to determine if a conversion exists instead of acutually trying to 
14786         perform the conversion. It's faster too.
14787
14788         (Expression::ConvertExplicit): Modify to use ConversionExists to check
14789         and only then attempt the implicit conversion.
14790
14791 2001-09-28  Ravi Pratap  <ravi@ximian.com>
14792
14793         * expression.cs (ConvertImplicit): Use a cache for conversions
14794         already found. Check level of recursion and bail out if necessary.
14795
14796 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
14797
14798         * typemanager.cs (string_concat_string_string, string_concat_object_object):
14799         Export standard methods that we expect for string operations.
14800
14801         * statement.cs (Block::UsageWarning): Track usage of variables and
14802         report the errors for not used variables.
14803
14804         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
14805         operator. 
14806
14807 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
14808
14809         * codegen.cs: remove unnneded code 
14810
14811         * expression.cs: Removed BuiltinTypeAccess class
14812
14813         Fix the order in which implicit conversions are
14814         done.  
14815
14816         The previous fixed dropped support for boxed conversions (adding a
14817         test to the test suite now)
14818
14819         (UserImplicitCast::CanConvert): Remove test for source being null,
14820         that code is broken.  We should not feed a null to begin with, if
14821         we do, then we should track the bug where the problem originates
14822         and not try to cover it up here.
14823
14824         Return a resolved expression of type UserImplicitCast on success
14825         rather than true/false.  Ravi: this is what I was talking about,
14826         the pattern is to use a static method as a "constructor" for
14827         objects. 
14828
14829         Also, do not create arguments until the very last minute,
14830         otherwise we always create the arguments even for lookups that
14831         will never be performed. 
14832
14833         (UserImplicitCast::Resolve): Eliminate, objects of type
14834         UserImplicitCast are born in a fully resolved state. 
14835
14836         * typemanager.cs (InitCoreTypes): Init also value_type
14837         (System.ValueType). 
14838
14839         * expression.cs (Cast::Resolve): First resolve the child expression.
14840
14841         (LValue): Add new method AddressOf to be used by
14842         the `&' operator.  
14843
14844         Change the argument of Store to take an EmitContext instead of an
14845         ILGenerator, because things like FieldExpr need to be able to call
14846         their children expression to generate the instance code. 
14847
14848         (Expression::Error, Expression::Warning): Sugar functions for
14849         reporting errors.
14850
14851         (Expression::MemberLookup): Accept a TypeContainer instead of a
14852         Report as the first argument.
14853
14854         (Expression::ResolvePrimary): Killed.  I still want to improve
14855         this as currently the code is just not right.
14856
14857         (Expression::ResolveMemberAccess): Simplify, but it is still
14858         wrong. 
14859
14860         (Unary::Resolve): Catch errors in AddressOf operators.
14861
14862         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
14863         index to a byte for the short-version, or the compiler will choose
14864         the wrong Emit call, which generates the wrong data.
14865
14866         (ParameterReference::Emit, ::Store): same.
14867
14868         (FieldExpr::AddressOf): Implement.
14869
14870         * typemanager.cs: TypeManager: made public variable instead of
14871         property.
14872
14873         * driver.cs: document --fatal.
14874
14875         * report.cs (ErrorMessage, WarningMessage): new names for the old
14876         Error and Warning classes.
14877
14878         * cs-parser.jay (member_access): Turn built-in access to types
14879         into a normal simplename
14880
14881 2001-09-27  Ravi Pratap  <ravi@ximian.com>
14882
14883         * expression.cs (Invocation::BetterConversion): Fix to cope
14884         with q being null, since this was introducing a bug.
14885
14886         * expression.cs (ConvertImplicit): Do built-in conversions first.
14887
14888 2001-09-27  Ravi Pratap  <ravi@ximian.com>
14889
14890         * expression.cs (UserImplicitCast::Resolve): Fix bug.
14891
14892 2001-09-27  Ravi Pratap  <ravi@ximian.com>
14893
14894         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
14895         I had introduced long ago (what's new ?).
14896
14897         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
14898         the work of all the checking. 
14899         (ConvertImplicit): Call CanConvert and only then create object if necessary.
14900         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
14901
14902         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
14903         that is the right way. 
14904
14905         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
14906         overloading resolution. Use everywhere instead of cutting and pasting code.
14907
14908         (Binary::ResolveOperator): Use MakeUnionSet.
14909
14910         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
14911         we have to convert to bool types. Not complete yet.
14912
14913 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
14914
14915         * typemanager.cs (TypeManager::CSharpName): support ushort.
14916
14917         * expression.cs (Expression::TryImplicitIntConversion): Attempts
14918         to provide an expression that performsn an implicit constant int
14919         conversion (section 6.1.6).
14920         (Expression::ConvertImplicitRequired): Reworked to include
14921         implicit constant expression conversions.
14922
14923         (Expression::ConvertNumericExplicit): Finished.
14924
14925         (Invocation::Emit): If InstanceExpression is null, then it means
14926         that we perform a call on this.
14927
14928 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
14929
14930         * expression.cs (Unary::Emit): Remove some dead code.
14931         (Probe): Implement Resolve and Emit for `is'.
14932         (Expression::ConvertImplicitRequired): Attempt to do constant
14933         expression conversions here.  Maybe should be moved to
14934         ConvertImplicit, but I am not sure.
14935         (Expression::ImplicitLongConstantConversionPossible,
14936         Expression::ImplicitIntConstantConversionPossible): New functions
14937         that tell whether is it possible to apply an implicit constant
14938         expression conversion.
14939
14940         (ConvertNumericExplicit): Started work on explicit numeric
14941         conversions.
14942
14943         * cs-parser.jay: Update operator constants.
14944
14945         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
14946         (Parameters::GetSignature): Hook up VerifyArgs here.
14947         (Parameters::VerifyArgs): Verifies that no two arguments have the
14948         same name. 
14949
14950         * class.cs (Operator): Update the operator names to reflect the
14951         ones that the spec expects (as we are just stringizing the
14952         operator names).
14953
14954         * expression.cs (Unary::ResolveOperator): Fix bug: Use
14955         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
14956         previous usage did only work for our methods.
14957         (Expression::ConvertImplicit): Handle decimal implicit numeric
14958         conversions as well.
14959         (Expression::InternalTypeConstructor): Used to invoke constructors
14960         on internal types for default promotions.
14961
14962         (Unary::Emit): Implement special handling for the pre/post
14963         increment/decrement for overloaded operators, as they need to have
14964         the same semantics as the other operators.
14965
14966         (Binary::ResolveOperator): ditto.
14967         (Invocation::ConversionExists): ditto.
14968         (UserImplicitCast::Resolve): ditto.
14969
14970 2001-09-26  Ravi Pratap  <ravi@ximian.com>
14971
14972         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
14973         operator, return after emitting body. Regression tests pass again !
14974
14975         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
14976         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
14977         (Invocation::OverloadResolve): Ditto.
14978         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
14979
14980         * everywhere : update calls to the above methods accordingly.
14981
14982 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
14983
14984         * assign.cs (Assign): Make it inherit from ExpressionStatement.
14985
14986         * expression.cs (ExpressionStatement): New base class used for
14987         expressions that can appear in statements, so that we can provide
14988         an alternate path to generate expression that do not leave a value
14989         on the stack.
14990
14991         (Expression::Emit, and all the derivatives): We no longer return
14992         whether a value is left on the stack or not.  Every expression
14993         after being emitted leaves a single value on the stack.
14994
14995         * codegen.cs (EmitContext::EmitStatementExpression): Use the
14996         facilties of ExpressionStatement if possible.
14997
14998         * cs-parser.jay: Update statement_expression.
14999
15000 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
15001
15002         * driver.cs: Change the wording of message
15003
15004 2001-09-25  Ravi Pratap  <ravi@ximian.com>
15005
15006         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
15007         the type of the expression to the return type of the method if
15008         we have an overloaded operator match ! The regression tests pass again !
15009         (Unary::ResolveOperator): Ditto.
15010
15011         * expression.cs (Invocation::ConversionExists): Correct the member lookup
15012         to find "op_Implicit", not "implicit" ;-)
15013         (UserImplicitCast): New class to take care of user-defined implicit conversions.
15014         (ConvertImplicit, ForceConversion): Take TypeContainer argument
15015
15016         * everywhere : Correct calls to the above accordingly.
15017
15018         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
15019         (ConvertImplicit): Do user-defined conversion if it exists.
15020
15021 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
15022
15023         * assign.cs: track location.
15024         (Resolve): Use implicit conversions on assignment.
15025
15026         * literal.cs: Oops.  Not good, Emit of short access values should
15027         pass (Bytes) or the wrong argument will be selected.
15028
15029         * expression.cs (Unary::Emit): Emit code for -expr.
15030
15031         (Unary::ResolveOperator): Handle `Substract' for non-constants
15032         (substract from zero from the non-constants).
15033         Deal with Doubles as well. 
15034
15035         (Expression::ConvertImplicitRequired): New routine that reports an
15036         error if no implicit conversion exists. 
15037
15038         (Invocation::OverloadResolve): Store the converted implicit
15039         expressions if we make them
15040
15041 2001-09-24  Ravi Pratap  <ravi@ximian.com>
15042
15043         * class.cs (ConstructorInitializer): Take a Location argument.
15044         (ConstructorBaseInitializer): Same here.
15045         (ConstructorThisInitializer): Same here.
15046
15047         * cs-parser.jay : Update all calls accordingly.
15048
15049         * expression.cs (Unary, Binary, New): Take location argument.
15050         Update accordingly everywhere.
15051
15052         * cs-parser.jay : Update all calls to the above to take a location
15053         argument.
15054
15055         * class.cs : Ditto.
15056
15057 2001-09-24  Ravi Pratap  <ravi@ximian.com>
15058
15059         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
15060         (Invocation::BetterConversion): Same here
15061         (Invocation::ConversionExists): Ditto.
15062
15063         (Invocation::ConversionExists): Implement.
15064
15065 2001-09-22  Ravi Pratap  <ravi@ximian.com>
15066
15067         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
15068         Also take an additional TypeContainer argument.
15069
15070         * All over : Pass in TypeContainer as argument to OverloadResolve.
15071
15072         * typemanager.cs (CSharpName): Update to check for the string type and return
15073         that too.
15074
15075         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
15076         a given method.
15077
15078 2001-09-21  Ravi Pratap  <ravi@ximian.com>
15079
15080         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
15081         (Invocation::BetterFunction): Implement.
15082         (Invocation::BetterConversion): Implement.
15083         (Invocation::ConversionExists): Skeleton, no implementation yet.
15084
15085         Okay, things work fine !
15086
15087 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
15088
15089         * typemanager.cs: declare and load enum_type, delegate_type and
15090         void_type. 
15091
15092         * expression.cs (Expression::Emit): Now emit returns a value that
15093         tells whether a value is left on the stack or not.  This strategy
15094         might be reveted tomorrow with a mechanism that would address
15095         multiple assignments.
15096         (Expression::report118): Utility routine to report mismatches on
15097         the ExprClass.
15098
15099         (Unary::Report23): Report impossible type/operator combination
15100         utility function.
15101
15102         (Unary::IsIncrementableNumber): Whether the type can be
15103         incremented or decremented with add.
15104         (Unary::ResolveOperator): Also allow enumerations to be bitwise
15105         complemented. 
15106         (Unary::ResolveOperator): Implement ++, !, ~,
15107
15108         (Invocation::Emit): Deal with new Emit convetion.
15109
15110         * All Expression derivatives: Updated their Emit method to return
15111         whether they leave values on the stack or not.
15112
15113         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
15114         stack for expressions that are statements. 
15115
15116 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
15117
15118         * expression.cs (LValue): New interface.  Must be implemented by
15119         LValue objects.
15120         (LocalVariableReference, ParameterReference, FieldExpr): Implement
15121         LValue interface.
15122
15123         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
15124         interface for generating code, simplifies the code.
15125
15126 2001-09-20  Ravi Pratap  <ravi@ximian.com>
15127
15128         * expression.cs (everywhere): Comment out return statements in ::Resolve
15129         methods to avoid the warnings.
15130
15131 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
15132
15133         * driver.cs (parse): Report error 2001 if we can not open the
15134         source file.
15135
15136         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
15137         not resolve it.
15138
15139         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
15140         object. 
15141
15142         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
15143         otherwise nested blocks end up with the same index.
15144
15145         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
15146
15147         * expression.cs:  Instead of having FIXMEs in the Resolve
15148         functions, throw exceptions so it is obvious that we are facing a
15149         bug. 
15150
15151         * cs-parser.jay (invocation_expression): Pass Location information.
15152
15153         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
15154         Use a basename for those routines because .NET does not like paths
15155         on them. 
15156
15157         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
15158         already defined.
15159
15160 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
15161
15162         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
15163         are loading the correct data types (throws an exception if not).
15164         (TypeManager::InitCoreTypes): Use CoreLookupType
15165
15166         * expression.cs (Unary::ResolveOperator): return the child
15167         expression for expressions which are just +expr.
15168         (Unary::ResolveOperator): Return negative literals for -LITERAL
15169         expressions (otherwise they are Unary {Literal}).
15170         (Invocation::Badness): Take into account `Implicit constant
15171         expression conversions'.
15172
15173         * literal.cs (LongLiteral): Implement long literal class.
15174         (IntLiteral): export the `Value' of the intliteral. 
15175
15176 2001-09-19  Ravi Pratap  <ravi@ximian.com>
15177
15178         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
15179
15180         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
15181         instead of 'Operator'
15182
15183         * expression.cs (Binary::ResolveOperator): Update accordingly.
15184         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
15185         and 'Minus'
15186
15187         * cs-parser.jay (unary_expression): Update to use the new names.
15188
15189         * gen-treedump.cs (GetUnary): Same here.
15190
15191         * expression.cs (Unary::Resolve): Implement.
15192         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
15193         operators are found instead of making noise ;-)
15194         (Unary::ResolveOperator): New method to do precisely the same thing which
15195         Binary::ResolveOperator does for Binary expressions.
15196         (Unary.method, .Arguments): Add.
15197         (Unary::OperName): Implement.   
15198         (Unary::ForceConversion): Copy and Paste !
15199
15200         * class.cs (Operator::Define): Fix a small bug for the case when we have 
15201         a unary operator.
15202
15203         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
15204         for the inbuilt operators. Only overloading works for now ;-)
15205
15206 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
15207
15208         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
15209         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
15210
15211         * expression.cs (This::Emit): Implement. 
15212         (This::Resolve): Implement.
15213         (TypeOf:Resolve): Implement.
15214         (Expression::ResolveSimpleName): Add an implicit this to instance
15215         field references. 
15216         (MemberAccess::Resolve): Deal with Parameters and Fields. 
15217         Bind instance variable to Field expressions.
15218         (FieldExpr::Instance): New field used to track the expression that
15219         represents the object instance.
15220         (FieldExpr::Resolve): Track potential errors from MemberLookup not
15221         binding 
15222         (FieldExpr::Emit): Implement.
15223
15224         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
15225         the last instruction contains a return opcode to avoid generating
15226         the last `ret' instruction (this generates correct code, and it is
15227         nice to pass the peverify output).
15228
15229         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
15230         initializer for static and instance variables.
15231         (Constructor::Emit): Allow initializer to be null in the case of
15232         static constructors.  Only emit initializer for instance
15233         constructors. 
15234
15235         (TypeContainer::FindMembers): Return a null array if there are no
15236         matches.
15237
15238         Also fix the code for the MemberTypes.Method branch, as it was not
15239         scanning that for operators (or tried to access null variables before).
15240
15241         * assign.cs (Assign::Emit): Handle instance and static fields. 
15242
15243         * TODO: Updated.
15244
15245         * driver.cs: Stop compilation if there are parse errors.
15246
15247         * cs-parser.jay (constructor_declaration): Provide default base
15248         initializer for non-static constructors.
15249         (constructor_declarator): Do not provide a default base
15250         initializers if none was specified.
15251         Catch the fact that constructors should not have parameters.
15252
15253         * class.cs: Do not emit parent class initializers for static
15254         constructors, that should be flagged as an error.
15255
15256 2001-09-18  Ravi Pratap  <ravi@ximian.com>
15257
15258         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
15259         Move back code into TypeContainer::Populate.
15260
15261 2001-09-18  Ravi Pratap  <ravi@ximian.com>
15262
15263         * class.cs (TypeContainer::AddConstructor): Fix the check to
15264         compare against Name, not Basename. 
15265         (Operator::OpType): Change Plus and Minus to Add and Subtract.
15266
15267         * cs-parser.jay : Update accordingly.
15268
15269         * class.cs (TypeContainer::FindMembers): For the case where we are searching
15270         for methods, don't forget to look into the operators too.
15271         (RegisterMethodBuilder): Helper method to take care of this for
15272         methods, constructors and operators.
15273         (Operator::Define): Completely revamp.
15274         (Operator.OperatorMethod, MethodName): New fields.
15275         (TypeContainer::Populate): Move the registering of builders into
15276         RegisterMethodBuilder.
15277         (Operator::Emit): Re-write.
15278
15279         * expression.cs (Binary::Emit): Comment out code path to emit method
15280         invocation stuff for the case when we have a user defined operator. I am
15281         just not able to get it right !
15282
15283 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
15284
15285         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
15286         argument. 
15287
15288         (Expression::MemberLookup): Provide a version that allows to
15289         specify the MemberTypes and BindingFlags. 
15290
15291         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
15292         so it was not fetching variable information from outer blocks.
15293
15294         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
15295         Beforefieldinit as it was buggy.
15296
15297         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
15298         that Ravi put here.  
15299
15300         * class.cs (Constructor::Emit): Only emit if block is not null.
15301         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
15302         deal with this by semantically definining it as if the user had
15303         done it.
15304
15305         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
15306         constructors as we now "emit" them at a higher level.
15307
15308         (TypeContainer::DefineDefaultConstructor): Used to define the
15309         default constructors if none was provided.
15310
15311         (ConstructorInitializer): Add methods Resolve and Emit. 
15312
15313         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
15314
15315 2001-09-17  Ravi Pratap  <ravi@ximian.com>
15316
15317         * class.cs (TypeContainer::EmitDefaultConstructor): Register
15318         the default constructor builder with our hashtable for methodbuilders
15319         to methodcores.
15320
15321         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
15322         and argument_count is 0 in which case we have a match.
15323         (Binary::ResolveOperator): More null checking and miscellaneous coding
15324         style cleanup.
15325
15326 2001-09-17  Ravi Pratap  <ravi@ximian.com>
15327
15328         * rootcontext.cs (IsNameSpace): Compare against null.
15329
15330         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
15331
15332         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
15333         and Unary::Operator.
15334
15335         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
15336         accordingly.
15337
15338         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
15339         we have overloaded operators.
15340         (Binary::ResolveOperator): Implement the part which does the operator overload
15341         resolution.
15342
15343         * class.cs (Operator::Emit): Implement.
15344         (TypeContainer::Emit): Emit the operators we have too.
15345
15346         * expression.cs (Binary::Emit): Update to emit the appropriate code for
15347         the case when we have a user-defined operator.
15348
15349 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
15350
15351         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
15352
15353 2001-09-16  Ravi Pratap  <ravi@ximian.com>
15354
15355         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
15356         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
15357         (Constructor::Emit): Implement.
15358         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
15359         if we have no work to do. 
15360         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
15361         Emit method.
15362
15363         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
15364         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
15365
15366         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
15367         of parent.parent.
15368
15369 2001-09-15  Ravi Pratap  <ravi@ximian.com>
15370
15371         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
15372         in the source.
15373         (Tree::RecordNamespace): Method to do what the name says ;-)
15374         (Tree::Namespaces): Property to get at the namespaces hashtable.
15375
15376         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
15377         keep track.
15378
15379         * rootcontext.cs (IsNamespace): Fixed it :-)
15380
15381 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
15382
15383         * class.cs (TypeContainer::FindMembers): Add support for
15384         constructors. 
15385         (MethodCore): New class that encapsulates both the shared aspects
15386         of a Constructor and a Method.  
15387         (Method, Constructor): Factored pieces into MethodCore.
15388
15389         * driver.cs: Added --fatal which makes errors throw exceptions.
15390         Load System assembly as well as part of the standard library.
15391
15392         * report.cs: Allow throwing exceptions on errors for debugging.
15393
15394         * modifiers.cs: Do not use `parent', instead use the real type
15395         container to evaluate permission settings.
15396
15397         * class.cs: Put Ravi's patch back in.  He is right, and we will
15398         have to cope with the
15399
15400 2001-09-14  Ravi Pratap  <ravi@ximian.com>
15401
15402         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
15403         FamORAssem, not FamANDAssem.
15404
15405 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
15406
15407         * driver.cs: Added --parse option that only parses its input files
15408         and terminates.
15409
15410         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
15411         incorrect.  IsTopLevel is not used to tell whether an object is
15412         root_types or not (that can be achieved by testing this ==
15413         root_types).  But to see if this is a top-level *class* (not
15414         necessarly our "toplevel" container). 
15415
15416 2001-09-14  Ravi Pratap  <ravi@ximian.com>
15417
15418         * enum.cs (Enum::Define): Modify to call the Lookup method on the
15419         parent instead of a direct call to GetType.
15420
15421 2001-09-14  Ravi Pratap  <ravi@ximian.com>
15422
15423         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
15424         Modifiers.TypeAttr. This should just be a call to that method.
15425
15426         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
15427         object so that we can determine if we are top-level or not.
15428
15429         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
15430         TypeContainer too.
15431
15432         * enum.cs (Enum::Define): Ditto.
15433
15434         * modifiers.cs (FieldAttr): Re-write.
15435
15436         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
15437         (TypeContainer::HaveStaticConstructor): New property to provide access
15438         to precisely that info.
15439
15440         * modifiers.cs (MethodAttr): Re-write.
15441         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
15442
15443         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
15444         of top-level types as claimed.
15445
15446 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
15447
15448         * expression.cs (MemberLookup): Fruitless attempt to lookup
15449         constructors.  Maybe I need to emit default constructors?  That
15450         might be it (currently .NET emits this for me automatically).
15451         (Invocation::OverloadResolve): Cope with Arguments == null.
15452         (Invocation::EmitArguments): new function, shared by the new
15453         constructor and us.
15454         (Invocation::Emit): Handle static and instance methods.  Emit
15455         proper call instruction for virtual or non-virtual invocations.
15456         (New::Emit): Implement.
15457         (New::Resolve): Implement.
15458         (MemberAccess:Resolve): Implement.
15459         (MethodGroupExpr::InstanceExpression): used conforming to the spec
15460         to track instances.
15461         (FieldExpr::Resolve): Set type.
15462
15463         * support.cs: Handle empty arguments.
15464                 
15465         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
15466         SimpleLookup): Auxiliary routines to help parse a qualifier
15467         identifier.  
15468
15469         Update qualifier_identifier rule.
15470
15471         * codegen.cs: Removed debugging messages.
15472
15473         * class.cs: Make this a global thing, this acts just as a "key" to
15474         objects that we might have around.
15475
15476         (Populate): Only initialize method_builders_to_methods once.
15477
15478         * expression.cs (PropertyExpr): Initialize type from the
15479         PropertyType. 
15480
15481         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
15482         Resolve pattern.  Attempt to implicitly convert value to boolean.
15483         Emit code.
15484
15485         * expression.cs: Set the type for the int32/int32 argument case.
15486         (Binary::ResolveOperator): Set the return type to boolean for
15487         comparission operators
15488
15489         * typemanager.cs: Remove debugging print code.
15490
15491         (Invocation::Resolve): resolve type.
15492
15493         * class.cs: Allocate a MemberInfo of the correct size, as the code
15494         elsewhere depends on the test to reflect the correct contents.
15495
15496         (Method::) Keep track of parameters, due to System.Reflection holes
15497
15498         (TypeContainer::Populate): Keep track of MethodBuilders to Method
15499         mapping here.
15500
15501         (TypeContainer::FindMembers): Use ArrayList and then copy an array
15502         of the exact size and return that.
15503
15504         (Class::LookupMethodByBuilder): New function that maps
15505         MethodBuilders to its methods.  Required to locate the information
15506         on methods because System.Reflection bit us again.
15507
15508         * support.cs: New file, contains an interface ParameterData and
15509         two implementations: ReflectionParameters and InternalParameters
15510         used to access Parameter information.  We will need to grow this
15511         as required.
15512
15513         * expression.cs (Invocation::GetParameterData): implement a cache
15514         and a wrapper around the ParameterData creation for methods. 
15515         (Invocation::OverloadResolve): Use new code.
15516
15517 2001-09-13  Ravi Pratap  <ravi@ximian.com>
15518
15519         * class.cs (TypeContainer::EmitField): Remove and move into 
15520         (Field::Define): here and modify accordingly.
15521         (Field.FieldBuilder): New member.
15522         (TypeContainer::Populate): Update accordingly.
15523         (TypeContainer::FindMembers): Implement.
15524
15525 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
15526
15527         * statement.cs: (VariableInfo::VariableType): New field to be
15528         initialized with the full type once it is resolved. 
15529
15530 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
15531
15532         * parameter.cs (GetParameterInfo): Use a type cache to compute
15533         things only once, and to reuse this information
15534
15535         * expression.cs (LocalVariableReference::Emit): Implement.
15536         (OpcodeCast::Emit): fix.
15537
15538         (ParameterReference::Resolve): Implement.
15539         (ParameterReference::Emit): Implement.
15540
15541         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
15542         that are expressions need to stay as Expressions.
15543
15544         * typemanager.cs (CSharpName): Returns the C# name of a type if
15545         possible. 
15546
15547         * expression.cs (Expression::ConvertImplicit): New function that
15548         implements implicit type conversions.
15549
15550         (Expression::ImplicitReferenceConversion): Implements implicit
15551         reference conversions.
15552
15553         (EmptyCast): New type for transparent casts.
15554
15555         (OpcodeCast): New type for casts of types that are performed with
15556         a sequence of bytecodes.
15557
15558         (BoxedCast): New type used for casting value types into reference
15559         types.  Emits a box opcode.
15560
15561         (Binary::DoNumericPromotions): Implements numeric promotions of
15562         and computation of the Binary::Type.
15563
15564         (Binary::EmitBranchable): Optimization.
15565
15566         (Binary::Emit): Implement code emission for expressions.
15567
15568         * typemanager.cs (TypeManager): Added two new core types: sbyte
15569         and byte.
15570
15571 2001-09-12  Ravi Pratap  <ravi@ximian.com>
15572
15573         * class.cs (TypeContainer::FindMembers): Method which does exactly
15574         what Type.FindMembers does, only we don't have to use reflection. No
15575         implementation yet.
15576
15577         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
15578         typecontainer objects as we need to get at them.
15579         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
15580
15581         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
15582         typecontainer object.
15583
15584         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
15585         of just a Report object.
15586
15587 2001-09-11  Ravi Pratap  <ravi@ximian.com>
15588
15589         * class.cs (Event::Define): Go back to using the prefixes "add_" and
15590         "remove_"
15591         (TypeContainer::Populate): Now define the delegates of the type too.
15592         (TypeContainer.Delegates): Property to access the list of delegates defined
15593         in the type.
15594
15595         * delegates.cs (Delegate::Define): Implement partially.
15596
15597         * modifiers.cs (TypeAttr): Handle more flags.
15598
15599 2001-09-11  Ravi Pratap  <ravi@ximian.com>
15600
15601         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
15602         and not <=
15603         (Operator::Define): Re-write logic to get types by using the LookupType method
15604         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
15605         (Indexer::Define): Ditto.
15606         (Event::Define): Ditto.
15607         (Property::Define): Ditto.
15608
15609 2001-09-10  Ravi Pratap  <ravi@ximian.com>
15610
15611         * class.cs (TypeContainer::Populate): Now define operators too. 
15612         (TypeContainer.Operators): New property to access the list of operators
15613         in a type.
15614         (Operator.OperatorMethodBuilder): New member to hold the method builder
15615         for the operator we are defining.
15616         (Operator::Define): Implement.
15617
15618 2001-09-10  Ravi Pratap  <ravi@ximian.com>
15619
15620         * class.cs (Event::Define): Make the prefixes of the accessor methods
15621         addOn_ and removeOn_ 
15622
15623         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
15624         of the location being passed in too. Ideally, this should go later since all
15625         error reporting should be done through the Report object.
15626
15627         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
15628         (Populate): Iterate thru the indexers we have and define them too.
15629         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
15630         for the get and set accessors.
15631         (Indexer::Define): Implement.
15632
15633 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
15634
15635         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
15636         my previous implementation, did not work.
15637
15638         * typemanager.cs: Add a couple of missing types (the longs).
15639
15640         * literal.cs: Use TypeManager.bool_type instead of getting it.
15641
15642         * expression.cs (EventExpr): New kind of expressions.
15643         (Expressio::ExprClassFromMemberInfo): finish
15644
15645 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
15646
15647         * assign.cs: Emit stores to static fields differently.
15648
15649 2001-09-08  Ravi Pratap  <ravi@ximian.com>
15650
15651         * Merge in changes and adjust code to tackle conflicts. Backed out my
15652         code in Assign::Resolve ;-) 
15653
15654 2001-09-08  Ravi Pratap  <ravi@ximian.com>
15655
15656         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
15657         instead Report.Error and also pass in the location.
15658         (CSharpParser::Lexer): New readonly property to return the reference
15659         to the Tokenizer object.
15660         (declare_local_variables): Use Report.Error with location instead of plain 
15661         old error.
15662         (CheckDef): Ditto.
15663
15664         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
15665         (Operator.CheckBinaryOperator): Ditto.
15666
15667         * cs-parser.jay (operator_declarator): Update accordingly.
15668
15669         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
15670         (CheckBinaryOperator): Same here.
15671
15672         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
15673         on the name without any prefixes of namespace names etc. This is because we
15674         already might have something already fully qualified like 
15675         'System.Console.WriteLine'
15676
15677         * assign.cs (Resolve): Begin implementation. Stuck ;-)
15678
15679 2001-09-07  Ravi Pratap  <ravi@ximian.com>
15680
15681         * cs-tokenizer.cs (location): Return a string which also contains
15682         the file name.
15683
15684         * expression.cs (ElementAccess): New class for expressions of the
15685         type 'element access.'
15686         (BaseAccess): New class for expressions of the type 'base access.'
15687         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
15688         respectively.
15689
15690         * cs-parser.jay (element_access): Implement action.
15691         (base_access): Implement actions.
15692         (checked_expression, unchecked_expression): Implement.
15693
15694         * cs-parser.jay (local_variable_type): Correct and implement.
15695         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
15696
15697         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
15698
15699         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
15700         name and the specifiers.
15701
15702         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
15703
15704         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
15705         making them all public ;-)
15706
15707         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
15708         class anyways.
15709
15710 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
15711
15712         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
15713         PropertyExprs.
15714         (FieldExpr, PropertyExprs): New resolved expressions.
15715         (SimpleName::MemberStaticCheck): Perform static checks for access
15716         to non-static fields on static methods. Maybe this should be
15717         generalized for MemberAccesses. 
15718         (SimpleName::ResolveSimpleName): More work on simple name
15719         resolution. 
15720
15721         * cs-parser.jay (primary_expression/qualified_identifier): track
15722         the parameter index.
15723
15724         * codegen.cs (CodeGen::Save): Catch save exception, report error.
15725         (EmitContext::EmitBoolExpression): Chain to expression generation
15726         instead of temporary hack.
15727         (::EmitStatementExpression): Put generic expression code generation.
15728
15729         * assign.cs (Assign::Emit): Implement variable assignments to
15730         local variables, parameters and fields.
15731
15732 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
15733
15734         * statement.cs (Block::GetVariableInfo): New method, returns the
15735         VariableInfo for a variable name in a block.
15736         (Block::GetVariableType): Implement in terms of GetVariableInfo
15737
15738         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
15739         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
15740
15741 2001-09-06  Ravi Pratap  <ravi@ximian.com>
15742
15743         * cs-parser.jay (operator_declaration): Continue on my quest : update
15744         to take attributes argument.
15745         (event_declaration): Ditto.
15746         (enum_declaration): Ditto.
15747         (indexer_declaration): Ditto.
15748
15749         * class.cs (Operator::Operator): Update constructor accordingly.
15750         (Event::Event): Ditto.
15751
15752         * delegate.cs (Delegate::Delegate): Same here.
15753
15754         * enum.cs (Enum::Enum): Same here.
15755
15756 2001-09-05  Ravi Pratap  <ravi@ximian.com>
15757
15758         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
15759
15760         * ../tests/cs0658.cs : New file to demonstrate error 0658.
15761
15762         * attribute.cs (Attributes): New class to encapsulate all attributes which were
15763         being passed around as an arraylist.
15764         (Attributes::AddAttribute): Method to add attribute sections.
15765
15766         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
15767         (struct_declaration): Update accordingly.
15768         (constant_declaration): Update.
15769         (field_declaration): Update.
15770         (method_header): Update.
15771         (fixed_parameter): Update.
15772         (parameter_array): Ditto.
15773         (property_declaration): Ditto.
15774         (destructor_declaration): Ditto.
15775
15776         * class.cs (Struct::Struct): Update constructors accordingly.
15777         (Class::Class): Ditto.
15778         (Field::Field): Ditto.
15779         (Method::Method): Ditto.
15780         (Property::Property): Ditto.
15781         (TypeContainer::OptAttribute): update property's return type.
15782
15783         * interface.cs (Interface.opt_attributes): New member.
15784         (Interface::Interface): Update to take the extra Attributes argument.
15785
15786         * parameter.cs (Parameter::Parameter): Ditto.
15787
15788         * constant.cs (Constant::Constant): Ditto.
15789
15790         * interface.cs (InterfaceMemberBase): New OptAttributes field.
15791         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
15792         the attributes as a parameter.
15793         (InterfaceProperty): Update constructor call.
15794         (InterfaceEvent): Ditto.
15795         (InterfaceMethod): Ditto.
15796         (InterfaceIndexer): Ditto.
15797
15798         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
15799         pass the attributes too.
15800         (interface_event_declaration): Ditto.
15801         (interface_property_declaration): Ditto.
15802         (interface_method_declaration): Ditto.
15803         (interface_declaration): Ditto.
15804
15805 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
15806
15807         * class.cs (Method::Define): Track the "static Main" definition to
15808         create an entry point. 
15809
15810         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
15811         EntryPoint if we find it. 
15812
15813         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
15814         (EmitContext::ig): Make this variable public.
15815
15816         * driver.cs: Make the default output file be the first file name
15817         with the .exe extension.  
15818
15819         Detect empty compilations
15820
15821         Handle various kinds of output targets.  Handle --target and
15822         rename -t to --dumper.
15823
15824         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
15825         methods inherited from Expression return now an Expression.  This
15826         will is used during the tree rewriting as we resolve them during
15827         semantic analysis.
15828
15829         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
15830         the spec.  Missing entirely is the information about
15831         accessability of elements of it.
15832
15833         (Expression::ExprClassFromMemberInfo): New constructor for
15834         Expressions that creates a fully initialized Expression based on
15835         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
15836         a Type.
15837
15838         (Invocation::Resolve): Begin implementing resolution of invocations.
15839
15840         * literal.cs (StringLiteral):  Implement Emit.
15841
15842 2001-09-05  Ravi Pratap  <ravi@ximian.com>
15843
15844         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
15845         member.
15846
15847 2001-09-04  Ravi Pratap  <ravi@ximian.com>
15848
15849         * cs-parser.jay (attribute_arguments): Implement actions.
15850         (attribute): Fix bug in production. Implement action.
15851         (attribute_list): Implement.
15852         (attribute_target): Implement.
15853         (attribute_target_specifier, opt_target_specifier): Implement
15854         (CheckAttributeTarget): New method to check if the attribute target
15855         is valid.
15856         (attribute_section): Implement.
15857         (opt_attributes): Implement.
15858
15859         * attribute.cs : New file to handle attributes.
15860         (Attribute): Class to hold attribute info.
15861
15862         * cs-parser.jay (opt_attribute_target_specifier): Remove production
15863         (attribute_section): Modify production to use 2 different rules to 
15864         achieve the same thing. 1 s/r conflict down !
15865         Clean out commented, useless, non-reducing dimension_separator rules.
15866
15867         * class.cs (TypeContainer.attributes): New member to hold list
15868         of attributes for a type.
15869         (Struct::Struct): Modify to take one more argument, the attribute list.
15870         (Class::Class): Ditto.
15871         (Field::Field): Ditto.
15872         (Method::Method): Ditto.
15873         (Property::Property): Ditto.
15874
15875         * cs-parser.jay (struct_declaration): Update constructor call to
15876         pass in the attributes too.
15877         (class_declaration): Ditto.
15878         (constant_declaration): Ditto.
15879         (field_declaration): Ditto.
15880         (method_header): Ditto.
15881         (fixed_parameter): Ditto.
15882         (parameter_array): Ditto.
15883         (property_declaration): Ditto.
15884
15885         * constant.cs (Constant::Constant): Update constructor similarly.
15886         Use System.Collections.
15887
15888         * parameter.cs (Parameter::Parameter): Update as above.
15889
15890 2001-09-02  Ravi Pratap  <ravi@ximian.com>
15891
15892         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
15893         (TypeContainer.delegates): New member to hold list of delegates.
15894
15895         * cs-parser.jay (delegate_declaration): Implement the action correctly 
15896         this time as I seem to be on crack ;-)
15897
15898 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
15899
15900         * rootcontext.cs (RootContext::IsNamespace): new function, used to
15901         tell whether an identifier represents a namespace.
15902
15903         * expression.cs (NamespaceExpr): A namespace expression, used only
15904         temporarly during expression resolution.
15905         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
15906         utility functions to resolve names on expressions.
15907
15908 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
15909
15910         * codegen.cs: Add hook for StatementExpressions. 
15911
15912         * class.cs: Fix inverted test for static flag in methods.
15913
15914 2001-09-02  Ravi Pratap  <ravi@ximian.com>
15915
15916         * class.cs (Operator::CheckUnaryOperator): Correct error number used
15917         to make it coincide with MS' number.
15918         (Operator::CheckBinaryOperator): Ditto.
15919
15920         * ../errors/errors.txt : Remove error numbers added earlier.
15921
15922         * ../errors/cs1019.cs : Test case for error # 1019
15923
15924         * ../errros/cs1020.cs : Test case for error # 1020
15925
15926         * cs-parser.jay : Clean out commented cruft.
15927         (dimension_separators, dimension_separator): Comment out. Ostensibly not
15928         used anywhere - non-reducing rule.
15929         (namespace_declarations): Non-reducing rule - comment out.
15930
15931         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
15932         with TypeContainer::AddEnum.
15933
15934         * delegate.cs : New file for delegate handling classes.
15935         (Delegate): Class for declaring delegates.
15936
15937         * makefile : Update.
15938
15939         * cs-parser.jay (delegate_declaration): Implement.
15940
15941 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
15942
15943         * class.cs (Event::Define): Implement.
15944         (Event.EventBuilder): New member.
15945
15946         * class.cs (TypeContainer::Populate): Update to define all enums and events
15947         we have.
15948         (Events): New property for the events arraylist we hold. Shouldn't we move to using
15949         readonly fields for all these cases ?
15950
15951 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
15952
15953         * class.cs (Property): Revamp to use the convention of making fields readonly.
15954         Accordingly modify code elsewhere.
15955
15956         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
15957         the Define method of the Property class.
15958
15959         * class.cs : Clean up applied patch and update references to variables etc. Fix 
15960         trivial bug.
15961         (TypeContainer::Populate): Update to define all the properties we have. Also
15962         define all enumerations.
15963
15964         * enum.cs (Define): Implement.
15965
15966 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
15967
15968         * cs-parser.jay (overloadable_operator): The semantic value is an
15969         enum of the Operator class.
15970         (operator_declarator): Implement actions.
15971         (operator_declaration): Implement.
15972
15973         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
15974         validity of definitions.
15975         (Operator::CheckBinaryOperator): Static method to check for binary operators
15976         (TypeContainer::AddOperator): New method to add an operator to a type.
15977
15978         * cs-parser.jay (indexer_declaration): Added line to actually call the
15979         AddIndexer method so it gets added ;-)
15980
15981         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
15982         already taken care of by the MS compiler ?  
15983
15984 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
15985
15986         * class.cs (Operator): New class for operator declarations.
15987         (Operator::OpType): Enum for the various operators.
15988
15989 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
15990
15991         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
15992         ostensibly handle this in semantic analysis.
15993
15994         * cs-parser.jay (general_catch_clause): Comment out
15995         (specific_catch_clauses, specific_catch_clause): Ditto.
15996         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
15997         (catch_args, opt_catch_args): New productions.
15998         (catch_clause): Rewrite to use the new productions above
15999         (catch_clauses): Modify accordingly.
16000         (opt_catch_clauses): New production to use in try_statement
16001         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
16002         and re-write the code in the actions to extract the specific and
16003         general catch clauses by being a little smart ;-)
16004
16005         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
16006         Hooray, try and catch statements parse fine !
16007
16008 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16009
16010         * statement.cs (Block::GetVariableType): Fix logic to extract the type
16011         string from the hashtable of variables.
16012
16013         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
16014         I end up making that mistake ;-)
16015         (catch_clauses): Fixed gross error which made Key and Value of the 
16016         DictionaryEntry the same : $1 !!
16017
16018 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16019
16020         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
16021
16022         * cs-parser.jay (event_declaration): Correct to remove the semicolon
16023         when the add and remove accessors are specified. 
16024
16025 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16026
16027         * cs-parser.jay (IndexerDeclaration): New helper class to hold
16028         information about indexer_declarator.
16029         (indexer_declarator): Implement actions.
16030         (parsing_indexer): New local boolean used to keep track of whether
16031         we are parsing indexers or properties. This is necessary because 
16032         implicit_parameters come into picture even for the get accessor in the 
16033         case of an indexer.
16034         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
16035
16036         * class.cs (Indexer): New class for indexer declarations.
16037         (TypeContainer::AddIndexer): New method to add an indexer to a type.
16038         (TypeContainer::indexers): New member to hold list of indexers for the
16039         type.
16040
16041 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
16042
16043         * cs-parser.jay (add_accessor_declaration): Implement action.
16044         (remove_accessor_declaration): Implement action.
16045         (event_accessors_declaration): Implement
16046         (variable_declarators): swap statements for first rule - trivial.
16047
16048         * class.cs (Event): New class to hold information about event
16049         declarations.
16050         (TypeContainer::AddEvent): New method to add an event to a type
16051         (TypeContainer::events): New member to hold list of events.
16052
16053         * cs-parser.jay (event_declaration): Implement actions.
16054
16055 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
16056
16057         * cs-parser.jay (dim_separators): Implement. Make it a string
16058         concatenating all the commas together, just as they appear.
16059         (opt_dim_separators): Modify accordingly
16060         (rank_specifiers): Update accordingly. Basically do the same
16061         thing - instead, collect the brackets here.
16062         (opt_rank_sepcifiers): Modify accordingly.
16063         (array_type): Modify to actually return the complete type string
16064         instead of ignoring the rank_specifiers.
16065         (expression_list): Implement to collect the expressions
16066         (variable_initializer): Implement. We make it a list of expressions
16067         essentially so that we can handle the array_initializer case neatly too.
16068         (variable_initializer_list): Implement.
16069         (array_initializer): Make it a list of variable_initializers
16070         (opt_array_initializer): Modify accordingly.
16071
16072         * expression.cs (New::NType): Add enumeration to help us
16073         keep track of whether we have an object/delegate creation
16074         or an array creation.
16075         (New:NewType, New::Rank, New::Indices, New::Initializers): New
16076         members to hold data about array creation.
16077         (New:New): Modify to update NewType
16078         (New:New): New Overloaded contructor for the array creation
16079         case.
16080
16081         * cs-parser.jay (array_creation_expression): Implement to call
16082         the overloaded New constructor.
16083
16084 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
16085
16086         * class.cs (TypeContainer::Constructors): Return member
16087         constructors instead of returning null.
16088
16089 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
16090
16091         * typemanager.cs (InitCoreTypes): Initialize the various core
16092         types after we have populated the type manager with the user
16093         defined types (this distinction will be important later while
16094         compiling corlib.dll)
16095
16096         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
16097         on Expression Classification.  Now all expressions have a method
16098         `Resolve' and a method `Emit'.
16099
16100         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
16101         generation from working.     Also add some temporary debugging
16102         code. 
16103
16104 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
16105
16106         * codegen.cs: Lots of code generation pieces.  This is only the
16107         beginning, will continue tomorrow with more touches of polish.  We
16108         handle the fundamentals of if, while, do, for, return.  Others are
16109         trickier and I need to start working on invocations soon.
16110
16111         * gen-treedump.cs: Bug fix, use s.Increment here instead of
16112         s.InitStatement. 
16113
16114         * codegen.cs (EmitContext): New struct, used during code
16115         emission to keep a context.   Most of the code generation will be
16116         here. 
16117
16118         * cs-parser.jay: Add embedded blocks to the list of statements of
16119         this block.  So code generation proceeds in a top down fashion.
16120
16121 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
16122
16123         * statement.cs: Add support for multiple child blocks.
16124
16125 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
16126
16127         * codegen.cs (EmitCode): New function, will emit the code for a
16128         Block of code given a TypeContainer and its ILGenerator. 
16129
16130         * statement.cs (Block): Standard public readonly optimization.
16131         (Block::Block constructors): Link children. 
16132         (Block::Child): Child Linker.
16133         (Block::EmitVariables): Emits IL variable declarations.
16134
16135         * class.cs: Drop support for MethodGroups here, delay until
16136         Semantic Analysis.
16137         (Method::): Applied the same simplification that I did before, and
16138         move from Properties to public readonly fields.
16139         (Method::ParameterTypes): Returns the parameter types for the
16140         function, and implements a cache that will be useful later when I
16141         do error checking and the semantic analysis on the methods is
16142         performed.
16143         (Constructor::GetCallingConvention): Renamed from CallingConvetion
16144         and made a method, optional argument tells whether this is a class
16145         or a structure to apply the `has-this' bit.
16146         (Method::GetCallingConvention): Implement, returns the calling
16147         convention. 
16148         (Method::Define): Defines the type, a second pass is performed
16149         later to populate the methods.
16150
16151         (Constructor::ParameterTypes): implement a cache similar to the
16152         one on Method::ParameterTypes, useful later when we do semantic
16153         analysis. 
16154
16155         (TypeContainer::EmitMethod):  New method.  Emits methods.
16156
16157         * expression.cs: Removed MethodGroup class from here.
16158
16159         * parameter.cs (Parameters::GetCallingConvention): new method.
16160
16161 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
16162
16163         * class.cs (TypeContainer::Populate): Drop RootContext from the
16164         argument. 
16165
16166         (Constructor::CallingConvention): Returns the calling convention.
16167         (Constructor::ParameterTypes): Returns the constructor parameter
16168         types. 
16169
16170         (TypeContainer::AddConstructor): Keep track of default constructor
16171         and the default static constructor.
16172
16173         (Constructor::) Another class that starts using `public readonly'
16174         instead of properties. 
16175
16176         (Constructor::IsDefault): Whether this is a default constructor. 
16177
16178         (Field::) use readonly public fields instead of properties also.
16179
16180         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
16181         track of static constructors;  If none is used, turn on
16182         BeforeFieldInit in the TypeAttributes. 
16183
16184         * cs-parser.jay (opt_argument_list): now the return can be null
16185         for the cases where there are no arguments. 
16186
16187         (constructor_declarator): If there is no implicit `base' or
16188         `this', then invoke the default parent constructor. 
16189
16190         * modifiers.cs (MethodAttr): New static function maps a set of
16191         modifiers flags into a MethodAttributes enum
16192         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
16193         MethodAttr, TypeAttr to represent the various mappings where the
16194         modifiers are used.
16195         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
16196
16197 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
16198
16199         * parameter.cs (GetParameterInfo): Fix bug where there would be no
16200         method arguments.
16201
16202         * interface.cs (PopulateIndexer): Implemented the code generator
16203         for interface indexers.
16204
16205 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
16206
16207         * interface.cs (InterfaceMemberBase): Now we track the new status
16208         here.  
16209
16210         (PopulateProperty): Implement property population.  Woohoo!  Got
16211         Methods and Properties going today. 
16212
16213         Removed all the properties for interfaces, and replaced them with
16214         `public readonly' fields. 
16215
16216 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
16217
16218         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
16219         initialize their hashtables/arraylists only when they are needed
16220         instead of doing this always.
16221
16222         * parameter.cs: Handle refs and out parameters.
16223
16224         * cs-parser.jay: Use an ArrayList to construct the arguments
16225         instead of the ParameterCollection, and then cast that to a
16226         Parameter[] array.
16227
16228         * parameter.cs: Drop the use of ParameterCollection and use
16229         instead arrays of Parameters.
16230
16231         (GetParameterInfo): Use the Type, not the Name when resolving
16232         types. 
16233
16234 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
16235
16236         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
16237         and instead use public readonly fields.
16238
16239         * class.cs: Put back walking code for type containers.
16240
16241 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
16242
16243         * class.cs (MakeConstant): Code to define constants.
16244
16245         * rootcontext.cs (LookupType): New function.  Used to locate types 
16246
16247
16248 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
16249
16250         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
16251         this System.Reflection code is.  Kudos to Microsoft
16252
16253         * typemanager.cs: Implement a type cache and avoid loading all
16254         types at boot time.  Wrap in LookupType the internals.  This made
16255         the compiler so much faster.  Wow.  I rule!
16256
16257         * driver.cs: Make sure we always load mscorlib first (for
16258         debugging purposes, nothing really important).
16259
16260         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
16261         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
16262
16263         * rootcontext.cs: Lookup types on their namespace;  Lookup types
16264         on namespaces that have been imported using the `using' keyword.
16265
16266         * class.cs (TypeContainer::TypeAttr): Virtualize.
16267         (Class::TypeAttr): Return attributes suitable for this bad boy.
16268         (Struct::TypeAttr): ditto.
16269         Handle nested classes.
16270         (TypeContainer::) Remove all the type visiting code, it is now
16271         replaced with the rootcontext.cs code
16272
16273         * rootcontext.cs (GetClassBases): Added support for structs. 
16274
16275 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
16276
16277         * interface.cs, statement.cs, class.cs, parameter.cs,
16278         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
16279         Drop use of TypeRefs, and use strings instead.
16280
16281 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
16282
16283         * rootcontext.cs: 
16284
16285         * class.cs (Struct::Struct): set the SEALED flags after
16286         checking the modifiers.
16287         (TypeContainer::TypeAttr): new property, returns the
16288         TypeAttributes for a class.  
16289
16290         * cs-parser.jay (type_list): Oops, list production was creating a
16291         new list of base types.
16292
16293         * rootcontext.cs (StdLib): New property.
16294         (GetInterfaceTypeByName): returns an interface by type name, and
16295         encapsulates error handling here.
16296         (GetInterfaces): simplified.
16297         (ResolveTree): Encapsulated all the tree resolution here.
16298         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
16299         types. 
16300
16301         * driver.cs: Add support for --nostdlib, to avoid loading the
16302         default assemblies.
16303         (Main): Do not put tree resolution here. 
16304
16305         * rootcontext.cs: Beginning of the class resolution.
16306
16307 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
16308
16309         * rootcontext.cs: Provide better error reporting. 
16310
16311         * cs-parser.jay (interface_base): set our $$ to be interfaces.
16312
16313         * rootcontext.cs (CreateInterface): Handle the case where there
16314         are no parent interfaces.
16315
16316         (CloseTypes): Routine to flush types at the end.
16317         (CreateInterface): Track types.
16318         (GetInterfaces): Returns an array of Types from the list of
16319         defined interfaces.
16320
16321         * typemanager.c (AddUserType): Mechanism to track user types (puts
16322         the type on the global type hash, and allows us to close it at the
16323         end). 
16324
16325 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
16326
16327         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
16328         RecordInterface instead.
16329
16330         * cs-parser.jay: Updated to reflect changes above.
16331
16332         * decl.cs (Definition): Keep track of the TypeBuilder type that
16333         represents this type here.  Not sure we will use it in the long
16334         run, but wont hurt for now.
16335
16336         * driver.cs: Smaller changes to accomodate the new code.
16337
16338         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
16339         when done. 
16340
16341         * rootcontext.cs (CreateInterface):  New method, used to create
16342         the System.TypeBuilder type for interfaces.
16343         (ResolveInterfaces): new entry point to resolve the interface
16344         hierarchy. 
16345         (CodeGen): Property, used to keep track of the code generator.
16346
16347 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
16348
16349         * cs-parser.jay: Add a second production for delegate_declaration
16350         with `VOID'.
16351
16352         (enum_body): Put an opt_comma here instead of putting it on
16353         enum_body or enum_member_declarations so we can handle trailing
16354         commas on enumeration members.  Gets rid of a shift/reduce.
16355
16356         (type_list): Need a COMMA in the middle.
16357
16358         (indexer_declaration): Tell tokenizer to recognize get/set
16359
16360         * Remove old targets.
16361
16362         * Re-add the parser target.
16363
16364 2001-07-13  Simon Cozens <simon@simon-cozens.org>
16365
16366         * cs-parser.jay: Add precendence rules for a number of operators
16367         ot reduce the number of shift/reduce conflicts in the grammar.
16368
16369 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
16370
16371         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
16372         and put it here.
16373
16374         Get rid of old crufty code.
16375
16376         * rootcontext.cs: Use this to keep track of the parsed
16377         representation and the defined types available to the program. 
16378
16379         * gen-treedump.cs: adjust for new convention.
16380
16381         * type.cs: Split out the type manager, and the assembly builder
16382         from here. 
16383
16384         * typemanager.cs: the type manager will live here now.
16385
16386         * cil-codegen.cs: And the code generator here. 
16387
16388 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
16389
16390         * makefile: Fixed up for easy making.
16391
16392 2001-07-13  Simon Cozens <simon@simon-cozens.org>
16393
16394         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
16395         the 
16396
16397         (unary_expression): Expand pre_increment_expression and
16398         post_decrement_expression to reduce a shift/reduce.
16399
16400 2001-07-11  Simon Cozens
16401
16402         * cs-tokenizer.cs: Hex numbers should begin with a 0.
16403
16404         Improve allow_keyword_as_indent name.
16405
16406 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
16407
16408         * Adjustments for Beta2. 
16409
16410 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
16411
16412         * decl.cs: Added `Define' abstract method.
16413         (InTransit): new property, used to catch recursive definitions. 
16414
16415         * interface.cs: Implement `Define'. 
16416
16417         * modifiers.cs: Map Modifiers.constants to
16418         System.Reflection.TypeAttribute flags.
16419
16420         * class.cs: Keep track of types and user-defined types.
16421         (BuilderInit): New method for creating an assembly
16422         (ResolveType): New function to launch the resolution process, only
16423         used by interfaces for now.
16424
16425         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
16426         that are inserted into the name space. 
16427
16428 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
16429
16430         * ARGH.  I have screwed up my tree so many times due to the use of
16431         rsync rather than using CVS.  Going to fix this at once. 
16432
16433         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
16434         load types.
16435
16436 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
16437
16438         * Experiment successful: Use System.Type rather that our own
16439         version of Type.  
16440
16441 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
16442
16443         * cs-parser.jay: Removed nsAliases from here.
16444
16445         Use new namespaces, handle `using XXX;' 
16446
16447         * namespace.cs: Reimplemented namespace handling, use a recursive
16448         definition of the class.  Now we can keep track of using clauses
16449         and catch invalid using clauses.
16450
16451 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
16452
16453         * gen-treedump.cs: Adapted for all the renaming.
16454
16455         * expression.cs (Expression): this class now has a Type property
16456         which returns an expression Type.
16457
16458         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
16459         `Type', as this has a different meaning now in the base
16460
16461 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
16462
16463         * interface.cs, class.cs: Removed from all the sources the
16464         references to signature computation, as we can not do method
16465         signature computation during the parsing time, as we are not
16466         trying to solve at that point distinguishing:
16467
16468         class X {
16469                 void a (Blah x) {}
16470                 void a (NS.Blah x) {}
16471         }
16472
16473         Which depending on the context might be valid or not, as we do not
16474         know if Blah is the same thing as NS.Blah at that point.
16475
16476         * Redid everything so the code uses TypeRefs now instead of
16477         Types.  TypeRefs are just temporary type placeholders, that need
16478         to be resolved.  They initially have a pointer to a string and the
16479         current scope in which they are used.  This is used later by the
16480         compiler to resolve the reference to an actual Type. 
16481
16482         * DeclSpace is no longer a CIR.Type, and neither are
16483         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
16484         are all DeclSpaces, but no Types. 
16485
16486         * type.cs (TypeRefManager): This implements the TypeRef manager,
16487         which keeps track of all the types that need to be resolved after
16488         the parsing has finished. 
16489
16490 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
16491
16492         * ARGH.  We are going to have to store `foreach' as a class rather
16493         than resolving it, as we need to verify error 1579 after name
16494         resolution.   *OR* we could keep a flag that says `This request to
16495         IEnumerator comes from a foreach statement' which we can then use
16496         to generate the error.
16497
16498 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
16499
16500         * class.cs (TypeContainer.AddMethod): we now add methods to the
16501         MethodGroup instead of the method hashtable.  
16502
16503         * expression.cs: Add MethodGroup abstraction, which gets us one
16504         step closer to the specification in the way we handle method
16505         declarations.  
16506
16507         * cs-parser.jay (primary_expression): qualified_identifier now
16508         tried to match up an identifier to a local variable reference or
16509         to a parameter reference.
16510
16511         current_local_parameters is now a parser global variable that
16512         points to the current parameters for the block, used during name
16513         lookup.
16514
16515         (property_declaration): Now creates an implicit `value' argument to
16516         the set accessor.
16517
16518 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
16519
16520         * parameter.cs: Do not use `param' arguments as part of the
16521         signature, per the spec.
16522
16523 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
16524
16525         * decl.cs: Base class for classes, structs and interfaces.  This
16526         is the "Declaration Space" 
16527
16528         * cs-parser.jay: Use CheckDef for checking declaration errors
16529         instead of having one on each function.
16530
16531         * class.cs: Factor out some code for handling error handling in
16532         accordance to the "Declarations" section in the "Basic Concepts"
16533         chapter in the ECMA C# spec.
16534
16535         * interface.cs: Make all interface member classes derive from
16536         InterfaceMemberBase.
16537
16538 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
16539
16540         * Many things: all interfaces are parsed and generated in
16541         gen-treedump.  Support for member variables, constructors,
16542         destructors, properties, constants is there.
16543
16544         Beginning of the IL backend, but very little done, just there for
16545         testing purposes. 
16546
16547 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
16548
16549         * cs-parser.jay: Fix labeled statement.
16550
16551         * cs-tokenizer.cs (escape): Escape " and ' always.
16552         ref_line, ref_name: keep track of the line/filename as instructed
16553         by #line by the compiler.
16554         Parse #line.
16555
16556 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
16557
16558         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
16559         to match the values in System.CodeDOM.
16560
16561         Divid renamed to Divide.
16562
16563         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
16564         statements. 
16565         (Statements.set): remove.
16566
16567         * System.CodeDOM/CodeCatchClause.cs: always have a valid
16568         statements. 
16569
16570         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
16571         falseStatements always have valid values. 
16572
16573         * cs-parser.jay: Use System.CodeDOM now.
16574