2005-02-21 Martin Baulig <martin@ximian.com>
[mono.git] / mcs / gmcs / ChangeLog
1 2005-02-21  Martin Baulig  <martin@ximian.com>
2
3         * generic.cs
4         (TypeManager.generic_nullable_type): New static public field.
5         (TypeManager.InitGenericCoreType): Lookup "System.Nullable`1".
6
7         * rootcontext.cs
8         (RootContext.ResolveCore): Resolve "System.Nullable`1".
9
10 2005-02-15  Martin Baulig  <martin@ximian.com>
11
12         * generic.cs (ConstructedType.Constraints): Correctly check
13         constraints if the argument type is a type parameter; fixes
14         #72326. 
15
16 2005-02-02  Martin Baulig  <martin@ximian.com>
17
18         * delegate.cs (Delegate.DefineType): Report an internal error if
19         TypeManager.multicast_delegate_type is null.  See bug #72015 for
20         details.        
21
22 2005-01-29  Miguel de Icaza  <miguel@novell.com>
23
24         * pending.cs: Produce better code (no nops produced by using Ldarg
25         + value).
26         
27         * pending.cs (PendingImplementation.DefineProxy): It was not `arg
28         i - 1' it should be arg + 1.
29
30         Fixes bug #71819.
31         
32 2005-01-26  Martin Baulig  <martin@ximian.com>
33
34         * cs-parser.jay (indexer_declarator): Don't report an error if we
35         have type parameters since we can be an explicit interface
36         implementation; fixes #71449.
37
38 2005-01-26  Martin Baulig  <martin@ximian.com>
39
40         * class.cs (TypeContainer.AttributeTargets): Return the correct
41         AttributeTargets depending on our `Kind' instead of throwing an
42         exception; fixes #71632.
43
44 2005-01-26  Martin Baulig  <martin@ximian.com>
45
46         * delegate.cs (Delegate.DefineType): Correctly define our type
47         parameters.  Fixes #71483.
48
49 2005-01-25  Raja R Harinath  <rharinath@novell.com>
50
51         Fix #71602.
52         * expression.cs (MemberAccess.DoResolve): Don't complain with
53         cs0572 when the LHS of a member access has identical name and type
54         name.
55
56 2005-01-25  Marek Safar  <marek.safar@seznam.cz>
57
58         Fix #71651, #71675
59         * attribute.cs (ExtractSecurityPermissionSet): Catch exceptions from
60         CreatePermission.
61         Create custom PermissionSet only for PermissionSetAttribute.
62
63 2005-01-24  Marek Safar  <marek.safar@seznam.cz>
64
65         Fix #71649
66         * class.cs (StaticClass.DefineContainerMembers): Enable enums and
67         delegates in static class.
68
69 2005-01-24  Martin Baulig  <martin@ximian.com>
70
71         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
72         merging an implicit block, just use its reachability.
73
74         * statement.cs (Block.Resolve): Make the unreachable code check
75         work wrt. implicit blocks; see test-337 from #63842.
76
77 2005-01-21  Alp Toker  <alp@atoker.com>
78  
79         * cs-parser.jay: destructor_declaration's container is PartialContainer
80         not Class when partial types are used, so use Kind prop instead of
81         'is'.
82         
83 2005-01-22  Miguel de Icaza  <miguel@ximian.com>
84
85         * cs-parser.jay: Improve error reporting when an interface
86         declares new types.
87
88 2005-01-20  Dick Porter  <dick@ximian.com>
89
90         * support.cs: SeekableStreamReader fix from Sandor Dobos
91         (dobos_s@ibcnet.hu) to cope with Position setting when multibyte
92         chars are read.  Fixes bug 70369.
93
94 2005-01-20  Raja R Harinath  <rharinath@novell.com>
95
96         * cs-parser.jay (catch_clause): Simplify current_block handling
97         somewhat.
98
99 2005-01-17  Miguel de Icaza  <miguel@ximian.com>
100
101         * convert.cs (ImplicitStandardConversionExists): Synchronize the
102         code with ImplicitStandardConversion to handle the implicit
103         conversion of method groups into valid delegate invocations. 
104
105         The problem is that in parameter handling we were using this code
106         path.  Fixes bug #64698
107
108 2005-01-19  Raja R Harinath  <rharinath@novell.com>
109
110         * cs-parser.jay: Fix several infelicities.
111         - Avoid assigning to the parser value stack.  Code like 
112           '$3 = null' is unclean.  Synthesize a value for the code block
113           instead. 
114         - Avoid using oob_stack for storing location information.  Use ...
115         (_mark_): ... this.  New (empty) rule.  Saves the current location
116         in $$.
117         (foreach_statement): Avoid using oob_stack for current_block
118         handling.  Use technique used in for_statement and
119         using_statement.  Synthesize a value for the code block to store
120         additional intermediate information.
121
122 2005-01-13  Miguel de Icaza  <miguel@ximian.com>
123
124         * ecore.cs (IsAccessorAccessible): Accessibility to private fields
125         of a different type is only allowed to private fields of a
126         containing type, not on fields of a base class.
127
128         See test-174.cs and error cs0122-9.cs
129
130 2005-01-13  Raja R Harinath  <rharinath@novell.com>
131
132         Fix test-335.cs (bug #58126).
133         * cs-parser.jay (argument): Split out non-expression parts of the
134         rule into 'non_simple_argument'.
135         (invocation_expression): Support parenthesized invocations with
136         multiple arguments, and with single non-simple arguments.
137
138 2005-01-13  Raja R Harinath  <rharinath@novell.com>
139
140         * cs-tokenizer.cs (xtoken): Reset 'comments_seen' in a couple more
141         places.
142
143 2005-01-12  Raja R Harinath  <rharinath@novell.com>
144
145         Fix cs0038-1.cs, cs1640-6.cs.
146         * ecore.cs (Expression.Resolve): Remove special-case for
147         SimpleName in error-handling.
148         (Expression.almostMatchedMembers): Relax access permission to
149         protected.
150         (Expression.MemberLookupFailed): Handle duplicates in
151         almostMatchedMembers list.
152         (SimpleName.DoSimpleNameResolve): Catch CS0038 errors earlier.
153         * expression.cs (New.DoResolve): Report CS1540 for more cases.
154         * typemanager.cs (GetFullNameSignature): Use the MethodBase
155         overload if the passed in MemberInfo is a MethodBase.
156
157 2005-01-25  Martin Baulig  <martin@ximian.com>
158
159         * doc.cs
160         (DocUtil.emptyParamList): Removed; use `Type.EmptyTypes' instead.
161
162 2005-01-12  Marek Safar  <marek.safar@seznam.cz>
163
164         Fix #70749
165         * attribute.cs (ExtractSecurityPermissionSet): Don't report error
166         for non-CAS & merge permission sets properly.
167
168 2005-01-11  Raja R Harinath  <rharinath@novell.com>
169
170         Improve standard-compliance of simple name and member access 
171         resolution.  Fixes bugs #52697, #57200, #67520, #69519.
172         * ecore.cs (FullNamedExpression): New abstract base class 
173         for Namespaces and TypeExpressions.
174         (ResolveFlags.SimpleName): Remove.
175         (SimpleName): Remove support for dotted names.
176         (SimpleName.ResolveAsTypeStep): Simplify.  Now just a wrapper to 
177         DeclSpace.FindType and DeclSpace.LookupType.
178         (SimpleName.DoSimpleNameResolve): Remove support for dotted names.
179         (Expression.ExprClassName): Make member function.
180         * expression.cs (MemberAccess.ResolveAsTypeStep): Support LHS being
181         a namespace.  Remove creation of dotted "SimpleName"s.
182         (MemberAccess.DoResolve): Likewise.
183         * decl.cs (DeclSpace.Cache): Make private.
184         (DeclSpace.LookupInterfaceOrClass): Return a FullNamedExpression.
185         (DeclSpace.FindType): Update.
186         (DeclSpace.LookupType): Move here from RootContext.  Return a 
187         FullNamedExpression.
188         * namespace.cs (Namespace): Derive from FullNamedExpression
189         so that it can be part of expression resolution.
190         (Namespace.Lookup): Return an FullNamedExpression.
191         (NamespaceEntry.LookupAlias): Lookup aliases only in current
192         namespace.
193         * rootcontext.cs (NamespaceLookup): Remove.
194         (LookupType): Move to DeclSpace.
195         * attribute.cs (CheckAttributeType): Update.
196         * doc.cs (FindDocumentedType): Remove allowAlias argument.
197         (FindDocumentedTypeNonArray): Likewise.
198
199 2005-01-11  Raja R Harinath  <rharinath@novell.com>
200
201         Fix cs0509.cs, cs1632.cs.
202         * class.cs (TypeContainer.GetNormalBases): Don't assume !IsClass
203         is the same as IsInterface.
204         (TypeContainer.GetClassBases): Likewise.
205         * statement.cs (LabeledStatement.ig): New field.
206         (LabeledStatement.LabelTarget): Save ILGenerator which created the
207         label.
208         (LabeledStatement.DoEmit): Check that the label was created with
209         the same ILGenerator.
210
211 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
212
213         Fix #71058
214         * attribute.cs (GetMethodObsoleteAttribute): Need to transform
215         accessors to its properties.
216
217         * ecore.cs (PropertyExpr): Add AccessorTable to help track back
218         from accessors to property.
219         
220 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
221
222         Fix #70722
223         * class.cs (MethodCore.CheckBase): Test base method obsoleteness
224         only for overrides.
225         
226 2005-01-08  Miguel de Icaza  <miguel@ximian.com>
227
228         * attribute.cs: Check for null and empty strings.  
229
230         I have lost another battle to Paolo.
231
232 2005-01-07  Marek Safar  <marek.safar@seznam.cz>
233
234         Fix #70942
235         * class.cs (PropertyMethod): Set Parent field in ctors.
236         (SetMethod.InternalParameters): Add unsafe switch hack.
237         Override MarkForDuplicationCheck where it is appropriate.
238
239         * decl.cs (MemberCore.MarkForDuplicationCheck): New method.
240         It says whether container allows members with the same name.
241         Base default is no.
242         (DeclSpace.AddToContainer): Use MarkForDuplicationCheck.
243         Removed is_method parameter.
244
245 2005-01-06  Duncan Mak  <duncan@ximian.com>
246
247         * cs-tokenizer.cs (xtoken): Redo the work for signaling CS1040
248         because the previous change led to incorrect reporting of CS1032
249         ("Cannot define/undefine preprocessor symbols after first token in
250         file"). Instead of using `tokens_seen' as the only flag that
251         triggers CS1040, introduce `comments_seen'. This new flag is used
252         to signify having seen comments on the current line, so it is
253         unset after a newline.
254
255 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
256
257         * doc.cs : When searching for a type, find nested type too.
258           This fixes bug #71040.
259
260 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
261
262         * doc.cs :
263           - Warn missing member comment on those classes which also does not
264             have doc comments. Fixed bug #71041.
265           - Don't warn missing doc comment on default constructor.
266             Fixed bug #71042.
267
268 2005-01-06  Duncan Mak  <duncan@ximian.com>
269
270         * cs-tokenizer.cs (xtoken): After handling traditional C-style
271         comments, set `tokens_seen' to true. This allows us to detect
272         misplaced preprocessor directives (i.e. not at the beginning of
273         the a line, nor after whitespaces). In that case, report error
274         CS1040. This fixes bug #56460.
275
276         * cs-parser.jay (interface_member_declaration): Add checks for
277         IsExplicitImpl, and report CS0541 error if an interface member is
278         defined as an explicit interface declaration.
279
280 2005-01-06  Marek Safar  <marek.safar@seznam.cz>
281
282         Fix #70817
283         * class.cs (PropertyMethod): Set Parent field in ctors.
284         (SetMethod.InternalParameters): Add unsafe switch hack.
285         
286         * decl.cs (MemberCore.Parent): Cannot be readonly.
287
288 2005-01-06  Raja R Harinath  <rharinath@novell.com>
289
290         * decl.cs (DeclSpace.ResolveType): Remove.
291         (DeclSpace.ResolveBaseTypeExpr): Rename from ResolveTypeExpr.
292         Merge in code from ...
293         (DeclSpace.GetTypeResolvingEmitContext): ... here.  Remove.
294         * class.cs, enum.cs: Update to changes.
295
296 2005-01-06  Miguel de Icaza  <miguel@ximian.com>
297
298         * anonymous.cs: Ensure that we init the scope of our parent if it
299         has not been initialized yet.
300
301 2004-12-30  Duncan Mak  <duncan@ximian.com>
302
303         * typemanager.cs (TypeManager.CheckStructCycles): Don't crash here
304         if field.FieldBuilder is null. Fixes #70758.
305
306         * convert.cs: Fixed some typos and updated some of the comments.
307         (ImplicitStandardConversionExists):
308         (TryImplicitIntConversion): If `target_type' is an interface and
309         the type of `ic' implements this interface, return true or a new
310         BoxedCast instead of null. This fixes #70468.
311
312 2004-12-29  Duncan Mak  <duncan@ximian.com>
313
314         * expression.cs (Argument.Emit): Check that Expr is
315         IMemoryLocation before casting to it, and report CS1510 otherwise.
316
317         This fixes #70402.
318
319 2004-12-21  Ben Maurer  <bmaurer@ximian.com>
320
321         * statement.cs (Block.ThisVariable): remove the recursion here, to
322         make the --profile more sane.
323
324 2004-12-17  Carlos Cortez <calberto.cortez@gmail.com>
325
326         * driver.cs: Patch to handle a xsp bug that prevents to reference an .exe
327         assembly, by JB Evain.
328
329 2004-12-17  Raja R Harinath  <rharinath@novell.com>
330
331         * class.cs, decl.cs, ecore.cs, iterators.cs, pending.cs, 
332           rootcontext.cs, typemanager.cs: Make nomenclature consistent.
333         "parent" refers to enclosing type/class.  "base" refers to superclass.
334
335 2004-12-17  Raja R Harinath  <rharinath@novell.com>
336
337         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
338         Ensure that we only have GlobalAttributes.
339         * attribute.cs (Attribute.Emit): Make non-virtual.
340         (GlobalAttribute.Emit): Remove.
341         (Attribute.Resolve): Make virtual.
342         (GlobalAttribute.Resolve): New.  Set Rootcontext.Tree.Types.NamespaceEntry.
343         (Attribute.GetConditionalAttributeValue): Take an EmitContext as
344         the argument. Don't create one.
345         (Attribute.GetObsoleteAttribute): Likewise.
346         (Attribute.GetClsCompliantAttributeValue): Likewise.
347         * class.cs, decl.cs: Update to changes.
348
349 2004-12-17  Marek Safar  <marek.safar@seznam.cz>
350
351         * delegate.cs (NewDelegate.DoResolve): Add error 149 report.
352         
353         * ecore.cs (Expression.MemberLookupFailed): Fixed error 143.
354         
355         * statement.cs (Foreach.Resolve): Add error 186 report.
356
357 2004-12-16  Marek Safar  <marek.safar@seznam.cz>
358
359         * expression.cs (Conditional.DoResolve): Add warning 429.
360         
361         * statement.cs (If.Resolve): Add warning 665.
362
363 2004-12-16  Raja R Harinath  <rharinath@novell.com>
364
365         New invariant: RootContext.Tree.Types.NamespaceEntry == null
366         except when in the parser, and in GlobalAttribute.
367         * driver.cs (MainDriver): Reset RootContext.Tree.Types.NamespaceEntry.
368         * attribute.cs (GlobalAttribute.CheckAttributeType): Reset
369         RootContext.Tree.Types.NamespaceEntry once work is done.
370         (GlobalAttribute.Emit): New.  Wrapper for Attribute.Emit, but sets
371         and resets RootContext.Tree.Types.NamespaceEntry.
372
373 2004-12-15  Marek Safar  <marek.safar@seznam.cz>
374
375         * cs-parser.jay: Don't create a block for every variable.
376
377 2004-12-14  Miguel de Icaza  <miguel@ximian.com>
378
379         * location.cs: Provide extra information.
380
381         * statement.cs: The instance is not `ldarg_0.THIS' when accessing
382         variables from the captured environment, it is the ldarg_0.
383
384 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
385
386         * cs-parser.jay: Changed warning level for 642 to 4 until Miguel
387         find a conclusion.
388         
389         * class.cs: Changed warning level for 169 to avoid developer
390         displeasure from warning flooding. It will be changed back when they
391         fix most of current BCL warnings.
392         
393         * RootContext.cs: Pushed default WarningLevel to 3.
394         
395         * statement.cs: Removed unused variable.
396
397 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
398
399         * class.cs (TypeContainer.GetClassBases): Add error 1521 report.
400         (TypeContainer.MethodModifiersValid): Refactored to use MemberCore.
401         Add error 502 report.
402         (StaticClass.DefineType): Add error 441 report.
403         (Class.AllowedModifiersProp): New virtual property as temporary
404         extension to AllowedModifiers.
405         (Class.DefineType): Add error 418 report. Moved ModFlags check here
406         to share implementation with StaticClass and don't call virtual
407         methods from ctor.
408         
409         * driver.cs (MainDriver): Add error 1558 test.
410
411         * parameter.cs (Parameter.ApplyAttributeBuilder): Add error 662
412         report. Moved error 36 test here.
413
414         * statement.cs (Throw.Resolve): Add error 724 report.
415
416         * typemanager.cs: Add out_attribute_type core type.
417         
418 2004-12-13  Marek Safar  <marek.safar@seznam.cz>
419
420         * class.cs (TypeContainer.VerifyClsCompliance): Add error
421         3018 report.
422         (PropertyBase.VerifyClsCompliance): Add errror 3025 report.
423
424         * codegen.cs (ModuleClass.ApplyAttributeBuilder): Add error
425         3017 report.
426         
427         * decl.cs (MemberCore.VerifyClsCompliance): Add warning 3021.
428
429         * parameter.cs (ReturnParameter.ApplyAttributeBuilder): 
430         Add error 3023 report.
431         (Parameter.ApplyAttributeBuilder): Add error 3022 report.
432
433         * tree.cs (RootTypes.IsClsCompliaceRequired): Add fake
434         implementation.
435
436 2004-12-12  John Luke  <john.luke@gmail.com>
437
438         * driver.cs (AddArgs): take -- into account when
439         adding arguments, fixes bug 65710 
440
441 2004-12-12  Martin Baulig  <martin@ximian.com>
442
443         * expression.cs (Unary.TryReduceNegative): Added support for
444         SByteConstant and ByteConstant.
445         (Unary.Reduce): Check error values from TryReduceNegative().
446
447 2004-12-10  Marek Safar  <marek.safar@seznam.cz>
448
449         * attributes.cs (Attribute.Resolve): Avoid multiple error report
450         and report exception as error 182.
451
452 2004-12-10  Raja R Harinath  <rharinath@novell.com>
453
454         * driver.cs (Main): Fix message when there are warnings.
455
456 2004-12-09  Miguel de Icaza  <miguel@ximian.com>
457
458         * delegate.cs: Fixed my fix from yesterday, sorry about that.
459
460 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
461
462         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
463         Reduced number of warnings.
464         
465         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
466
467 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
468
469         * driver.cs: Removed message.
470
471         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
472
473 2004-12-08    <vargaz@freemail.hu>
474
475         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
476
477 2004-12-08  Martin Baulig  <martin@ximian.com>
478
479         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
480         instead of a CS3002 for properties and indexer.
481
482 2004-12-08  Martin Baulig  <martin@ximian.com>
483
484         * decl.cs (MemberName.ToString): Make this work again.
485
486 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
487
488         * attribute.cs (Resolve): Add error 591 detection.
489
490         * class.cs (FieldMember.Define): Add error 1547 detection.
491         (Indexer.Define): Add error 620 detection.
492         (Operator.Define): Add error 590 detection.
493
494         * ecore.cs: Missing argument for error 79.
495
496         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
497         detection.
498
499 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
500
501         Fix #70106
502         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
503         only.
504
505 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
506
507         * cs-parser.jay : handle doc comments on implicit/explicit operators.
508           Some operator comments were suppressed.
509         * doc.cs : Implicit/explicit operator name in doc comments are like
510           "op_Explicit(type)~returnType", so added suffix handling.
511
512 2005-01-21  Alp Toker  <alp@atoker.com>
513
514         * cs-parser.jay: destructor_declaration's container is PartialContainer
515         not Class when partial types are used, so use Kind prop instead of 'is'.
516
517 2004-12-12  Martin Baulig  <martin@ximian.com>
518
519         * expression.cs (Unary.TryReduceNegative): Added support for
520         SByteConstant and ByteConstant.
521         (Unary.Reduce): Check error values from TryReduceNegative().
522
523 2004-12-11  Martin Baulig  <martin@ximian.com>
524
525         * support.cs (ReflectionParameters.ParameterName): If we have a
526         `gpd', call `ParameterName' on it.
527
528         * parameter.cs (Parameter.GetParameterAttributes): New static method.
529
530         * pending.cs (PendingImplementation.DefineProxy): Call
531         DefineParameter() for all of the MethodBuilder's arguments.
532
533 2004-12-09  Martin Baulig  <martin@ximian.com>
534
535         * doc.cs (DocUtil): Make this a static class.
536
537 2004-12-09  Martin Baulig  <martin@ximian.com>
538
539         * expression.cs (Invocation.InferType): Moved the type inference
540         implementation into TypeManager.
541
542         * generics.cs (TypeManager): Moved the type inference
543         implementation here.
544
545 2004-12-09  Martin Baulig  <martin@ximian.com>
546
547         * typemanager.cs (TypeManager): Make this a partial class.
548
549         * generics.cs
550         (TypeManager): Move the generics part of `TypeManager' here.
551
552 2004-12-08  Martin Baulig  <martin@ximian.com>
553
554         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
555         instead of a CS3002 for properties and indexer.  Added CS3024
556         check for generic interfaces.
557
558         * attributes.cs (AttributeTester.AnalyzeTypeCompliance): Generic
559         instances are not CLS-compliant.
560
561 2004-12-08  Martin Baulig  <martin@ximian.com>
562
563         * cs-parser.jay
564         (void_pointer_expression): New rule for `void*', `void**' etc.
565         (typeof_expression): Add `void_pointer_expression'; fixes #66846.       
566
567 2004-12-08  Martin Baulig  <martin@ximian.com>
568
569         * expression.cs (Invocation.InferType): Removed the hack for
570         MethodCore.MayUnify().  
571
572         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Make
573         this actually work.
574
575         * class.cs (MethodCore.MayUnify): Use
576         TypeManager.MayBecomeEqualGenericTypes().       
577
578 2004-12-08  Martin Baulig  <martin@ximian.com>
579
580         * expression.cs (Is.DoResolve, As.DoResolve): If we're a type
581         parameter, box it.  Fixes #69233.
582
583 2004-12-08  Martin Baulig  <martin@ximian.com>
584
585         * generic.cs (ConstructedType.CheckConstraints): Valuetypes always
586         have the ctor constraint.  Fixes #68326.
587
588 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
589
590         * cs-parser.jay : interface comment was not consumed because of
591           extra opt_semicolon before doc handling.
592
593 2004-12-03  Raja R Harinath  <rharinath@novell.com>
594
595         Fix test-327.cs, test-328.cs, and put in early infrastructure
596         for eventually fixing #52697.
597         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
598         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
599         from other methods.
600         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
601         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
602         (VerifyUsing, error246): Update.
603         * rootcontext.cs (RootContext.NamespaceLookup): Just use
604         'NamespaceEntry.LookupNamespaceOrType'.
605
606 2004-12-07  Martin Baulig  <martin@ximian.com>
607
608         * driver.cs: Call it "BETA SOFTWARE" :-)
609
610 2004-12-06  Raja R Harinath  <rharinath@novell.com>
611
612         Fix crash on cs0657-17.cs.
613         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
614         Use RootContext.Tree.Types, not 'new RootTypes ()'.
615         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
616         the case where the NamespaceEntry gets overwritten.
617
618 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
619
620         Fixed #69195, #56821
621         * ecore.cs (ResolveBoolean): Tiny refactoring.
622
623         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
624         of right expression resolving when left is false constant and
625         operator is LogicalAnd OR true constant and operator is LogicalOr.
626
627         * statement.cs (ResolveUnreachable): Always reports warning.
628
629 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
630
631         * class.cs: Distinguish between 1721 and 1722 (just a little help
632         for the programmer).
633
634 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
635
636         * delegate.cs: Only allow this on new versions of the language. 
637
638 2004-12-02  Duncan Mak  <duncan@ximian.com>
639
640         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
641         Expression class.
642         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
643         here as a static method. Take an additional bool out parameter
644         `must_do_cs1540_check' for signaling to InstanceResolve.
645         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
646         member field from PropertyExpr class and made it an argument of
647         the method instead.
648         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
649         check for MarshalByRefObject, and report CS0122 instead of CS1540.
650         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
651         and `remove_accessor' as well as InstanceResolve: report CS0122
652         where applicable.
653
654         Fixes #70129.
655
656 2004-12-07  Martin Baulig  <martin@ximian.com>
657
658         * decl.cs (DeclSpace.AddToContainer): Report correct errors CS0694
659         and CS0692 where appropriate.
660
661 2004-12-06  Martin Baulig  <martin@ximian.com>
662
663         * class.cs (MethodCore.MayUnify): Moved the CS0408 check here from
664         IsDuplicateImplementation() and improved it.
665
666         * expression.cs (Invocation.InferTypeArguments): Added
667         `Type[] inferred_class_types' argument (for MethodCore.MayUnify)
668         and removed the "ref" modifier from `infered_types'.
669
670         * decl.cs (MemberName.ToString): Removed the exception.
671
672 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
673
674         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
675           comments are allowed.
676
677 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
678
679         * delegate.cs: Add checks for subtypes in paramaters and return values
680         in VerifyMethod () to add support for Covariance/Contravariance
681         in delegates.
682         
683 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
684
685         * report.cs: Remove extra closing parenthesis.
686
687         * convert.cs (Error_CannotImplicitConversion): If the name of the
688         types are the same, provide some extra information.
689
690 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
691
692         Fix bug #70102
693         * attribute.cs (Resolve): Improved implementation of params
694         attribute arguments.
695
696         * support.cs (ParameterData): Add HasParams to be faster.
697
698 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
699
700         all things are for /doc support:
701
702         * doc.cs: new file that supports XML documentation generation.
703         * mcs.exe.sources: added doc.cs.
704         * driver.cs:
705           Handle /doc command line option.
706           Report error 2006 instead of 5 for missing file name for /doc.
707           Generate XML documentation when required, after type resolution.
708         * cs-tokenizer.cs:
709           Added support for picking up documentation (/// and /** ... */),
710           including a new XmlCommentState enumeration.
711         * cs-parser.jay:
712           Added lines to fill Documentation element for field, constant,
713           property, indexer, method, constructor, destructor, operator, event
714           and class, struct, interface, delegate, enum.
715           Added lines to warn incorrect comment.
716         * rootcontext.cs :
717           Added Documentation field (passed only when /doc was specified).
718         * decl.cs:
719           Added DocComment, DocCommentHeader, GenerateDocComment() and
720           OnGenerateDocComment() and some supporting private members for
721           /doc feature to MemberCore.
722         * class.cs:
723           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
724         * delegate.cs:
725           Added overriden DocCommentHeader.
726         * enum.cs:
727           Added overriden DocCommentHeader and GenerateDocComment().
728
729 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
730
731         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
732         unwrapping the enumeration values, chain to
733         DoConstantNumericPromotions again, so we can promote things to the
734         fundamental types (takes care of enums that are bytes, sbytes).
735
736         Fixes bug #62054.
737
738 2004-12-01  Raja R Harinath  <rharinath@novell.com>
739
740         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
741         Fix long-standing bug in type-lookup.  Use FindType instead of
742         LookupType when ec.ResolvingTypeTree.
743         (Attribute.ResolveType, Attribute.Resolve)
744         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
745         Update to changes.
746         (Attributes.Search): Remove internal version.  Update.
747         (Attributes.SearchMulti): Update.
748         (Attributes.GetClsCompliantAttribute): Remove.
749         (Attributes.GetIndexerNameAttribute): Remove.
750         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
751         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
752         * class.cs (Indexer.Define): Likewise.
753
754 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
755
756         Fix bug #68790
757         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
758         MarshallByReference members access.
759
760         * expression.cs: Use CheckMarshallByRefAccess;
761         Better error CS0197 message.
762
763         * report.cs: Print whole related error message.
764
765 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
766
767         * class (GetClassBases): Better error 60 report.
768         (EventProperty): Disabled warning 67 detection.
769
770 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
771
772         Fix bug #60324
773         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
774
775         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
776         precise values.
777
778 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
779
780         Fix bug #49488
781         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
782
783         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
784
785 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
786
787         * attribute.cs (Attribute.Resolve): Refine error reporting and
788         report a cs0117 if the identifier does not exist, to distinguish
789         from 0617 which is a miss-use of the actual identifier.
790
791         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
792         between cs0070 and cs0079.
793
794         * class.cs (MemberBase.DoDefine): When reporting a wrong
795         accessibility level, we use MethodCore to compare instead of
796         Method (this was a regression in some refactoring effort).
797
798         So now we correctly report cs0056 again.
799
800         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
801         testing the target_type (which was known to be object_type) and
802         not the source type (which is anonymous_method).
803
804         Fixed reporting of error cs1660.
805
806         * expression.cs (UserCast.Source): Expose the underlying cast.
807
808         * statement.cs (Switch.SwitchGoverningType): Sort the list of
809         allowed types to find a match to int32 first (most common).
810
811         In addition, it ignores any ImplicitUserConversions that did an
812         internal implicit conversion (as the switch statement allows only
813         one integral conversion to exist).
814
815         * class.cs (PartialContainer.Create): rename `name' to
816         `member_name' for clarity.  Then replace the string calls with a
817         call to MemberName.GetPartialName, as now using
818         MemberName.ToString is an error (this is due to the side effects
819         it had, that were fixed in the past).
820
821         This will restore the error reporting on a number of partial class
822         errors that were missusing this (and getting an exception as a
823         results, which is now just a plain textual warning, because
824         yyparse debug output would crash otherwise).
825
826 2004-11-26  Raja R Harinath  <rharinath@novell.com>
827
828         * Makefile (PROGRAM_INSTALL_DIR): Remove.
829
830 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
831
832         * rootcontext.cs (LookupType): Make sure to cache lookups that
833         don't give us a negative result. This saves about 5% of corlib
834         compilation time.
835
836 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
837
838         * report.cs (AbstractMessage.Print): messages are sent to stderr
839
840         * class.cs (TypeContainer.GetClassBases): It is an error to have a
841         non-interface in the list of interfaces (at this point, either
842         parent was properly set, or a base class is being listed in the
843         interfaces section).
844
845         This flags error 1722, and resolves the crash from bug 69259.
846
847 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
848
849         * statement.cs (Using.EmitExpressionFinally): make this work right
850         for valuetypes. Fixes 69926.
851
852 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
853
854         * const.cs (Const.ChangeType): Cope with the "0 literal can be
855         converted to an enum" here, before we try to change the underlying
856         type.  This code exists, but it is a different code path than the
857         one used while encoding constants.
858
859         (ImplicitReferenceConversionExists): In addition, resynchronized
860         the code here, so it matches the same code in
861         ImplicitReferenceConversionExists for the `from any class-type S
862         to any interface-type T'.       
863
864 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
865
866         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
867
868 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
869
870         * cs-parser.jay: Use verbosity accordingly. 
871
872 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
873
874         * expression.cs (Unary.ResolveOperator): Do not report warning;
875         AddressOf reads from variable.
876         
877         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
878
879 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
880
881         Fix bug #69462
882
883         * attribute.cs (Attributable): Removed CheckTargets.
884         (Attributes.Emit): Explicit attribute targets are tested here.
885
886         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
887         not enabled for interfaces.
888
889         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
890         (GetAssemblyName): Ouch next bug there.
891
892 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
893
894         * expression.cs: Error 275 added.
895         
896 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
897
898         Fix bug #69177 (Implemented decimal constant support)
899
900         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
901         (BinaryFold): Add DecimalConstant.
902
903         * const.cs (Define): Decimal constant 
904         (is not constant.
905         (ChangeType): Add decimal type handling.
906         (LookupConstantValue): Don't set value for decimal type but
907         emit DecimalConstantAttribute. Needed for constant optimization.
908
909         * constant.cs (ToDecimal): New method.
910         (ConvertToDecimal): New method.
911         (IntConstant): Implemented ConvertToDecimal.
912         (DecimalConstant.Emit): Emit optimized version for decimals in
913         int range.
914
915         * expression.cs (ResolveOperator): Changed order of constant
916         reduction to work correctly with native types which have
917         overloaded operators.
918         (ResolveMemberAccess): Extract constant value from attribute
919         for decimal type.
920
921         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
922
923         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
924         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
925         (ChangeType): Decimal is special.
926         (TypeToCoreType): Add decimal type.
927
928 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
929
930         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
931         decimal types.
932
933 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
934
935         * class.cs (EventField.ApplyAttributeBuilder): Fix error
936         test cs1667-5.cs.
937
938 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
939
940         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
941
942         * pending.cs (PendingImplementation): Grab only interfaces.
943
944 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
945
946         * statement.cs (ForeachHelperMethods): Add location member and
947         error 202 detection.
948
949 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
950
951         * expression.cs (DoResolveBase): Fixed wrong warning for out
952         variables.
953
954 2004-12-04  Martin Baulig  <martin@ximian.com>
955
956         * convert.cs (Convert.TypeParameter_to_Null): Use the constraints
957         to check whether the conversion is ok.
958
959         * typemanager.cs (TypeManager.GetTypeArguments): Just return
960         `Type.EmptyTypes' if we're not a generic TypeContainer.
961
962 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
963
964         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
965         old bug: when converting from the null literal to a pointer,
966         return an EmptyCast, not the NullLiteral.
967
968         This fixes #69921, the recent null_type changes probably made this
969         bug more prominent.
970
971 2004-12-03  Martin Baulig  <martin@ximian.com>
972
973         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
974         method as our child, call AnonymousMethod.Compatible() on it.
975
976 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
977
978         * class.cs (FieldBase): Use an unused bit field from the field to
979         encode the `has_offset' property from the FieldMember.  This saves
980         a couple of Ks on bootstrap compilation.
981
982         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
983         method as our child, return the AnonymousMethod resolved
984         expression.
985
986         * expression.cs (New.DoResolve): Allow return values from
987         NewDelegate to also include AnonymousMethods.
988
989         Fixes #70150.
990
991 2004-11-29  Raja R Harinath  <rharinath@novell.com>
992
993         * decl.cs (MemberCore.MemberName): Remove readonly to fix an error
994         cs1648 report.
995         * rootcontext.cs (ResolveCore::interfaces_first_stage): Add
996         System.Runtime.InteropServices._Exception, since it's a base
997         interface of the core type System.Exception in the net_2_0 profile.
998
999 2004-11-27  Martin Baulig  <martin@ximian.com>
1000
1001         * ecore.cs (Expression.StoreFromPtr): Use `stobj' for generic parameters.
1002
1003 2004-11-26  Raja R Harinath  <rharinath@novell.com>
1004
1005         * Makefile: Convert to use executable.make.
1006         * gmcs.exe.sources: New.
1007
1008 2004-11-25  Martin Baulig  <martin@ximian.com>
1009
1010         * expression.cs (Invocation.InferType): Added support for byref types.
1011
1012 2004-11-25  Martin Baulig  <martin@ximian.com>
1013
1014         * statement.cs (Foreach.FetchMethodMoveNext): Wrap `mi.ReturnType'
1015         in TypeManager.TypeToCoreType().
1016
1017 2004-11-25  Martin Baulig  <martin@ximian.com>
1018
1019         * iterators.cs (Iterator.DoDefineMembers): Override and lookup the
1020         "Dispose" method from the `current_type'.
1021         (Iterator.EmitMoveNext): Use the `dispose_method' we looked up in
1022         DoDefineMembers() instead of using the MethodBuilder; this is
1023         required for generic iterators.
1024
1025         * class.cs (TypeContainer.DoDefineMembers): Make this virtual.
1026
1027 2004-11-24  Martin Baulig  <martin@ximian.com>
1028
1029         * ecore.cs (Expression.LoadFromPtr): Use `ldobj' for generic parameters.
1030
1031 2004-11-20  Martin Baulig  <martin@ximian.com>
1032
1033         * expression.cs (Invocation.InferType): Correctly infer generic
1034         instances; see gen-103.cs.
1035         (Invocation.InferTypeArguments): If a generic method doesn't have
1036         any unbound type parameters, we don't need to infer anything.
1037
1038 2004-11-19  Raja R Harinath  <rharinath@novell.com>
1039
1040         * Makefile (gmcs.exe): Update to new location of bootstrap mcs.exe.
1041
1042 2004-11-17  Raja R Harinath  <rharinath@novell.com>
1043
1044         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
1045         (TypeHandle.GetMemberCache): New.
1046         (TypeHandle.TypeHandle): Update.
1047         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
1048         (TypeManager.LookupParentInterfacesCache):
1049         Rename from LookupInterfaceCache.  Optimize slightly.
1050         (TypeManager.MemberLookup_FindMembers): Update.
1051         * decl.cs (MemberCache.MemberCache): Set Container to null in the
1052         multi-type variant.
1053         (AddCacheContents): Rename from AddHashtable.
1054         * class.cs (TypeContainer.parent_container): Remove.
1055         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
1056         (TypeContainer.DoDefineMembers): Don't initialize it.
1057         Update to name changes.
1058         
1059 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
1060
1061         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
1062         that factors the code to check access modifiers on override.  
1063
1064         (PropertyBase): Use the code here.
1065
1066         Patch from Lluis S'anchez, fixes bug #69361.
1067
1068 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
1069
1070         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
1071         routine that is used to report the use of a captured variable
1072         whose address has been taken.
1073
1074         There are two checks: one when variables are being captured and
1075         the other check is when the address of a variable is taken. 
1076         
1077         (because an anonymous methods might be resolved before *or* after
1078         the address has been taken) and 
1079
1080         * expression.cs (Conditional.DoResolve): Remove the special
1081         casing that Martin added to trueExpr and falseExpr being both
1082         NullLiteral.  We get the right behavior now just by introducing
1083         the null_type into the compiler. 
1084
1085         * convert.cs (ExplicitConversion): Change the code to use
1086         null_type instead of testing `expr is NullLiteral'.
1087         (ImplicitConversionStandard): use null_type too.
1088         (ImplicitReferenceConversionExists): use null_type too.
1089         (ImplicitReferenceConversion): use null_type too.
1090
1091         * literal.cs: The type of `NullLiteral' is now null_type instead
1092         of object_type. 
1093         (Resolve): Set the type here.
1094
1095         * typemanager.cs: Introduce null_type.
1096
1097 2004-11-18  Martin Baulig  <martin@ximian.com>
1098
1099         * rootcontext.cs
1100         (RootContext.LookupType): Return a `Type', not a `TypeExpr'.
1101
1102 2004-11-18  Martin Baulig  <martin@ximian.com>
1103
1104         * ecore.cs (TypeExpr.DoResolveAsTypeStep): Make this protected.
1105
1106 2004-11-18  Martin Baulig  <martin@ximian.com>
1107
1108         * generic.cs (Constraints.Resolve): Take an `EmitContext' instead
1109         of a `DeclSpace'.  If one of our constraints is a `ConstructedType',
1110         call ResolveConstructedType() on it to resolve it without checking
1111         constraints.
1112         (Constraints.ResolveTypes): Check them here.
1113         (ConstructedType.DoResolveAsTypeStep): Fully resolve ourselves,
1114         but don't check constraints.
1115         (ConstructedType.ResolveAsTypeTerminal): Override this and also
1116         check constraints here.
1117         (ConstructedType.ResolveConstructedType): New public method.  This
1118         is called from DoResolveAsTypeStep() and Constraints.Resolve() to
1119         resolve ourselves without checking constraints.
1120
1121         * ecore.cs (Expression.ResolveAsTypeTerminal): Make this virtual.
1122
1123 2004-11-18  Martin Baulig  <martin@ximian.com>
1124
1125         * decl.cs
1126         (DeclSpace.CurrentType): Changed type from `TypeExpr' to `Type'.
1127
1128         * delegate.cs (Delegate.DefineType): Always create the EmitContext.
1129
1130 2004-11-18  Martin Baulig  <martin@ximian.com>
1131
1132         * ecore.cs (TypeExpr.ResolveType): Removed.
1133         (Expression.ResolveAsTypeTerminal): We always return a fully
1134         resolved `TypeExpr', so we can just access its `Type'.
1135
1136         * class.cs (TypeContainer.DefineType): Resolve `CurrentType' here.
1137
1138 2004-11-17  Martin Baulig  <martin@ximian.com>
1139
1140         * ecore.cs (IAlias.Type): Replaced with ResolveAsType() to make
1141         sure we don't return any unresolved TypeExpr's.
1142         (TypeAliasExpression): The .ctor now takes an `IAlias' instead of
1143         a `TypeExpr'.
1144         (Expression.ResolveAsTypeTerminal): Make sure `te.Type != null'.
1145
1146         * expression.cs (MemberAccess.ResolveAsTypeStep): Don't return any
1147         unresolved `ConstructedType's.
1148
1149 2004-11-17  Martin Baulig  <martin@ximian.com>
1150
1151         * ecore.cs (TypeExpr.ResolveType): Don't make this virtual.
1152
1153 2004-11-17  Martin Baulig  <martin@ximian.com>
1154
1155         * ecore.cs
1156         (Expression.ResolveAsTypeTerminal): Removed the `bool silent' argument.
1157
1158         * decl.cs (DeclSpace.ResolveType): Removed.
1159         (DeclSpace.ResolveTypeExpr): Removed the `bool silent' argument.
1160
1161 2004-11-17  Martin Baulig  <martin@ximian.com>
1162
1163         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
1164         direction, like FindMembers() does.  Fixes #69546, testcase is in
1165         test-315.cs.    
1166
1167 2004-11-16  Martin Baulig  <martin@ximian.com>
1168
1169         This is based on a patch from Marek Safar, see bug #69082.
1170         Fixes bugs #63705 and #67130.
1171
1172         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
1173         method; create a MemberCache for an interface type and cache the
1174         result.
1175
1176         * decl.cs (IMemberContainer.ParentContainer): Removed.
1177         (IMemberContainer.ParentCache): New property.
1178         (MemberCache.SetupCacheForInterface): Removed.
1179         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
1180         to create a cache for an interface's "parent".
1181
1182         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
1183         interfaces too.
1184
1185 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
1186
1187         * statement.cs: Avoid adding bools to a hashtable.
1188
1189 2004-11-15  Martin Baulig  <martin@ximian.com>
1190
1191         * decl.cs (MemberName.GetPartialName): Removed, use GetTypeName() instead.
1192
1193 2004-11-11  Martin Baulig  <martin@ximian.com>
1194
1195         * typemanager.cs (TypeManager.GetMethodName): New method.
1196
1197         * class.cs (MethodData.Define): Include the generic arity in the
1198         name of an explicit interface; also add it to the method name.
1199
1200         * pending.cs (PendingImplementation.InterfaceMethod): The method
1201         name now includes the generic arity.
1202
1203 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
1204
1205         * expression.cs (Invocation.OverloadResolve): Flag error if we are
1206         calling an unsafe method from a safe location.
1207
1208 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
1209
1210         Fix #69167
1211         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
1212
1213 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
1214
1215         * namespace.cs (VerifyUsing): use GetPartialName instead of
1216         ToString. 
1217
1218 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
1219
1220         * statement.cs (Return.Resolve): Fix regression in typo: if
1221         `in_exc', we have to request a NeedReturnLabel, this was a typo
1222         introduced in the anonymous method check-in.  Fixes #69131.
1223
1224         * Indexers were using the ShortName when defining themselves,
1225         causing a regression in the compiler bootstrap when applying the
1226         patch from 2004-11-02 (first part), now they use their full name
1227         and the bug is gone.
1228
1229 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
1230
1231         * driver.cs: Strip the path from the names of embedded resources. Fixes
1232         #68519.
1233
1234 2004-11-04  Raja R Harinath  <rharinath@novell.com>
1235
1236         Fix error message regression: cs0104-2.cs.
1237         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
1238         (AliasEntry.Resolve): Update.
1239         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
1240         'silent' flag.
1241         (RootContext.LookupType): Update.
1242
1243 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
1244
1245         * cs-parser.jay: Add support for handling accessor modifiers
1246         * class: Add support port accessor modifiers and error checking,
1247         define PropertyMethod.Define as virtual (not abstract anymore)
1248         * ecore.cs: Add checking for proeprties access with access modifiers
1249         * iterators.cs: Modify Accessor constructor call based in the modified
1250         constructor
1251 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
1252
1253         * expression.cs (StringConcat): Handle being called twice,
1254         as when we have a concat in a field init with more than two
1255         ctors in the class
1256
1257 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
1258
1259         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
1260         special case explicit implementations, we should always produce
1261         the .property or .event declaration.
1262         
1263         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
1264         since it will not return correct data if people use this
1265         unresolved in the presence of using statements (see test-313).
1266
1267         * class.cs (MethodData.Define): If we are an explicit interface
1268         implementation, set the method name to the full name of the
1269         interface plus the name of the method.  
1270
1271         Notice that using the method.MethodName.GetFullName() does not
1272         work, as it will only contain the name as declared on the source
1273         file (it can be a shorthand in the presence of using statements)
1274         and not the fully qualifed type name, for example:
1275
1276         using System;
1277
1278         class D : ICloneable {
1279                 object ICloneable.Clone ()  {
1280                 }
1281         }
1282
1283         Would produce a method called `ICloneable.Clone' instead of
1284         `System.ICloneable.Clone'.
1285
1286         * namespace.cs (Alias.Resolve): Use GetPartialName.
1287         
1288 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
1289
1290         * cs-parser.jay: Add error 1055 report.
1291
1292 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
1293
1294         * assign.cs (Assign.DoResolve): Only do the transform of
1295         assignment into a New if the types are compatible, if not, fall
1296         through and let the implicit code deal with the errors and with
1297         the necessary conversions. 
1298
1299 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
1300
1301         * cs-parser.jay: Add error 1031 report.
1302
1303         * cs-tokenizer.cs: Add location for error 1038.
1304
1305 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1306
1307         * cs-parser.jay: Add error 1016 report.
1308
1309 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1310
1311         * cs-parser.jay: Add errors 1575,1611 report.
1312
1313 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1314
1315         * cs-parser.jay: Add error 1001 report.
1316
1317 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1318
1319         Fix #68850
1320         * attribute.cs (GetMarshal): Add method argument for
1321         caller identification.
1322
1323         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
1324         agument for GetMarshal and RuntimeMissingSupport.
1325
1326 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1327
1328         * attribute.cs (ExtractSecurityPermissionSet): Removed
1329         TypeManager.code_access_permission_type.
1330
1331         * typemanager.cs: Removed TypeManager.code_access_permission_type.
1332
1333 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
1334
1335         * expression.cs (LocalVariableReference.DoResolveLValue): Check
1336         for obsolete use of a variable here.   Fixes regression on errors
1337         cs0619-25 and cs0619-26.
1338
1339 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
1340
1341         Fix #62358, implemented security attribute encoding.
1342
1343         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
1344         Tests permitted SecurityAction for assembly or other types.
1345         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
1346         data from SecurityPermissionAttribute to PermisionSet class.
1347
1348         * class.cs (ApplyAttributeBuilder): Added special handling
1349         for System.Security.Permissions.SecurityAttribute based types.
1350
1351         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
1352         special handling for System.Security.Permissions.SecurityAttribute
1353         based types.
1354
1355         * enum.cs (ApplyAttributeBuilder): Added special handling
1356         for System.Security.Permissions.SecurityAttribute based types.
1357
1358         * parameter.cs (ApplyAttributeBuilder): Added special handling
1359         for System.Security.Permissions.SecurityAttribute based types.
1360
1361         * rootcontext.cs: Next 2 core types.
1362
1363         * typemanager.cs (TypeManager.security_permission_attr_type):
1364         Built in type for the SecurityPermission Attribute.
1365         (code_access_permission_type): Build in type.
1366
1367 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
1368
1369         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
1370         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
1371         all of this information into
1372         EmitContext.EmitCapturedVariableInstance.
1373         
1374         * codegen.cs (EmitCapturedVariableInstance): move here the
1375         funcionality of emitting an ldarg.0 in the presence of a
1376         remapping.   This centralizes the instance emit code.
1377
1378         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
1379         then emit a load of this: it means that we have reached the
1380         topmost ScopeInfo: the one that contains the pointer to the
1381         instance of the class hosting the anonymous method.
1382
1383         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
1384         captures to the topmost CaptureContext.
1385
1386 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
1387
1388         * expression.cs (LocalVariableReference): Move the knowledge about
1389         the iterators into codegen's EmitCapturedVariableInstance.
1390
1391 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
1392
1393         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
1394         all code paths return a value from an anonymous method (it is the
1395         same as the 161 error, but for anonymous methods).
1396
1397 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
1398
1399         The introduction of anonymous methods in the compiler changed
1400         various ways of doing things in the compiler.  The most
1401         significant one is the hard split between the resolution phase
1402         and the emission phases of the compiler.
1403
1404         For instance, routines that referenced local variables no
1405         longer can safely create temporary variables during the
1406         resolution phase: they must do so from the emission phase,
1407         since the variable might have been "captured", hence access to
1408         it can not be done with the local-variable operations from the runtime.
1409         
1410         * statement.cs 
1411
1412         (Block.Flags): New flag `IsTopLevel' to indicate that this block
1413         is a toplevel block.
1414
1415         (ToplevelBlock): A new kind of Block, these are the blocks that
1416         are created by the parser for all toplevel method bodies.  These
1417         include methods, accessors and anonymous methods.
1418
1419         These contain some extra information not found in regular blocks:
1420         A pointer to an optional CaptureContext (for tracking captured
1421         local variables and parameters).  A pointer to the parent
1422         ToplevelBlock.
1423         
1424         (Return.Resolve): Catch missmatches when returning a value from an
1425         anonymous method (error 1662).
1426         Invoke NeedReturnLabel from the Resolve phase instead of the emit
1427         phase.
1428
1429         (Break.Resolve): ditto.
1430
1431         (SwitchLabel): instead of defining the labels during the
1432         resolution phase, we now turned the public ILLabel and ILLabelCode
1433         labels into methods called GetILLabelCode() and GetILLabel() that
1434         only define the label during the Emit phase.
1435
1436         (GotoCase): Track the SwitchLabel instead of the computed label
1437         (its contained therein).  Emit the code by using
1438         SwitchLabel.GetILLabelCode ().
1439
1440         (LocalInfo.Flags.Captured): A new flag has been introduce to track
1441         whether the Local has been captured or not.
1442
1443         (LocalInfo.IsCaptured): New property, used to tell whether the
1444         local has been captured.
1445         
1446         * anonymous.cs: Vastly updated to contain the anonymous method
1447         support.
1448
1449         The main classes here are: CaptureContext which tracks any
1450         captured information for a toplevel block and ScopeInfo used to
1451         track the activation frames for various local variables.   
1452
1453         Each toplevel block has an optional capture context associated
1454         with it.  When a method contains an anonymous method both the
1455         toplevel method and the anonymous method will create a capture
1456         context.   When variables or parameters are captured, they are
1457         recorded on the CaptureContext that owns them, for example:
1458
1459         void Demo () {
1460              int a;
1461              MyDelegate d = delegate {
1462                  a = 1;
1463              }
1464         }
1465
1466         Here `a' will be recorded as captured on the toplevel
1467         CapturedContext, the inner captured context will not have anything
1468         (it will only have data if local variables or parameters from it
1469         are captured in a nested anonymous method.
1470
1471         The ScopeInfo is used to track the activation frames for local
1472         variables, for example:
1473
1474         for (int i = 0; i < 10; i++)
1475                 for (int j = 0; j < 10; j++){
1476                    MyDelegate d = delegate {
1477                         call (i, j);
1478                    }
1479                 }
1480
1481         At runtime this captures a single captured variable `i', but it
1482         captures 10 different versions of the variable `j'.  The variable
1483         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
1484         recorded on a child.  
1485
1486         The toplevel ScopeInfo will also track information like the `this'
1487         pointer if instance variables were referenced (this is necessary
1488         as the anonymous method lives inside a nested class in the host
1489         type of the method). 
1490
1491         (AnonymousMethod): Expanded to track the Toplevel, implement
1492         `AnonymousMethod.Compatible' to tell whether an anonymous method
1493         can be converted to a target delegate type. 
1494
1495         The routine now also produces the anonymous method content
1496
1497         (AnonymousDelegate): A helper class that derives from
1498         DelegateCreation, this is used to generate the code necessary to
1499         produce the delegate for the anonymous method that was created. 
1500
1501         * assign.cs: API adjustments for new changes in
1502         Convert.ImplicitStandardConversionExists.
1503
1504         * class.cs: Adjustments to cope with the fact that now toplevel
1505         blocks are of type `ToplevelBlock'. 
1506
1507         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
1508         insteda of standard blocks.
1509
1510         Flag errors if params arguments are passed to anonymous methods.
1511
1512         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
1513         `CurrentAnonymousMethod' which points to the current Anonymous
1514         Method.  The variable points to the AnonymousMethod class that
1515         holds the code being compiled.  It is set in the new EmitContext
1516         created for the anonymous method.
1517
1518         (EmitContext.Phase): Introduce a variable and an enumeration to
1519         assist in enforcing some rules about when and where we are allowed
1520         to invoke certain methods (EmitContext.NeedsReturnLabel is the
1521         only one that enfonces this right now).
1522
1523         (EmitContext.HaveCaptureInfo): new helper method that returns
1524         whether we have a CapturedContext initialized.
1525
1526         (EmitContext.CaptureVariable): New method used to register that a
1527         LocalInfo must be flagged for capturing. 
1528
1529         (EmitContext.CapturedParameter): New method used to register that a
1530         parameters must be flagged for capturing. 
1531         
1532         (EmitContext.CapturedField): New method used to register that a
1533         field must be flagged for capturing. 
1534
1535         (EmitContext.HaveCapturedVariables,
1536         EmitContext.HaveCapturedFields): Return whether there are captured
1537         variables or fields. 
1538
1539         (EmitContext.EmitMethodHostInstance): This is used to emit the
1540         instance for the anonymous method.  The instance might be null
1541         (static methods), this (for anonymous methods that capture nothing
1542         and happen to live side-by-side with the current method body) or a
1543         more complicated expression if the method has a CaptureContext.
1544
1545         (EmitContext.EmitTopBlock): Routine that drives the emission of
1546         code: it will first resolve the top block, then emit any metadata
1547         and then emit the code.  The split is done so that we can extract
1548         any anonymous methods and flag any captured variables/parameters.
1549         
1550         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
1551         during this phase, the ILGenerator should not be used as labels
1552         and local variables declared here might not be accessible to any
1553         code that is part of an anonymous method.  
1554
1555         Exceptions to this include the temporary variables that are
1556         created by some statements internally for holding temporary
1557         variables. 
1558         
1559         (EmitContext.EmitMeta): New routine, in charge of emitting all the
1560         metadata for a cb
1561
1562         (EmitContext.TemporaryReturn): This method is typically called
1563         from the Emit phase, and its the only place where we allow the
1564         ReturnLabel to be defined other than the EmitMeta.  The reason is
1565         that otherwise we would have to duplicate a lot of logic in the
1566         Resolve phases of various methods that today is on the Emit
1567         phase. 
1568
1569         (EmitContext.NeedReturnLabel): This no longer creates the label,
1570         as the ILGenerator is not valid during the resolve phase.
1571
1572         (EmitContext.EmitThis): Extended the knowledge in this class to
1573         work in anonymous methods in addition to iterators. 
1574
1575         (EmitContext.EmitCapturedVariableInstance): This emits whatever
1576         code is necessary on the stack to access the instance to a local
1577         variable (the variable will be accessed as a field).
1578
1579         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
1580         EmitContext.EmitAddressOfParameter): Routines to support
1581         parameters (not completed at this point). 
1582         
1583         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
1584         will also remove the parameters.
1585
1586         * convert.cs (Convert): Define a `ConstantEC' which points to a
1587         null.  This is just to prefity some code that uses
1588         ImplicitStandardConversion code and do not have an EmitContext
1589         handy.
1590
1591         The idea is to flag explicitly that at that point in time, it is
1592         known that the conversion will not trigger the delegate checking
1593         code in implicit conversions (which requires a valid
1594         EmitContext). 
1595
1596         Everywhere: pass new EmitContext parameter since
1597         ImplicitStandardConversionExists now requires it to check for
1598         anonymous method conversions. 
1599
1600         (Convert.ImplicitStandardConversionExists): If the type of an
1601         expression is the anonymous_method_type, and the type is a
1602         delegate, we invoke the AnonymousMethod.Compatible method to check
1603         whether an implicit conversion is possible. 
1604
1605         (Convert.ImplicitConversionStandard): Only do implicit method
1606         group conversions if the language level is not ISO_1.
1607
1608         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
1609         MethodInfo for the Invoke method.  used by Delegate and
1610         AnonymousDelegate.
1611
1612         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
1613         method conversions if the target type is a delegate.
1614
1615         Removed extra debugging nops.
1616
1617         (LocalVariableReference): Turn the `local_info' into a public
1618         field. 
1619
1620         Add `prepared' field, the same hack used for FieldExprs to cope
1621         with composed assignments, as Local variables do not necessarily
1622         operate purely on the stack as they used to: they can be captured
1623         fields. 
1624
1625         Add `temp' for a temporary result, like fields.
1626
1627         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1628
1629         It now copes with Local variables that are captured and emits the
1630         proper instance variable to load it from a field in the captured
1631         case. 
1632
1633         (ParameterReference.DoResolveBase): During the resolve phase,
1634         capture parameters if we are in an anonymous method.
1635
1636         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1637         anonymous method, use the EmitContext helper routines to emit the
1638         parameter reference.
1639
1640         * iterators.cs: Set RemapToProxy to true/false during the
1641         EmitDispose class.
1642
1643         * parameters.cs (GetParameterByName): New helper method. 
1644
1645         * typemanager.cs (anonymous_method_type) a new type that
1646         represents an anonyous method.  This is always an internal type,
1647         used as a fencepost to test against the anonymous-methodness of an
1648         expression. 
1649         
1650 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
1651
1652         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
1653         561 report.
1654         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
1655
1656 2004-11-10  Martin Baulig  <martin@ximian.com>
1657
1658         * expression.cs (Invocation.BetterFunction): If two methods have
1659         equal parameter types, but only one of them is generic, the
1660         non-generic one wins.
1661         (New.DoResolve): Don't set `is_struct' to false if we're a generic
1662         instance; just use `Type.IsValueType' to determine whether
1663         something is a struct or not.
1664         (MemberAccess.DoResolveAsTypeStep): Don't modify the `args' field,
1665         so we can be called multiple times.
1666
1667 2004-11-10  Martin Baulig  <martin@ximian.com>
1668
1669         * generic.cs (TypeParameter.DefineConstraints): New public method.
1670         (TypeParameter.CheckAccessLevel): Override this and return true.
1671         (ConstructedType.ResolveType): Renamed to DoResolveType(), don't
1672         override ResolveType() anymore.
1673         (ConstructedType.DoResolveAsTypeStep): Call DoResolveType() here.
1674
1675 2004-11-10  Martin Baulig  <martin@ximian.com>
1676
1677         * rootcontext.cs (RootContext.LookupType): If we're a nested type,
1678         call DeclSpace.ResolveNestedType() on it.
1679
1680 2004-11-10  Martin Baulig  <martin@ximian.com>
1681
1682         * support.cs (ReflectionParameters.ParameterModifier): If `gpd' is
1683         non-null, call ParameterModifier() on it.
1684
1685 2004-11-10  Martin Baulig  <martin@ximian.com>
1686
1687         * iterators.cs
1688         (Iterators): Added `current_type' and `this_type' fields.
1689         (Iterators.DefineIterator): Create a new EmitContext and store it
1690         in `ec'; compute `this_type'.
1691
1692 2004-11-10  Martin Baulig  <martin@ximian.com>
1693
1694         * typemanager.cs
1695         (TypeManager.IsPrivateAccessible): New public method.
1696         (Closure.Filter): Use IsPrivateAccessible() instead of IsEqual().
1697
1698 2004-11-10  Martin Baulig  <martin@ximian.com>
1699
1700         * class.cs (TypeContainer.DefineType): Call
1701         TypeBuilder.DefineGenericParameters() before resolving the type
1702         parameters.
1703         (MethodData.parent_method): New protected field.
1704         (MethodData..ctor): Added `MethodInfo parent_method' argument.
1705         (MethodData.Define): Compute `parent_method'.
1706
1707         * decl.cs
1708         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
1709         (MemberCore.GetClsCompliantAttributeValue): Likewise.
1710         (DeclSpace.ec): New protected field; store the EmitContext here.
1711         (DeclSpace.EmitContext): New public property.
1712         (DeclSpace.ResolveType): Un-comment from the [Obsolte] attribute.
1713         (DeclSpace.ResolveNestedType): New public method.
1714         (DeclSpace.ResolveTypeExpr): Just call ResolveAsTypeTerminal() here.
1715         (DeclSpace.NestedAccessible): Added `Type tb' argument.
1716         (DeclSpace.FamilyAccessible): Likewise.
1717         (DeclSpace.FindType): Call ResolveNestedType() for nested types.
1718         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
1719         EmitContext.
1720
1721         * delegate.cs (Delegate.Define): Store the EmitContext in the `ec'
1722         field.
1723
1724         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
1725         (Enum.Emit): Don't create a new EmitContext.
1726
1727 2004-10-18  Martin Baulig  <martin@ximian.com>
1728
1729         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
1730         `Type' directly, but call ResolveType() on it.
1731         (Catch.Resolve): Likewise.
1732         (Foreach.Resolve): Likewise.
1733
1734 2004-10-18  Martin Baulig  <martin@ximian.com>
1735
1736         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
1737         `Type' directly, but call ResolveType() on it.
1738         (Probe.DoResolve): Likewise.
1739         (ArrayCreation.LookupType): Likewise.
1740         (TypeOf.DoResolve): Likewise.
1741         (SizeOf.DoResolve): Likewise.
1742
1743 2004-10-18  Raja R Harinath  <rharinath@novell.com>
1744
1745         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
1746         the ResolveType.
1747
1748 2004-10-17  John Luke  <john.luke@gmail.com>
1749
1750         * class.cs (Operator.GetSignatureForError): use CSharpName
1751
1752         * parameter.cs (Parameter.GetSignatureForError): Returns
1753         correct name even if was not defined.
1754
1755 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1756
1757         Fix #65816.
1758         * class.cs (TypeContainer.EmitContext): New property.
1759         (DefineNestedTypes): Create an emitcontext for each part.
1760         (MethodCore.DoDefineParameters): Use container's emitcontext.
1761         Pass type array to InternalParameters.
1762         (MemberBase.DoDefine): Use container's emitcontext.
1763         (FieldMember.Define): Likewise.
1764         (Event.Define): Likewise.
1765         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1766         Pass type array to InternalParameters.
1767         (SetIndexerMethod.GetParameterInfo): Likewise.
1768         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1769         * delegate.cs (Define): Pass emitcontext to
1770         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1771         array to InternalParameters.
1772         * expression.cs (ParameterReference.DoResolveBase): Pass
1773         emitcontext to GetParameterInfo.
1774         (ComposedCast.DoResolveAsTypeStep): Remove check on
1775         ec.ResolvingTypeTree.
1776         * parameter.cs (Parameter.Resolve): Change argument to
1777         EmitContext.  Use ResolveAsTypeTerminal.
1778         (Parameter.GetSignature): Change argument to EmitContext.
1779         (Parameters.ComputeSignature): Likewise.
1780         (Parameters.ComputeParameterTypes): Likewise.
1781         (Parameters.GetParameterInfo): Likewise.
1782         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1783         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1784         * support.cs (InternalParameters..ctor): Remove variant that takes
1785         a DeclSpace.
1786         * typemanager.cs (system_intptr_expr): New.
1787         (InitExpressionTypes): Initialize it.
1788
1789 2004-10-12  Chris Toshok  <toshok@ximian.com>
1790
1791         * cs-parser.jay: fix location for try_statement and catch_clause.
1792
1793 2004-10-18  Martin Baulig  <martin@ximian.com>
1794
1795         * class.cs (FieldMember.Define): Don't access the TypeExpr's
1796         `Type' directly, but call ResolveType() on it.
1797         (MemberBase.DoDefine): Likewise.
1798
1799         * expression.cs (New.DoResolve): Don't access the TypeExpr's
1800         `Type' directly, but call ResolveType() on it.
1801         (ComposedCast.DoResolveAsTypeStep): Likewise.
1802
1803         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
1804         `Type' directly, but call ResolveType() on it.
1805
1806 2004-10-17  John Luke  <john.luke@gmail.com>
1807
1808         * class.cs (Operator.GetSignatureForError): use CSharpName
1809
1810         * parameter.cs (Parameter.GetSignatureForError): Returns
1811         correct name even if was not defined.
1812
1813 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1814
1815         Fix #65816.
1816         * class.cs (TypeContainer.EmitContext): New property.
1817         (DefineNestedTypes): Create an emitcontext for each part.
1818         (MethodCore.DoDefineParameters): Use container's emitcontext.
1819         Pass type array to InternalParameters.
1820         (MemberBase.DoDefine): Use container's emitcontext.
1821         (FieldMember.Define): Likewise.
1822         (Event.Define): Likewise.
1823         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1824         Pass type array to InternalParameters.
1825         (SetIndexerMethod.GetParameterInfo): Likewise.
1826         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1827         * delegate.cs (Define): Pass emitcontext to
1828         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1829         array to InternalParameters.
1830         * expression.cs (ParameterReference.DoResolveBase): Pass
1831         emitcontext to GetParameterInfo.
1832         (ComposedCast.DoResolveAsTypeStep): Remove check on
1833         ec.ResolvingTypeTree.
1834         * parameter.cs (Parameter.Resolve): Change argument to
1835         EmitContext.  Use ResolveAsTypeTerminal.
1836         (Parameter.GetSignature): Change argument to EmitContext.
1837         (Parameters.ComputeSignature): Likewise.
1838         (Parameters.ComputeParameterTypes): Likewise.
1839         (Parameters.GetParameterInfo): Likewise.
1840         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1841         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1842         * support.cs (InternalParameters..ctor): Remove variant that takes
1843         a DeclSpace.
1844         * typemanager.cs (system_intptr_expr): New.
1845         (InitExpressionTypes): Initialize it.
1846
1847 2004-10-12  Chris Toshok  <toshok@ximian.com>
1848
1849         * cs-parser.jay: fix location for try_statement and catch_clause.
1850
1851 2004-10-07  Raja R Harinath  <rharinath@novell.com>
1852
1853         More DeclSpace.ResolveType avoidance.
1854         * decl.cs (MemberCore.InUnsafe): New property.
1855         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
1856         with newly created EmitContext.
1857         (FieldMember.Define): Likewise.
1858         * delegate.cs (Delegate.Define): Likewise.
1859         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
1860         only if normal name-lookup fails.
1861         (TypeExpr.DoResolve): Enable error-checking.
1862         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
1863         (SizeOf.DoResolve): Likewise.
1864         (ComposedCast.DoResolveAsTypeStep): Likewise.
1865         (StackAlloc.DoResolve): Likewise.
1866         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
1867         (Block.Unsafe): New property.
1868         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
1869         (Unsafe): Set 'unsafe' flag of contained block.
1870         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
1871         (Fixed.Resolve): Likewise.
1872         (Catch.Resolve): Likewise.
1873         (Using.ResolveLocalVariableDecls): Likewise.
1874         (Foreach.Resolve): Likewise.
1875
1876 2004-10-05  John Luke <john.luke@gmail.com>
1877
1878         * cs-parser.jay: add location to error CS0175
1879
1880 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
1881
1882         * ecore.cs (Expression.Constantity): Add support for turning null
1883         into a constant.
1884
1885         * const.cs (Const.Define): Allow constants to be reference types
1886         as long as the value is Null.
1887
1888 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
1889
1890         * namespace.cs (NamespaceEntry.Using): No matter which warning
1891         level is set, check if this namespace name has already been added.
1892
1893 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
1894
1895         * expression.cs: reftype [!=]= null should always use br[true,false].
1896         # 67410
1897
1898 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
1899
1900         Fix #67108
1901         * attribute.cs: Enum conversion moved to 
1902         GetAttributeArgumentExpression to be applied to the all
1903         expressions.
1904
1905 2004-10-01  Raja R Harinath  <rharinath@novell.com>
1906
1907         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
1908         * class.c (TypeContainer.DefineType): Flag error if
1909         base types aren't accessible due to access permissions.
1910         * decl.cs (DeclSpace.ResolveType): Move logic to
1911         Expression.ResolveAsTypeTerminal.
1912         (DeclSpace.ResolveTypeExpr): Thin layer over
1913         Expression.ResolveAsTypeTerminal.
1914         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
1915         Refactor code into NestedAccess.  Use it.
1916         (DeclSpace.NestedAccess): New.
1917         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
1918         argument to silence errors.  Check access permissions.
1919         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
1920         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
1921         (Cast.DoResolve): Likewise.
1922         (New.DoResolve): Likewise.
1923         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
1924         (TypeOf.DoResolve): Likewise.
1925
1926         * expression.cs (Invocation.BetterConversion): Return the Type of
1927         the better conversion.  Implement section 14.4.2.3 more faithfully.
1928         (Invocation.BetterFunction): Make boolean.  Make correspondence to
1929         section 14.4.2.2 explicit.
1930         (Invocation.OverloadResolve): Update.
1931         (Invocation): Remove is_base field.
1932         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
1933         (Invocation.Emit): Likewise.
1934
1935 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
1936
1937         * cs-parser.jay: Reverted 642 warning fix.
1938
1939 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1940
1941         Fix bug #66615
1942         * decl.cs (FindMemberWithSameName): Indexer can have more than
1943         1 argument.
1944
1945 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1946
1947         * expression.cs (LocalVariableReference.DoResolveLValue):
1948         Do not report warning 219 for out values.
1949         (EmptyExpression.Null): New member to avoid extra allocations.
1950
1951 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1952
1953         * cs-parser.jay: Fix wrong warning 642 report.
1954
1955         * cs-tokenizer.cs (CheckNextToken): New helper;
1956         Inspect next character if is same as expected.
1957
1958 2004-09-23  Martin Baulig  <martin@ximian.com>
1959
1960         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1961         (Convert.ImplicitReferenceConversionExists): Likewise.
1962
1963 2004-11-09  Raja R Harinath  <rharinath@novell.com>
1964
1965         * Makefile (DISTFILES): Comment out a few missing files.
1966
1967 2004-10-29  Raja R Harinath  <rharinath@novell.com>
1968
1969         * Makefile (bootstrap_libs,bootstrap_libfiles): New.
1970         (bootstrap-libs): New target.  Invokes the net_2_0_bootstrap profile.
1971         (gmcs.exe): Invoke bootstrap-libs.
1972         (clean-local): Clean the net_2_0_bootstrap profile too.
1973         (PROGRAM_INSTALL_DIR): New.
1974         (install-local): Use it.
1975
1976 2004-10-13  Martin Baulig  <martin@ximian.com>
1977
1978         * generic.cs (TypeManager.InflatedConstraints): New nested class.
1979         (TypeParameter.DefineType): If we're a method type parameter and
1980         that method is overriding something, "inflate" its constraints.
1981
1982 2004-10-12  Martin Baulig  <martin@ximian.com>
1983
1984         * expression.cs (MemberAccess.DoResolve): If we're a SimpleName
1985         and have type arguments, create and resolve a ConstructedType.
1986
1987 2004-10-12  Martin Baulig  <martin@ximian.com>
1988
1989         * decl.cs (MemberCache.FindMemberToOverride): Use
1990         TypeManager.IsEqual() to compare the parameters and Type.Equals()
1991         to compare the invocationType.
1992
1993         * typemanager.cs (TypeManager.IsEqual): Added support for arrays.
1994         When comparing two type parameters, only do the signature-only
1995         comparision for method type parameters.
1996
1997 2004-10-11  Martin Baulig  <martin@ximian.com>
1998
1999         * report.cs: Don't make --fatal abort on warnings, we have
2000         -warnaserror for that.
2001
2002 2004-10-11  Martin Baulig  <martin@ximian.com>
2003
2004         * typemanager.cs
2005         (TypeManager.IsEqualGenericType): Removed, use IsEqual() instead.
2006         (TypeManager.IsEqual): Call ourself recursively instead of using
2007         Type.IsEqual(). 
2008
2009 2004-10-11  Martin Baulig  <martin@ximian.com>
2010
2011         * class.cs (TypeContainer.DefineType): Only call TypeParameter.Define()
2012         on our own type parameters, not on the ones we inherit from a containing
2013         class.
2014
2015         * expression.cs (Invocation.InferType): Use `==', not `Equals()' for
2016         the comparision.
2017
2018         * generic.cs (TypeParameter.Define): We may only be called once.
2019
2020         * pending.cs (Pending.InterfaceMethod): Call TypeManager.Real_IsEqual()
2021         instead of TypeManager.IsEqual().
2022
2023 2004-09-28  Martin Baulig  <martin@ximian.com>
2024
2025         * generic.cs
2026         (GenericConstraints.EffectiveBaseClass): New public property.
2027         (TypeParameter.GenericConstraints): New public property.
2028         (ConstructedType.CheckConstraints): Improved.
2029
2030         * convert.cs (Convert.TypeParam_EffectiveBaseType): New private method.
2031         (Convert.TypeParameterConversion): New private method; use this in
2032         ImplicitReferenceConversion() and ImplicitReferenceConversionExists()
2033         for all conversions related to type parameters.
2034
2035 2004-09-24  Martin Baulig  <martin@ximian.com>
2036
2037         * convert.cs (Convert.ImplicitReferenceConversion): Added implicit
2038         type parameter conversions for type parameters which are known to
2039         be reference types.
2040
2041 2004-09-24  Martin Baulig  <martin@ximian.com>
2042
2043         * generic.cs (GenericConstraints): Added `IsReferenceType' and
2044         `IsValueType' properties.
2045
2046         * support.cs (ReflectionConstraints): Use
2047         Type.GetGenericParameterConstraints() instead of the old hack.
2048
2049 2004-09-24  Martin Baulig  <martin@ximian.com>
2050
2051         * generic.cs (GenericConstraints): Moved here and made it an
2052         abstract class.
2053
2054         * support.cs (GenericConstraints): Moved to generic.cs.
2055
2056 2004-09-24  Martin Baulig  <martin@ximian.com>
2057
2058         * support.cs
2059         (ReflectionConstraints): Un-nested this class and made it public.
2060
2061         * typemanager.cs
2062         (TypeManager.GetTypeParameterConstraints): New public method.
2063         (TypeManager.HasConstructorConstraint): Use the attributes.
2064
2065 2004-09-24  Martin Baulig  <martin@ximian.com>
2066
2067         * support.cs (GenericConstraints): Replaced `HasConstructor',
2068         `IsReferenceType' and `IsValueType' with `Attributes'.
2069         (ReflectionParameters.ReflectionConstraints): Removed the Create()
2070         method and made the .ctor public.
2071
2072         * generic.cs (Constraints.Attributes): New public property.
2073         (Constraints): Renamed `HasConstructor' -> `HasConstructorConstraint',
2074         `IsReferenceType' -> `HasReferenceTypeConstraint' and
2075         `IsValueType' -> `HasValueTypeConstraint'.
2076
2077 2004-09-23  Martin Baulig  <martin@ximian.com>
2078
2079         * generic.cs (Constraints): Reflect latest runtime changes.
2080
2081 2004-09-23  Martin Baulig  <martin@ximian.com>
2082
2083         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
2084         (Convert.ImplicitReferenceConversionExists): Likewise.
2085
2086 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
2087
2088         * class.cs (Operator.Define): Add error 448 and 559 report.
2089         
2090 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
2091
2092         * class.cs (MemberBase.IsTypePermitted): New protected
2093         method for checking error CS0610.
2094
2095 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
2096
2097         * class.cs (TypeContainer.HasExplicitLayout): New property
2098         Returns whether container has StructLayout attribute set Explicit.
2099         (FieldMember): New abstract class for consts and fields.
2100         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
2101         (Field): Reuse FieldMember.
2102
2103         * const.cs (Const): Reuse FieldMember.
2104
2105         * rootcontext.cs: EmitConstants call moved to class.
2106
2107 2004-09-22  Martin Baulig  <martin@ximian.com>
2108
2109         Marek and me just fixed one of our oldest bugs: #28562 :-)
2110
2111         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
2112
2113         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
2114         we're an EnumConstant, just return that.
2115         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
2116         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
2117         to get the value which'll actually be written into the attribute.
2118         However, we have to use GetValue() to access the attribute's value
2119         in the compiler.        
2120
2121 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
2122
2123         * constant.cs (Constant.IsNegative): New abstract property
2124         IsNegative.
2125
2126         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
2127         (StackAlloc.DoResolve): Reused IsNegative.
2128
2129 2004-09-22  Martin Baulig  <martin@ximian.com>
2130
2131         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
2132         public method; like LookupTypeContainer, but also works for
2133         generic instances.
2134
2135         * report.cs (Report.SymbolRelatedToPreviousError): Use
2136         TypeManager.LookupGenericTypeContainer().       
2137
2138 2004-09-22  Martin Baulig  <martin@ximian.com>
2139
2140         Thanks to Peter Sestoft for this bug report.
2141
2142         * expression.cs (Conditional): If both the `trueExpr' and the
2143         `falseExpr' is a NullLiteral, return a NullLiteral.
2144
2145 2004-09-22  Martin Baulig  <martin@ximian.com>
2146
2147         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
2148         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
2149         for the "get_Current" call.
2150
2151 2004-09-21  Martin Baulig  <martin@ximian.com>
2152
2153         * convert.cs (Convert.ImplicitReferenceConversion): When
2154         converting to an interface type, first check whether we're
2155         converting from a reference type.
2156
2157 2004-09-14  Martin Baulig  <martin@ximian.com>
2158
2159         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
2160
2161 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
2162
2163         Fixed bug #61902
2164         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
2165         called and is obsolete then this member suppress message
2166         when call is inside next [Obsolete] method or type.
2167
2168         * expression.cs: Use TestObsoleteMethodUsage member.
2169
2170 2004-09-14  Martin Baulig  <martin@ximian.com>
2171
2172         * genericparser.cs: Removed.
2173
2174 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
2175
2176         * class.cs (MethodCore.CheckBase): Fix bug #65757.
2177
2178 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
2179
2180         * attribute.cs (Attribute.Resolve): Add error 653 report.
2181
2182         * class.cs (Class.ApplyAttributeBuilder): Add error 641
2183         report.
2184         (Method.ApplyAttributeBuilder): Add error 685 report.
2185         (Operator.Define): Add error 564 report.
2186
2187         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
2188
2189         * expression.cs (Invocation.DoResolve): Add error
2190         245 and 250 report.
2191
2192         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
2193         error 674 report.
2194
2195 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2196
2197         * class.cs (ConstructorInitializer.Resolve):
2198         Wrong error number (515->516).
2199
2200 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2201
2202         * class.cs (Indexer.Define): Add error 631 report.
2203
2204 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2205
2206         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
2207
2208 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2209
2210         * expression.cs (Probe.DoResolve): Add error CS0241 report.
2211
2212 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
2213
2214         * cs-parser.jay: Added error CS0241 report.
2215
2216 2004-09-10  Raja R Harinath  <rharinath@novell.com>
2217
2218         * cs-parser.jay (fixed_statement): Introduce a scope for the
2219         declaration in the 'fixed' statement.
2220
2221 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2222
2223         * cs-parser.jay: Added CS0230 error report.
2224
2225 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2226
2227         * cs-parser.jay: Added errors CS0231 and CS0257 report.
2228
2229 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2230
2231         * expression.cs (Argument.Resolve): Added error CS0192 and
2232         CS0199 report.
2233
2234 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2235
2236         C# 2.0 #pragma warning feature
2237
2238         * cs-tokenizer.cs (PreProcessPragma): New method; 
2239         Handles #pragma directive.
2240
2241         * report.cs (WarningRegions): New class; Support
2242         class for #pragma warning directive. It tests whether
2243         warning is enabled for a given line.
2244
2245 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
2246
2247         * const.cs: Add more descriptive error report, tahnks to
2248         Sebastien. 
2249
2250 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
2251
2252         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
2253
2254 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
2255
2256         * expression.cs: Apply patch from Ben: Remove dead code from
2257         ArrayCreation, and remove the TurnintoConstant call in const.cs,
2258         as that code just threw an exception anwyays.
2259
2260         * const.cs: Remove the call to the turnintoconstant, for details
2261         see bug: #63144
2262         
2263         * literal.cs: The type of the null-literal is the null type;  So
2264         we use a placeholder type (literal.cs:System.Null, defined here)
2265         for it.
2266
2267         * expression.cs (Conditional.DoResolve): Remove some old code that
2268         is no longer needed, conversions have been fixed.
2269
2270         (ArrayCreationExpression.DoResolve): Return false if we fail to
2271         resolve the inner expression.
2272
2273 2004-09-07  Raja R Harinath  <rharinath@novell.com>
2274
2275         Fix test-290.cs.
2276         * cs-parser.jay (delegate_declaration): Record a delegate
2277         declaration as a type declaration.
2278         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
2279
2280 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
2281
2282         * parameter.cs: Do not crash if the type can not be resolved. 
2283
2284         * expression.cs: Report errors with unsafe pointers, fixes #64896
2285
2286 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2287
2288         * expression.cs: Pointer arith always needs to do a conv.i
2289         if the operand is a long. fix 65320
2290
2291 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
2292
2293         Fixed cs0619-37.cs, cs0619-38.cs
2294
2295         * enum.cs (GetObsoleteAttribute): Removed.
2296
2297         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
2298         on Enum member is double staged. The first is tested member
2299         and then enum.
2300
2301 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
2302
2303         Fixed #56986, #63631, #65231
2304
2305         * class.cs: (TypeContainer.AddToMemberContainer): New method,
2306         adds member to name container.
2307         (TypeContainer.AddToTypeContainer): New method, adds type to
2308         name container.
2309         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
2310         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
2311         AddOperator): Simplified by reusing AddToMemberContainer.
2312         (TypeContainer.UserDefinedStaticConstructor): Changed to property
2313         instead of field.
2314         (Method.CheckForDuplications): Fixed implementation to test all
2315         possibilities.
2316         (MemberBase): Detection whether member is explicit interface
2317         implementation is now in constructor.
2318         (MemberBase.UpdateMemberName): Handles IndexerName.
2319         (Accessor): Changed to keep also location information.
2320         (AbstractPropertyEventMethod): Is derived from MemberCore.
2321         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
2322         will be emited or not.
2323         (PropertyBase.AreAccessorsDuplicateImplementation):
2324         Tests whether accessors are not in collision with some method.
2325         (Operator): Is derived from MethodCore to simplify common
2326         operations.
2327
2328         * decl.cs (Flags.TestMethodDuplication): Test for duplication
2329         must be performed.
2330         (DeclSpace.AddToContainer): Adds the member to defined_names
2331         table. It tests for duplications and enclosing name conflicts.
2332
2333         * enum.cs (EnumMember): Clean up to reuse the base structures
2334
2335 2004-09-03  Martin Baulig  <martin@ximian.com>
2336
2337         Merged latest changes into gmcs.  Please keep this comment in
2338         here, it makes it easier for me to see what changed in MCS since
2339         the last time I merged.
2340
2341 2004-09-03  Martin Baulig  <martin@ximian.com>
2342
2343         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
2344         into TypeContainer, to make partial classes work again.
2345
2346 2004-09-03  Martin Baulig  <martin@ximian.com>
2347
2348         * rootcontext.cs (RootContext.V2): Removed.
2349
2350 2004-03-23  Martin Baulig  <martin@ximian.com>
2351
2352         * expression.cs (Invocation.OverloadResolve): Added `bool
2353         may_fail' argument and use it instead of the Location.IsNull() hack.
2354
2355 2004-09-09  Martin Baulig  <martin@ximian.com>
2356
2357         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
2358
2359 2004-09-09  Martin Baulig  <martin@ximian.com>
2360
2361         * generic.cs (TypeParameter.DefineType): Added support for
2362         explicit interface methods.
2363
2364 2004-09-09  Martin Baulig  <martin@ximian.com>
2365
2366         * README.Changes: New document.  Started to list important changes
2367         between MCS and GMCS here.
2368
2369 2004-09-08  Martin Baulig  <martin@ximian.com>
2370
2371         * class.cs
2372         (TypeContainer.CheckRecursiveDefinition): New protected method.
2373         (TypeContainer.DefineType): Move the CS0146 check into
2374         CheckRecursiveDefinition().     
2375
2376 2004-09-06  Martin Baulig  <martin@ximian.com>
2377
2378         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
2379         types for the constructor constraint.
2380
2381 2004-09-03  Martin Baulig  <martin@ximian.com>
2382
2383         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
2384         into TypeContainer, to make partial classes work again.
2385
2386 2004-09-03  Martin Baulig  <martin@ximian.com>
2387
2388         * rootcontext.cs (RootContext.V2): Removed.
2389
2390 2004-03-23  Martin Baulig  <martin@ximian.com>
2391
2392         * expression.cs (Invocation.OverloadResolve): Added `bool
2393         may_fail' argument and use it instead of the Location.IsNull() hack.
2394
2395 2004-09-03  Martin Baulig  <martin@ximian.com>
2396
2397         Merged latest changes into gmcs.  Please keep this comment in
2398         here, it makes it easier for me to see what changed in MCS since
2399         the last time I merged.
2400
2401 2004-09-03  Raja R Harinath  <rharinath@novell.com>
2402
2403         Fix #61128.
2404         * expression.cs (BetterConversion): Don't allow either conversion 
2405         to be null.  Remove redundant implicit conversion test when 'q ==
2406         null' -- when this function is invoked, we already know that the
2407         implicit conversion exists.
2408         (BetterFunction): Assume that 'best' is non-null.  Remove
2409         redundant reimplementation of IsApplicable when 'best' is null.
2410         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
2411         number of arguments.
2412         (IsAncestralType): Extract from OverloadResolve.
2413         (OverloadResolve): Make robust to the MethodGroupExpr being
2414         unsorted.  Implement all the logic of Section 14.5.5.1, and
2415         support overloading of methods from multiple applicable types.
2416         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
2417
2418         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
2419         (RealError, Warning): Append type of report to related symbol.
2420
2421 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
2422
2423         * enum.cs: Fixed CLS-Compliance checks for enum members.
2424         Error tests cs3008-8.cs, cs3014-8.cs
2425
2426 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
2427
2428         Fixed bug #62342, #63102
2429         * class.cs: ImplementIndexer uses member.IsExplicitImpl
2430         like ImplementMethod.
2431
2432 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
2433
2434         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2435         Fixed bug #65170.
2436
2437 2004-09-02  Martin Baulig  <martin@ximian.com>
2438
2439         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
2440         TypeManager.GetArgumentTypes() rather than calling GetParameters()
2441         on the MethodBase.
2442
2443 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
2444
2445         C# 2.0 Static classes implemented
2446
2447         * class.cs (TypeContainer): instance_constructors,
2448         initialized_fields, initialized_static_fields,
2449         default_constructor, base_inteface_types are protected to be
2450         accessible from StaticClass.
2451         (TypeContainer.DefineDefaultConstructor): New virtual method
2452         for custom default constructor generating
2453         (StaticClass): New class to handle "Static classes" feature.
2454
2455         * cs-parser.jay: Handle static keyword on class like instance
2456         of StaticClass.
2457
2458         * driver.cs: Added "/langversion" command line switch with two
2459         options (iso-1, default).
2460
2461 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
2462
2463         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
2464
2465 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
2466
2467         * delegate.cs: Style.
2468
2469 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2470
2471         * delegate.cs: Add seperate instance expr field for miguel.
2472
2473 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2474
2475         * PointerArithmetic (Resolve): make sure we are not doing
2476         pointer arith on void*. Also, make sure we are resolved
2477         by not setting eclass until resolve.
2478
2479         All callers: Make sure that PointerArithmetic gets resolved.
2480
2481 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2482
2483         * ArrayCreation (LookupType): If the type does not resolve 
2484         to an array, give an error.
2485
2486 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
2487
2488         * statement.cs (Try.Resolve): Fixed bug #64222
2489
2490 2004-08-27  Martin Baulig  <martin@ximian.com>
2491
2492         * class.cs
2493         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
2494         crash here.     
2495
2496 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2497
2498         * ecore.cs (Constantify): Get underlying type via
2499         System.Enum.GetUnderlyingType to avoid StackOverflow on the
2500         Windows in special cases.
2501
2502 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2503
2504         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
2505         for obtaining also private methods.
2506         (GetRemoveMethod): Used GetRemoveMethod (true)
2507         for obtaining also private methods.
2508
2509 2004-09-02  Martin Baulig  <martin@ximian.com>
2510
2511         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
2512         TypeManager.GetArgumentTypes() rather than calling GetParameters()
2513         on the MethodBase.
2514
2515 2004-08-27  Martin Baulig  <martin@ximian.com>
2516
2517         * class.cs
2518         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
2519         crash here.     
2520
2521 2004-08-25  Martin Baulig  <martin@ximian.com>
2522
2523         * support.cs (ReflectionParameters..ctor): If this is a generic
2524         method, retrieve and store its type parameters.
2525         (InternalParameters..ctor): Added `TypeParameter[]' argument.
2526         (ReflectionParameters.GenericConstraints): The argument specifies
2527         the type parameter, not the method parameter.
2528         (InternalParameters.GenericConstraints): Likewise.
2529
2530         * generic.cs (TypeParameter.DefineType): Correctly handle
2531         constraints wrt. generic methods in interfaces and their
2532         implementations.        
2533
2534 2004-08-24  Martin Baulig  <martin@ximian.com>
2535
2536         * generic.cs (TypeParameter.IsSubclassOf): New public method.
2537         (Constraints.IsSubclassOf): New internal method.
2538
2539         * typemanager.cs (TypeManager.FindMembers): Added special support
2540         for GenericTypeParameterBuilder's.      
2541         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
2542         type parameters.
2543
2544 2004-08-24  Martin Baulig  <martin@ximian.com>
2545
2546         * typemanager.cs
2547         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
2548         this for accessibility checks.
2549         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
2550         IsNestedFamilyAccessible.
2551         (TypeManager.IsSubclassOf): New method, do what the name actually
2552         says.   
2553
2554 2004-08-24  Martin Baulig  <martin@ximian.com>
2555
2556         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
2557         as a SimpleName, include the generic arity.
2558
2559 2004-08-24  Martin Baulig  <martin@ximian.com>
2560
2561         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
2562         MethodAttributes.HideBySig for operators.
2563
2564 2004-08-23  Martin Baulig  <martin@ximian.com>
2565
2566         Back to the old error reporting system :-)
2567
2568         * report.cs (Message): Removed.
2569         (Report.MessageData, ErrorData, WarningData): Removed.
2570         (Report.Error, Warning): Back to the old system.
2571
2572 2004-08-23  Martin Baulig  <martin@ximian.com>
2573
2574         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
2575
2576         * class.cs (TypeContainer.ParentContainer): New public virtual
2577         method; replaces the explicit interface implementation.
2578         (ClassPart.ParentContainer): Override.
2579
2580 2004-08-23  Martin Baulig  <martin@ximian.com>
2581
2582         * statement.cs (Switch): Added support for constant switches; see
2583         #59428 or test-285.cs.
2584
2585 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2586
2587         Fixed bug #62740.
2588         * statement.cs (GetEnumeratorFilter): Removed useless
2589         logic because C# specs is strict. GetEnumerator must be
2590         public.
2591
2592 2004-08-22  Martin Baulig  <martin@ximian.com>
2593
2594         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2595         a switch and may break, reset the barrier.  Fixes #59867.
2596
2597 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2598
2599         CLS-Compliance speed up (~5% for corlib)
2600
2601         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
2602         New method. Tests container for CLS-Compliant names
2603
2604         * class.cs (TypeContainer.VerifyClsName): New method.
2605         Checks whether container name is CLS Compliant.
2606         (Constructor): Implements IMethodData.
2607
2608         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
2609         low-case table for CLS Compliance test.
2610         (MemberCache.VerifyClsParameterConflict): New method.
2611         Checks method parameters for CS3006 error.
2612
2613         * enum.cs (EnumMember): Is derived from MemberCore.
2614         (Enum.VerifyClsName): Optimized for better performance.
2615
2616 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2617
2618         * report.cs: Renamed Error_T to Error and changed all
2619         references.
2620
2621 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2622
2623         * class.cs (TypeContainer.IndexerArrayList): New inner class
2624         container for indexers.
2625         (TypeContainer.DefaultIndexerName): New constant for default
2626         indexer name. Replaced all "Item" with this constant.
2627         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
2628
2629         * typemanager.cs (TypeManager.default_member_ctor): Cache here
2630         DefaultMemberAttribute constructor.
2631
2632 2004-08-05  Martin Baulig  <martin@ximian.com>
2633
2634         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
2635         Fix bug #59429.
2636
2637 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
2638
2639         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
2640         multi platforms problem.
2641
2642         * compiler.csproj: Included shared files.
2643
2644 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2645
2646         Fix bug 60333, 55971 in the more general way
2647         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2648         Added arg_type argument for constant conversion.
2649         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
2650
2651 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2652
2653         Fix bug #59760
2654         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
2655         OperatorArrayList, MethodCoreArrayList for typecontainer
2656         containers. Changed class member types to these new types.
2657         (MethodArrayList.DefineMembers): Added test for CS0659.
2658
2659 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
2660
2661         * cfold.cs: Synchronize the folding with the code in expression.cs
2662         Binary.DoNumericPromotions for uint operands.
2663
2664         * attribute.cs: Revert patch from Raja, it introduced a regression
2665         while building Blam-1.2.1 (hard to isolate a test case).
2666
2667 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2668
2669         Fix for #55382
2670         * class.cs:
2671         (TypeContainer.Define): Renamed to DefineContainerMembers because of
2672         name collision.
2673         (MethodCore.parent_method): New member. The method we're overriding
2674         if this is an override method.
2675         (MethodCore.CheckBase): Moved from Method class and made common.
2676         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
2677         private.
2678         (MethodCore.CheckForDuplications): New abstract method. For custom
2679         member duplication search in a container
2680         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
2681         method and its return type.
2682         (Event.conflict_symbol): New member. Symbol with same name in the
2683         parent class.
2684
2685         * decl.cs:
2686         (MemberCache.FindMemberWithSameName): New method. The method
2687         is looking for conflict with inherited symbols.
2688
2689 2004-08-04  Martin Baulig  <martin@ximian.com>
2690
2691         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
2692
2693         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
2694
2695 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2696
2697         * report.cs (Message): New enum for better error, warning reference in
2698         the code.
2699         (MessageData): New inner abstract class. It generally handles printing of
2700         error and warning messages.
2701         Removed unused Error, Warning, Message methods.
2702
2703 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2704
2705         Fix for cs0592-8.cs test
2706         * attribute.cs
2707         (Attributable.ValidAttributeTargets): Made public.
2708         (Attribute.ExplicitTarget): New member for explicit target value.
2709         (Attribute.CheckTargets): Now we translate explicit attribute
2710         target to Target here.
2711
2712 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
2713
2714         * ecore.cs (MethodGroupExpr): new IsBase property.
2715
2716         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
2717
2718         * delegate.cs (DelegateCreation): store a MethodGroupExpr
2719         rather than an instance expr.
2720
2721         (DelegateCreation.Emit): Use the method group rather than
2722         the instance expression. Also, if you have base.Foo as the
2723         method for a delegate, make sure to emit ldftn, not ldftnvirt.
2724
2725         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
2726
2727         (NewDelegate.DoResolve): Only check for the existance of Invoke
2728         if the method is going to be needed. Use MethodGroupExpr.
2729
2730         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
2731
2732         * expression.cs: For pointer arith., make sure to use
2733         the size of the type, not the size of the pointer to
2734         the type.
2735
2736 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2737
2738         Fix for #60722
2739         * class.cs (Class): Added error CS0502 test.
2740
2741 2004-08-03  John Luke  <jluke@cfl.rr.com>
2742             Raja R Harinath  <rharinath@novell.com>
2743
2744         Fix for #60997.
2745         * attribute.cs (Attribute.complained_before): New flag.
2746         (Attribute.ResolveType, Attribute.Resolve),
2747         (Attribute.DefinePInvokeMethod): Set it.
2748         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
2749         
2750 2004-08-03  Martin Baulig  <martin@ximian.com>
2751
2752         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
2753         use a user-defined operator; we still need to do numeric
2754         promotions in case one argument is a builtin type and the other
2755         one has an implicit conversion to that type.  Fixes #62322.
2756
2757 2004-08-18  Martin Baulig  <martin@ximian.com>
2758
2759         * class.cs (Method.Define): Use the correct method name when
2760         creating the MethodBuilder for a generic method.
2761
2762 2004-08-17  Martin Baulig  <martin@ximian.com>
2763
2764         * generic.cs (Constraints): Support type parameter constraints.
2765
2766 2004-08-16  Martin Baulig  <martin@ximian.com>
2767
2768         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
2769         (Token.GENERIC_DIMENSION): New token; this is returned if we
2770         encounter an unbound generic type in a typeof() expression.
2771
2772         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
2773         this token is only generated while parsing a typeof() expression.
2774         (typeof_expression): Removed the old unbound_type hack.
2775
2776         * generic.cs (TypeArguments.IsUnbound): New public property.
2777
2778         * decl.cs (MemberName): Added support for unbound types.
2779
2780 2004-08-14  Martin Baulig  <martin@ximian.com>
2781
2782         * typemanager.cs
2783         (TypeManager.IsEqualGenericInstance): New static method.
2784         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
2785         just used to check accessibility, so follow the rules of 26.1.6.        
2786
2787         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
2788         ConstructedType instead of a TypeExpression if we have type arguments.
2789
2790         * cs-parser.jay (typeof_expression): Support unbound generic types.
2791
2792         * ecore.cs (UnboundTypeExpression): New public class.
2793
2794 2004-08-12  Martin Baulig  <martin@ximian.com>
2795
2796         * typemanager.cs (TypeManager.IsNestedChildOf): Use
2797         TypeManager.IsEqual() rather than `=='.
2798
2799         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
2800         generic instances as well.
2801
2802 2004-08-12  Martin Baulig  <martin@ximian.com>
2803
2804         * expression.cs (Invocation.InferType): We can only infer method
2805         type parameters.  Fixes #62647.
2806
2807 2004-08-11  Martin Baulig  <martin@ximian.com>
2808
2809         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
2810         before resolving the base classes.
2811
2812 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
2813
2814         * Makefile: install .mdb file too.
2815
2816 2004-08-05  Martin Baulig  <martin@ximian.com>
2817
2818         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
2819         initializer, the current type is just the TypeBuilder, not the
2820         instantiated generic type.
2821         (FieldExpr.IsFieldInitializer): New public property.
2822
2823 2004-08-04  Martin Baulig  <martin@ximian.com>
2824
2825         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
2826
2827         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
2828
2829 2004-08-03  Martin Baulig  <martin@ximian.com>
2830
2831         * class.cs (MethodData.Define): If we're an explicit
2832         implementation, remove the generic arity from the type name.
2833
2834 2004-08-03  Martin Baulig  <martin@ximian.com>
2835
2836         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
2837         use a user-defined operator; we still need to do numeric
2838         promotions in case one argument is a builtin type and the other
2839         one has an implicit conversion to that type.  Fixes #62322.
2840
2841 2004-08-02  Martin Baulig  <martin@ximian.com>
2842
2843         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
2844         `TypeExpr[]' array.
2845         (TypeContainer.GetClassBases): Return the unexpanded list of
2846         interfaces; we expand them later.
2847         (TypeContainer.DefineType): After creating the TypeBuilder, call
2848         TypeManager.ExpandInterfaces() to get an expanded and resolved
2849         list of interfaces.
2850
2851         * ecore.cs (TypeExpr.GetInterfaces): Removed
2852
2853         * generics.cs (Constraints.InterfaceConstraints): Remove.
2854         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
2855         register the interface constraints.
2856
2857         * typemanager.cs
2858         (TypeManager.AddUserType): Removed the `ifaces' argument.
2859         (TypeManager.AddTypeParameter): Likewise.
2860         (TypeManager.AddUserInterface): Removed, was unused.
2861         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
2862         `TypeExpr[]' array for the interfaces.
2863         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
2864         has been defined, returns a list of the resolved interfaces types.
2865         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
2866         (TypeManager.GetExplicitInterfaces): Likewise.  
2867
2868 2004-08-02  Martin Baulig  <martin@ximian.com>
2869
2870         * expression.cs (Invocation.EmitCall): If we're invoking a method
2871         on a type parameter, use the new `Constrained' prefix opcode.
2872
2873 2004-08-02  Martin Baulig  <martin@ximian.com>
2874
2875         * statement.cs (LocalInfo.Flags): Added `IsThis'.
2876         (LocalInfo.IsThis): New public property.
2877         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
2878
2879 2004-08-01  Martin Baulig  <martin@ximian.com>
2880
2881         * class.cs (TypeContainer.GetClassBases): Don't set the default
2882         here since we may get called from GetPartialBases().
2883         (TypeContainer.DefineType): If GetClassBases() didn't return a
2884         parent, use the default one.
2885
2886 2004-07-30  Martin Baulig  <martin@ximian.com>
2887
2888         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
2889
2890         * class.cs (SourceMethod): New public class, derive from the
2891         symbol writer's ISourceMethod.
2892         (Method): Use the new symbol writer API.
2893
2894         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
2895         as argument and use the new symbol writer.
2896
2897         * location.cs
2898         (SourceFile): Implement the symbol writer's ISourceFile.
2899         (Location.SymbolDocument): Removed.
2900         (Location.SourceFile): New public property.
2901
2902         * symbolwriter.cs: Use the new symbol writer API.
2903
2904 2004-07-30  Raja R Harinath  <rharinath@novell.com>
2905
2906         * Makefile (install-local): Remove.  Functionality moved to
2907         executable.make.
2908
2909 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
2910
2911         * Makefile: Install mcs.exe.config file together with mcs.exe.
2912         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
2913         correct runtime version.
2914         
2915 2004-07-25  Martin Baulig  <martin@ximian.com>
2916
2917         * class.cs
2918         (TypeContainer.RegisterOrder): Removed, this was unused.
2919         (TypeContainer, interface_order): Removed.
2920         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
2921         TypeContainer as argument since we can also be called with a
2922         `PartialContainer' for a partial class/struct/interface.
2923         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
2924         of checking whether we're an `Interface' - we could be a
2925         `PartialContainer'.
2926         (PartialContainer.Register): Override; call
2927         AddClass()/AddStruct()/AddInterface() on our parent.
2928
2929         * cs-parser.jay (interface_member_declaration): Add things to the
2930         `current_container', not the `current_class'.
2931
2932         * rootcontext.cs (RegisterOrder): The overloaded version which
2933         takes an `Interface' was unused, removed.
2934
2935         * typemanager.cs (TypeManager.LookupInterface): Return a
2936         `TypeContainer', not an `Interface'.
2937         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
2938         contain a `PartialContainer' for an interface, so check it's
2939         `Kind' to figure out what it is.
2940
2941 2004-07-25  Martin Baulig  <martin@ximian.com>
2942
2943         * class.cs (Class.DefaultTypeAttributes): New public constant.
2944         (Struct.DefaultTypeAttributes): Likewise.
2945         (Interface.DefaultTypeAttributes): Likewise.
2946         (PartialContainer.TypeAttr): Override this and add the
2947         DefaultTypeAttributes.
2948
2949 2004-07-25  Martin Baulig  <martin@ximian.com>
2950
2951         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
2952         we can just use the `Parent' field instead.
2953
2954 2004-07-25  Martin Baulig  <martin@ximian.com>
2955
2956         * class.cs (TypeContainer.Emit): Renamed to EmitType().
2957
2958 2004-07-25  Martin Baulig  <martin@ximian.com>
2959
2960         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
2961         our parts before defining any methods.
2962         (TypeContainer.VerifyImplements): Make this virtual.
2963         (ClassPart.VerifyImplements): Override and call VerifyImplements()
2964         on our PartialContainer.
2965
2966 2004-07-25  Martin Baulig  <martin@ximian.com>
2967
2968         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
2969
2970         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
2971         argument, we can just use the `Parent' field instead.
2972
2973         * class.cs
2974         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
2975         (MemberBase.DoDefine): Likewise.
2976
2977 2004-07-24  Martin Baulig  <martin@ximian.com>
2978
2979         * decl.cs (MemberCore.Parent): New public field.
2980         (DeclSpace.Parent): Moved to MemberCore.
2981
2982         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
2983         (MemberBase.ctor): Added TypeContainer argument, pass it to our
2984         parent's .ctor.
2985         (FieldBase, Field, Operator): Likewise.
2986         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
2987         (EventField, Event): Likewise.
2988
2989 2004-07-23  Martin Baulig  <martin@ximian.com>
2990
2991         * class.cs (PartialContainer): New public class.
2992         (ClassPart): New public class.
2993         (TypeContainer): Added support for partial classes.
2994         (TypeContainer.GetClassBases): Splitted some of the functionality
2995         out into GetNormalBases() and GetPartialBases().
2996
2997         * cs-tokenizer.cs (Token.PARTIAL): New token.
2998         (Tokenizer.consume_identifier): Added some hacks to recognize
2999         `partial', but only if it's immediately followed by `class',
3000         `struct' or `interface'.
3001
3002         * cs-parser.jay: Added support for partial clases.
3003
3004 2004-07-23  Martin Baulig  <martin@ximian.com>
3005
3006         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
3007         a `DeclSpace' and also made it readonly.
3008         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
3009         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
3010         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
3011
3012         * cs-parser.jay: Pass the `current_class', not the
3013         `current_container' (at the moment, this is still the same thing)
3014         to a new Method, Property, Event, Indexer or Constructor.
3015
3016 2004-07-23  Martin Baulig  <martin@ximian.com>
3017
3018         * cs-parser.jay (CSharpParser): Added a new `current_class' field
3019         and removed the `current_interface' one.
3020         (struct_declaration, class_declaration, interface_declaration):
3021         Set `current_class' to the newly created class/struct/interface;
3022         set their `Bases' and call Register() before parsing their body.
3023
3024 2004-07-23  Martin Baulig  <martin@ximian.com>
3025
3026         * class.cs (Kind): New public enum.
3027         (TypeContainer): Made this class abstract.
3028         (TypeContainer.Kind): New public readonly field.
3029         (TypeContainer.CheckDef): New public method; moved here from
3030         cs-parser.jay.
3031         (TypeContainer.Register): New public abstract method.
3032         (TypeContainer.GetPendingImplementations): New public abstract
3033         method.
3034         (TypeContainer.GetClassBases): Removed the `is_class' and
3035         `is_iface' parameters.
3036         (TypeContainer.DefineNestedTypes): Formerly known as
3037         DoDefineType().
3038         (ClassOrStruct): Made this class abstract.
3039
3040         * tree.cs (RootTypes): New public type. 
3041
3042 2004-07-20  Martin Baulig  <martin@ximian.com>
3043
3044         * tree.cs (Tree.RecordNamespace): Removed.
3045         (Tree.Namespaces): Removed.
3046
3047         * rootcontext.cs (RootContext.IsNamespace): Removed.
3048
3049         * cs-parser.jay (namespace_declaration): Just create a new
3050         NamespaceEntry here.
3051
3052 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
3053
3054         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
3055         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
3056         entry to make sure it runs in the correct runtime version.
3057         
3058 2004-07-18  Martin Baulig  <martin@ximian.com>
3059
3060         * generic.cs (ConstructedType.CheckConstraints): Improved
3061         constraints checking.
3062
3063 2004-07-18  Martin Baulig  <martin@ximian.com>
3064
3065         * expression.cs (Invocation.BetterMethod): Call
3066         TypeManager.TypeToCoreType() on all types and removed my previous
3067         hack; we're already doig the right thing here.
3068
3069 2004-07-17  Martin Baulig  <martin@ximian.com>
3070
3071         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
3072
3073 2004-07-16  Martin Baulig  <martin@ximian.com>
3074
3075         * iterators.cs: Added generics support.
3076
3077 2004-07-16  Martin Baulig  <martin@ximian.com>
3078
3079         * iterators.cs: Rewrote this.  We're now using one single Proxy
3080         class for both the IEnumerable and the IEnumerator interface and
3081         `Iterator' derives from Class so we can use the high-level API.
3082
3083         * class.cs (TypeContainer.AddIterator): New method.
3084         (TypeContainer.DoDefineType): New protected virtual method, which
3085         is called from DefineType().
3086         (TypeContainer.DoDefineMembers): Call DefineType() and
3087         DefineMembers() on all our iterators.
3088         (TypeContainer.Emit): Call Emit() on all our iterators.
3089         (TypeContainer.CloseType): Call CloseType() on all our iterators.
3090
3091         * codegen.cs (EmitContext.CurrentIterator): New public field.
3092
3093 2004-07-15  Martin Baulig  <martin@ximian.com>
3094
3095         * typemanager.cs
3096         (TypeManager.not_supported_exception_type): New type.   
3097
3098 2004-07-14  Martin Baulig  <martin@ximian.com>
3099
3100         * typemanager.cs
3101         (TypeManager.generic_ienumerable_type): New type.
3102         (TypeManager.generic_ienumerator_type): New type.
3103
3104         * rootcontext.cs
3105         (RootContext.interfaces_first_stage): Added
3106         "System.Collections.Generic.IEnumerator`1" and
3107         "System.Collections.Generic.IEnumerable`1".     
3108
3109 2004-07-14  Martin Baulig  <martin@ximian.com>
3110
3111         * iterators.cs: Use real error numbers.
3112
3113 2004-07-14  Martin Baulig  <martin@ximian.com>
3114
3115         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
3116         requires this to be a System.Collection.IEnumerable and not a
3117         class implementing that interface.
3118         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
3119
3120 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
3121
3122         * class.cs: Fixed previous fix, it broke some error tests.
3123
3124 2004-07-12  Martin Baulig  <martin@ximian.com>
3125
3126         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
3127         Fixes #61293.
3128
3129 2004-07-14  Martin Baulig  <martin@ximian.com>
3130
3131         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
3132         an exclamation mark (!) for the generic arity to reflect the
3133         latest spec changes; ie. use "System.Collections.Generic.IList`1".
3134
3135 2004-07-13  Martin Baulig  <martin@ximian.com>
3136
3137         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
3138         specifiers being part of a type argument.
3139
3140 2004-07-13  Martin Baulig  <martin@ximian.com>
3141
3142         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
3143         name for generic types.
3144
3145 2004-07-13  Martin Baulig  <martin@ximian.com>
3146
3147         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
3148         bit to fix #60119.
3149
3150 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
3151
3152         * assign.cs (LocalTemporary): Add new argument: is_address,If
3153         `is_address' is true, then the value that we store is the address
3154         to the real value, and not the value itself.
3155         
3156         * ecore.cs (PropertyExpr): use the new local temporary
3157         stuff to allow us to handle X.Y += z (where X is a struct)
3158
3159 2004-07-08  Martin Baulig  <martin@ximian.com>
3160
3161         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
3162         not always return, just like we're doing in Using.Resolve().
3163
3164 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
3165
3166         * cs-parser.jay (fixed_statement): flag this as Pinned.
3167
3168 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
3169
3170         * typemanager.cs (TypeManager): Removed MakePinned method, this
3171         mechanism is replaced with the .NET 2.x compatible mechanism of
3172         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
3173
3174         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
3175         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
3176         `IsFixed' property which has a different meaning.
3177
3178 2004-07-02  Raja R Harinath  <rharinath@novell.com>
3179
3180         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
3181         visible from inside a nested class, not just the names of the
3182         immediately enclosing class.
3183         Fix for bug #60730.
3184
3185 2004-06-24  Raja R Harinath  <rharinath@novell.com>
3186
3187         * expression.cs (BetterConversion): Remove buggy special-case
3188         handling of "implicit constant expression conversions".  At this
3189         point, we already know that the conversion is possible -- we're
3190         only checking to see which is better.
3191
3192 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3193
3194         * cs-parser.jay: Added error CS0210 test.
3195
3196 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3197
3198         * cs-parser.jay: Added error CS0134 test.
3199
3200 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3201
3202         Fix bug #52507
3203         * cs-parser.jay: Added error CS0145 test.
3204
3205 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3206
3207         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
3208
3209 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
3210         
3211         * expression.cs (StackAlloc.Resolve): The argument may not
3212         be a constant; deal with this case.
3213         
3214 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
3215
3216         * attribute.cs (IndexerName_GetIndexerName): Renamed to
3217         GetIndexerAttributeValue.
3218         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
3219
3220         * class.cs (Indexer.Define): Added error tests for CS0415,
3221         CS0609.
3222
3223 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
3224
3225         * attribute.cs (Attribute.Resolve): Keep field code in sync with
3226         property code.
3227
3228 2004-06-23  Martin Baulig  <martin@ximian.com>
3229
3230         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
3231         neither return nor throw, reset the barrier as well.  Fixes #60457.
3232
3233 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
3234
3235         * class.cs : EventAttributes is now set to None by default.
3236           This fixes bug #60459.
3237
3238 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
3239
3240         Fix bug #60219
3241         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
3242         Don't throw exception but return null (it's sufficient now).
3243
3244 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
3245
3246         * typemanager.cs (GetArgumentTypes): Faster implementation.
3247
3248 2004-06-18  Martin Baulig  <martin@ximian.com>
3249
3250         * attribute.cs (Attribute.Resolve): Check whether we're an
3251         EmptyCast which a Constant child.  Fixes #60333.
3252
3253 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
3254
3255         * statement.cs (EmitCollectionForeach): Account for the fact that
3256         not all valuetypes are in areas which we can take the address of.
3257         For these variables, we store to a temporary variable. Also, make
3258         sure that we dont emit a `callvirt' on a valuetype method.
3259
3260 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3261
3262         * expression.cs (StackAlloc.DoReSolve): Added test for
3263         negative parameter (CS0247).
3264
3265 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3266
3267         Fix bug #59792
3268         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
3269
3270 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3271
3272         Fix bug #59781
3273         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
3274         ulong.
3275
3276 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
3277
3278         Fix bug #58254 & cs1555.cs, cs1556.cs
3279         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
3280
3281 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
3282
3283         * cs-parser.jay: Added error CS1669 test for indexers.
3284
3285 2004-06-18  Martin Baulig  <martin@ximian.com>
3286
3287         * generics.cs (GenericMethod.ctor): Don't take an Attributes
3288         argument.  Fixes #60441.
3289
3290 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
3291         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
3292         The name needs to have the actual name of the method in order
3293         for other tests (such as the one in OverloadResolve for Invoke
3294         on a delegate) to work. As well, it does not really help
3295         error reporting because the method group had multiple methods.
3296         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
3297         Make profiling work.
3298         
3299 2004-06-13  Martin Baulig  <martin@ximian.com>
3300
3301         * cs-parser.jay: Don't allow generic attributes.
3302
3303 2004-06-13  Martin Baulig  <martin@ximian.com>
3304
3305         * class.cs (MemberBase.DoDefineBase): New protected method.
3306         (MemberBase.DoDefine): Compute the `flags' in the new
3307         DoDefineBase() which must be called first.
3308         (Method.Define): Call DoDefineBase() first so we have the flags
3309         when defining the generic method.
3310
3311         * cs-parser.jay (interface_method_declaration): Support generic methods.
3312
3313 2004-06-13  Martin Baulig  <martin@ximian.com>
3314
3315         * decl.cs (TypeName): Removed.
3316         (MemberName): Removed TypeName and MemberNow; now we just have
3317         MemberName.
3318
3319         * cs-parser.jay: Don't distinguish between type arguments and type
3320         parameters in the grammar and simplified the rules a bit.  The
3321         reduce/reduce conflicts are now gone (except the one we inherited
3322         from mcs).
3323
3324 2004-06-11  Martin Baulig  <martin@ximian.com>
3325
3326         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
3327         call this twice: for params and varargs methods.
3328
3329 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
3330
3331         * class.cs:
3332         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
3333
3334 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
3335
3336         * attribute.cs (Attribute.GetValidTargets): Made public.
3337
3338         * class.cs: 
3339         (AbstractPropertyEventMethod): New class for better code sharing.
3340         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
3341         CS1667 report.
3342         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
3343
3344 2004-06-09  Martin Baulig  <martin@ximian.com>
3345
3346         * cs-parser.jay: Removed a reduce/reduce conflict.
3347
3348 2004-06-03  Martin Baulig  <martin@ximian.com>
3349
3350         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
3351         GetSimpleName() and return a SimpleName.
3352
3353         * ecore.cs (SimpleName.Arguments): New public field.
3354         (SimpleName): Added overloaded ctor which takes an additional
3355         TypeArguments argument.
3356         (SimpleName.SimpleNameResolve): Added support for generic methods.
3357         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
3358         formerly in MemberAccess.DoResolve(), but we also need it in
3359         SimpleNameResolve().
3360
3361         * expression.cs (MemberAccess.DoResolve): Use the new
3362         MethodGroupExpr.ResolveGeneric().       
3363
3364 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3365
3366         * decl.cs: If possible, use lookuptypedirect here. We can only do
3367         this if there is no `.' after the namespace. Avoids using
3368         LookupType, which does lots of slow processing.
3369         (FindNestedType) New method, does what it says :-).
3370         * namespace.cs: use LookupTypeDirect.
3371         * rootcontext.cs: use membercache, if possible.
3372         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
3373
3374 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3375
3376         * expression.cs:
3377         According to the spec, 
3378
3379         In a member access of the form E.I, if E is a single identifier,
3380         and if the meaning of E as a simple-name (§7.5.2) is a constant,
3381         field, property, localvariable, or parameter with the same type as
3382         the meaning of E as a type-name (§3.8), then both possible
3383         meanings of E are permitted.
3384
3385         We did not check that E as a simple-name had the same type as E as
3386         a type name.
3387
3388         This trivial check gives us 5-7% on bootstrap time.
3389
3390 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3391
3392         * expression.cs (Invocation.OverloadResolve): Avoid the
3393         use of hashtables and boxing here by allocating on demand.
3394
3395 2004-05-30  Martin Baulig  <martin@ximian.com>
3396
3397         * rootcontext.cs (RootContext.LookupType): Don't cache things if
3398         we're doing a silent lookup.  Don't try to lookup nested types in
3399         TypeManager.object_type (thanks to Ben Maurer).
3400
3401 2004-05-30  Martin Baulig  <martin@ximian.com>
3402
3403         Committing a patch from Ben Maurer.
3404
3405         * rootcontext.cs (RootContext.LookupType): Cache negative results.
3406
3407 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3408
3409         * convert.cs: add a trivial cache for overload operator resolution.
3410
3411 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
3412
3413         * attribute.cs
3414         (AttributeTester.GetObsoleteAttribute): Returns instance of
3415         ObsoleteAttribute when type is obsolete.
3416
3417         * class.cs
3418         (TypeContainer.VerifyObsoleteAttribute): Override.
3419         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
3420         (MethodCode.VerifyObsoleteAttribute): Override.
3421         (MemberBase.VerifyObsoleteAttribute): Override.
3422
3423         * decl.cs
3424         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
3425         and report proper error.
3426
3427         *delegate.cs
3428         (Delegate.VerifyObsoleteAttribute): Override.
3429
3430         * ecore.cs
3431         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
3432         and report proper error.
3433         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
3434
3435         * enum.cs
3436         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
3437         and enum member.
3438
3439         * expression.cs
3440         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
3441         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
3442         Added test for ObsoleteAttribute.
3443
3444         * statement.cs
3445         (Catch): Derived from Statement.
3446
3447 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3448
3449         * decl.cs: If possible, use lookuptypedirect here. We can only do
3450         this if there is no `.' after the namespace. Avoids using
3451         LookupType, which does lots of slow processing.
3452         (FindNestedType) New method, does what it says :-).
3453         * namespace.cs: use LookupTypeDirect.
3454         * rootcontext.cs: use membercache, if possible.
3455         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
3456
3457 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3458
3459         * expression.cs:
3460         According to the spec, 
3461
3462         In a member access of the form E.I, if E is a single identifier,
3463         and if the meaning of E as a simple-name (§7.5.2) is a constant,
3464         field, property, localvariable, or parameter with the same type as
3465         the meaning of E as a type-name (§3.8), then both possible
3466         meanings of E are permitted.
3467
3468         We did not check that E as a simple-name had the same type as E as
3469         a type name.
3470
3471         This trivial check gives us 5-7% on bootstrap time.
3472
3473 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
3474
3475         Fixed bug #59071 & cs0160.cs
3476         * statement.cs (Try.Resolve): Check here whether order of catch
3477         clauses matches their dependencies.
3478
3479 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
3480
3481         Fixed bug #58624
3482         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
3483         unsafe type.
3484
3485 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3486
3487         * expression.cs (Invocation.OverloadResolve): Avoid the
3488         use of hashtables and boxing here by allocating on demand.
3489
3490 2004-05-30  Martin Baulig  <martin@ximian.com>
3491
3492         * rootcontext.cs (RootContext.LookupType): Don't cache things if
3493         we're doing a silent lookup.  Don't try to lookup nested types in
3494         TypeManager.object_type (thanks to Ben Maurer).
3495
3496 2004-05-30  Martin Baulig  <martin@ximian.com>
3497
3498         Committing a patch from Ben Maurer.
3499
3500         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
3501
3502 2004-05-29  Martin Baulig  <martin@ximian.com>
3503
3504         * class.cs (IMethodData.ShouldIgnore): New method.
3505
3506         * typemanager.cs (TypeManager.MethodFlags): Don't take a
3507         `Location' argument, we don't need it anywhere.  Use
3508         `IMethodData.ShouldIgnore ()' instead of
3509         `MethodData.GetMethodFlags ()'.
3510         (TypeManager.AddMethod): Removed.
3511         (TypeManager.AddMethod2): Renamed to AddMethod.
3512
3513 2004-05-29  Martin Baulig  <martin@ximian.com>
3514
3515         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
3516
3517         * convert.cs (Convert.ImplicitReferenceConversion): If we're
3518         converting from a class type S to an interface type and we already
3519         have an object on the stack, don't box it again.  Fixes #52578.
3520
3521 2004-05-29  Martin Baulig  <martin@ximian.com>
3522
3523         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
3524         Added support for `params' parameters.  Fixes #59267.
3525
3526 2004-05-29  Martin Baulig  <martin@ximian.com>
3527
3528         * literal.cs (NullPointer): Provide a private .ctor which sets
3529         `type' to TypeManager.object_type.  Fixes #59048.
3530
3531 2004-05-29  Martin Baulig  <martin@ximian.com>
3532
3533         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
3534         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
3535
3536         * ecore.cs (EventExpr.instance_expr): Make the field private.
3537
3538 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
3539
3540         Fixed bug #50080 & cs0214-2.cs
3541         * expression.cs (Cast.DoResolve): Check unsafe context here.
3542         
3543         * statement.cs (Resolve.DoResolve): Likewise.
3544
3545 2004-05-26  Martin Baulig  <martin@ximian.com>
3546
3547         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
3548
3549         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
3550         (RootContext.LookupType): Pass down the `silent' flag.
3551
3552 2004-05-25  Martin Baulig  <martin@ximian.com>
3553
3554         * expression.cs
3555         (MethodGroupExpr.IdenticalTypeName): New public property.
3556         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
3557         expression actually refers to a type.
3558
3559 2004-05-25  Martin Baulig  <martin@ximian.com>
3560
3561         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
3562         for #56176 and made it actually work.
3563
3564 2004-05-25  Martin Baulig  <martin@ximian.com>
3565
3566         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
3567         (FieldExpr, PropertyExpr): Override and implement
3568         CacheTemporaries.  Fixes #52279.
3569
3570 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
3571
3572         * location.cs: In the new compiler listing a file twice is a
3573         warning, not an error.
3574
3575 2004-05-24  Martin Baulig  <martin@ximian.com>
3576
3577         * enum.cs (Enum.DefineType): For the `BaseType' to be a
3578         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
3579
3580 2004-05-24  Martin Baulig  <martin@ximian.com>
3581
3582         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
3583         walking the `using' list.  Fixes #53921.
3584
3585 2004-05-24  Martin Baulig  <martin@ximian.com>
3586
3587         * const.cs (Const.LookupConstantValue): Added support for
3588         EmptyCast's; fixes #55251.
3589
3590 2004-05-24  Martin Baulig  <martin@ximian.com>
3591
3592         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
3593         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
3594         which does the CS0135 check.  The reason is that we first need to
3595         check whether the variable actually exists.
3596
3597 2004-05-24  Martin Baulig  <martin@ximian.com>
3598
3599         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
3600         than RootContext.LookupType() to find the explicit interface
3601         type.  Fixes #58584.
3602
3603 2004-05-24  Raja R Harinath  <rharinath@novell.com>
3604
3605         * Makefile: Simplify.  Use executable.make.
3606         * mcs.exe.sources: New file.  List of sources of mcs.exe.
3607
3608 2004-05-24  Anders Carlsson  <andersca@gnome.org>
3609
3610         * decl.cs:
3611         * enum.cs:
3612         Use the invariant culture when doing String.Compare for CLS case
3613         sensitivity.
3614         
3615 2004-05-23  Martin Baulig  <martin@ximian.com>
3616
3617         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
3618         don't have any dots.  Fixes #52622, added cs0246-8.cs.
3619
3620         * namespace.cs (NamespaceEntry.Lookup): Likewise.
3621
3622 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3623
3624         * class.cs (MemberBase.Define): Reuse MemberType member for 
3625         resolved type. Other methods can use it too.
3626
3627 2004-05-23  Martin Baulig  <martin@ximian.com>
3628
3629         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
3630         the variable also exists in the current block (otherwise, we need
3631         to report a CS0103).  Fixes #58670.
3632
3633 2004-05-23  Martin Baulig  <martin@ximian.com>
3634
3635         * flowanalysis.cs (Reachability.Reachable): Compute this
3636         on-the-fly rather than storing it as a field.
3637
3638 2004-05-23  Martin Baulig  <martin@ximian.com>
3639
3640         * flowanalysis.cs (Reachability.And): Manually compute the
3641         resulting `barrier' from the reachability.      
3642        
3643 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3644
3645         Fix bug #57835
3646         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
3647         instance of ObsoleteAttribute when symbol is obsolete.
3648
3649         * class.cs
3650         (IMethodData): Extended interface for ObsoleteAttribute support.
3651
3652 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3653
3654         * attribute.cs: Fix bug #55970
3655
3656 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3657
3658         Fix bug #52705
3659         * attribute.cs
3660         (GetObsoleteAttribute): New method. Creates the instance of
3661         ObsoleteAttribute.
3662         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
3663         ObsoleteAttribute when member is obsolete.
3664         (AttributeTester.Report_ObsoleteMessage): Common method for
3665         Obsolete error/warning reporting.
3666
3667         * class.cs
3668         (TypeContainer.base_classs_type): New member for storing parent type.
3669
3670         * decl.cs
3671         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
3672         for this MemberCore.
3673
3674 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3675
3676         * attribute.cs, const.cs: Fix bug #58590
3677
3678 2004-05-21  Martin Baulig  <martin@ximian.com>
3679
3680         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
3681         out parameters if the end of the method is unreachable.  Fixes
3682         #58098. 
3683
3684 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3685
3686         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
3687         Hari was right, why extra method.
3688
3689 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3690
3691         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
3692
3693 2004-05-20  Martin Baulig  <martin@ximian.com>
3694
3695         * delegate.cs: Convert this file to Unix mode - like the original
3696         version in mcs is.
3697
3698 2004-05-20  Martin Baulig  <martin@ximian.com>
3699
3700         * attribute.cs: Convert this file to Unix mode - like the original
3701         version in mcs is.
3702
3703 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
3704
3705        Fix bug #58688 (MCS does not report error when the same attribute
3706        is assigned twice)
3707
3708        * attribute.cs (Attribute.Emit): Distinction between null and default.
3709
3710 2004-05-19  Raja R Harinath  <rharinath@novell.com>
3711
3712        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
3713        of a top-level attribute without an attribute target.
3714        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
3715        Make non-static.
3716        (Attribute.Conditional_GetConditionName), 
3717        (Attribute.Obsolete_GetObsoleteMessage): Update.
3718        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
3719        part of ScanForIndexerName.
3720        (Attribute.CanIgnoreInvalidAttribute): New function.
3721        (Attribute.ScanForIndexerName): Move to ...
3722        (Attributes.ScanForIndexerName): ... here.
3723        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
3724        (Attributes.Search): New internal variant that can choose not to
3725        complain if types aren't resolved.  The original signature now
3726        complains.
3727        (Attributes.GetClsCompliantAttribute): Use internal variant, with
3728        complaints suppressed.
3729        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
3730        only if it not useful.
3731        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
3732        top-level for attributes that are shared between the assembly
3733        and a top-level class.
3734        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
3735        * class.cs: Update to reflect changes.
3736        (DefineIndexers): Fuse loops.
3737        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
3738        a couple more variants of attribute names.
3739
3740 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
3741
3742         Fix bug #52585 (Implemented explicit attribute declaration)
3743
3744         * attribute.cs:
3745         (Attributable.ValidAttributeTargets): New abstract method. It gets
3746         list of valid attribute targets for explicit target declaration.
3747         (Attribute.Target): It holds target itself.
3748         (AttributeSection): Removed.
3749         (Attribute.CheckTargets): New method. It checks whether attribute
3750         target is valid for the current element.
3751
3752         * class.cs:
3753         (EventProperty): New class. For events that are declared like
3754         property (with add and remove accessors).
3755         (EventField): New class. For events that are declared like field.
3756         class.cs
3757
3758         * cs-parser.jay: Implemented explicit attribute target declaration.
3759
3760         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
3761         Override ValidAttributeTargets.
3762
3763         * parameter.cs:
3764         (ReturnParameter): Class for applying custom attributes on 
3765         the return type.
3766         (ParameterAtribute): New class. Class for applying custom
3767         attributes on the parameter type.
3768
3769 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
3770
3771         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
3772         definitions. 
3773
3774         (Method): Allow UNSAFE here.
3775
3776         * modifiers.cs: Support unsafe reporting.
3777
3778 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
3779
3780         * decl.cs: Fix bug #58478.
3781
3782 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3783
3784         * statement.cs: When checking for unreachable code on an EmptyStatement,
3785         set the location. Fixes bug #58488.
3786
3787 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
3788
3789         * driver.cs: Add -pkg handling.
3790
3791         From Gonzalo: UseShelLExecute=false
3792
3793 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
3794
3795         * attribute.cs:
3796         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
3797         for attribute.
3798         (Attribute.IsClsCompliaceRequired): Moved to base for better
3799         accesibility.
3800         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
3801         when attribute is AttributeUsageAttribute.
3802         (Attribute.GetValidTargets): Simplified.
3803         (Attribute.GetAttributeUsage): New method returns AttributeUsage
3804         attribute for this type.
3805         (Attribute.ApplyAttributes): Method renamed to Emit and make
3806         non-static.
3807         (GlobalAttributeSection): New class for special handling of global
3808         attributes (assembly, module).
3809         (AttributeSection.Emit): New method.
3810
3811         * class.cs: Implemented Attributable abstract methods.
3812         (MethodCore.LabelParameters): Moved to Parameter class.
3813         (Accessor): Is back simple class.
3814         (PropertyMethod): Implemented Attributable abstract class.
3815         (DelegateMethod): Implemented Attributable abstract class.
3816         (Event): New constructor for disctintion between normal Event
3817         and Event with accessors.
3818
3819         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
3820
3821         * codegen.cs, const.cs, decl.cs, delegate.cs:
3822         (CommonAssemblyModulClass): Implemented Attributable abstract class
3823         and simplified.
3824
3825         * enum.cs: Implement IAttributeSupport interface.
3826         (EnumMember): New class for emum members. Implemented Attributable
3827         abstract class
3828
3829         * parameter.cs:
3830         (ParameterBase): Is abstract.
3831         (ReturnParameter): New class for easier [return:] attribute handling.
3832
3833         * typemanager.cs: Removed builder_to_attr.
3834
3835 2004-05-11  Raja R Harinath  <rharinath@novell.com>
3836
3837         Fix bug #57151.
3838         * attribute.cs (Attribute.GetPositionalValue): New function.
3839         * class.cs (TypeContainer.VerifyMembers): New function.
3840         (TypeContainer.Emit): Use it.
3841         (ClassOrStruct): New base class for Class and Struct.
3842         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
3843         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
3844         class.
3845         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
3846         then each non-static field should have a FieldOffset attribute.
3847         Otherwise, none of the fields should have a FieldOffset attribute.
3848         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
3849         and FieldOffset attributes.
3850         * typemanager.cs (TypeManager.struct_layout_attribute_type)
3851         (TypeManager.field_offset_attribute_type): New core types.
3852         (TypeManager.InitCoreTypes): Initialize them.
3853
3854 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
3855
3856         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
3857         Return correct type.
3858         From bug #58270.
3859
3860 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
3861
3862         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
3863         be implicitly converted to ulong.
3864         
3865         * expression.cs: The logic for allowing operator &, | and ^ worked
3866         was wrong, it worked before because we did not report an error in
3867         an else branch.  Fixes 57895.
3868
3869         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
3870         allow volatile fields to be reference types.
3871
3872 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
3873
3874         * driver.cs: Add support for /debug-
3875
3876 2004-05-07  Raja R Harinath  <rharinath@novell.com>
3877
3878         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
3879         Add a 'complain' parameter to silence errors.
3880         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
3881         silently overlooked type-resolutions.
3882         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
3883         to reflect changes.
3884         (Attributes.Search): New function.
3885         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
3886         (Attributes.GetAttributeFullName): Remove hack.
3887         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
3888         Update to reflect changes.
3889         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
3890         Use Attributes.Search instead of nested loops.
3891
3892 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
3893
3894         * decl.cs:
3895         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
3896         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
3897         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
3898
3899         * report.cs: (Report.Warning): Renamed to Warning_T because of
3900         parameter collision.
3901
3902 2004-05-05  Raja R Harinath  <rharinath@novell.com>
3903
3904         * expression.cs (MemberAccess.ResolveMemberAccess):
3905         Exit with non-zero status after Report.Error.
3906         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
3907         Likewise.
3908         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
3909
3910 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3911
3912         * support.cs: Don't hang when the file is empty.
3913
3914 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3915
3916         * support.cs: In SeekableStreamReader, compute the preamble size of the
3917           underlying stream. Position changes should take into account that initial
3918           count of bytes.
3919
3920 2004-05-03  Todd Berman  <tberman@sevenl.net>
3921
3922         * driver.cs: remove unused GetSysVersion function.
3923
3924 2004-05-03  Todd Berman  <tberman@sevenl.net>
3925
3926         * driver.cs: Remove the hack from saturday, as well as the hack
3927         from jackson (LoadAssemblyFromGac), also adds the CWD to the
3928         link_paths to get that bit proper.
3929
3930 2004-05-01  Todd Berman  <tberman@sevenl.net>
3931
3932         * driver.cs: Try a LoadFrom before a Load, this checks the current
3933         path. This is currently a bug in mono that is be fixed, however, this
3934         provides a workaround for now. This will be removed when the bug
3935         is fixed.
3936
3937 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
3938
3939         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3940         incomplete key pairs (#57941).
3941
3942 2004-05-01  Todd Berman  <tberman@sevenl.net>
3943
3944         * driver.cs: Remove '.' from path_chars, now System.* loads properly
3945         from the GAC
3946
3947 2004-04-30  Jackson Harper  <jackson@ximian.com>
3948
3949         * codegen.cs: Open keys readonly.
3950         
3951 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3952
3953         * typemanager.cs: don't report cyclic struct layout when a struct
3954         contains 2 or more fields of the same type. Failed for Pango.AttrShape
3955         which has 2 Pango.Rectangle fields.
3956
3957 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3958
3959         * expression.cs: Handle IntPtr comparisons with IL code
3960         rather than a method call.
3961
3962 2004-04-29  Martin Baulig  <martin@ximian.com>
3963
3964         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
3965         the list of PropertyInfo's in class hierarchy and find the
3966         accessor.  Fixes #56013.
3967
3968 2004-04-29  Martin Baulig  <martin@ximian.com>
3969
3970         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
3971
3972 2004-04-29  Martin Baulig  <martin@ximian.com>
3973
3974         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3975
3976         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
3977
3978 2004-04-29  Martin Baulig  <martin@ximian.com>
3979
3980         * class.cs (ConstructorInitializer.Resolve): Check whether the
3981         parent .ctor is accessible.  Fixes #52146.
3982
3983 2004-04-29  Martin Baulig  <martin@ximian.com>
3984
3985         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3986
3987         * statement.cs (Using.EmitLocalVariableDecls): Use
3988         TypeManager.idisposable_type, not typeof (IDisposable).
3989         (Foreach.EmitCollectionForeach): Added support for valuetypes.
3990
3991 2004-04-29  Martin Baulig  <martin@ximian.com>
3992
3993         * class.cs (Event.Define): Don't emit the field and don't set
3994         RTSpecialName and SpecialName for events on interfaces.  Fixes
3995         #57703. 
3996
3997 2004-04-29  Raja R Harinath  <rharinath@novell.com>
3998
3999         Refactor Attribute.ApplyAttributes.
4000         * attribute.cs (Attributable): New base class for objects that can
4001         have Attributes applied on them.
4002         (Attribute): Make AttributeUsage fields public.
4003         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
4004         (Attribute.IsInternalCall): New property.
4005         (Attribute.UsageAttr): Convert to a public read-only property.
4006         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
4007         (Attribute.ResolveType, Attribute.Resolve)
4008         (Attribute.ScanForIndexerName): Update to reflect changes.
4009         (Attribute.CheckAttributeTarget): Re-format.
4010         (Attribute.ApplyAttributes): Refactor, to various
4011         Attributable.ApplyAttributeBuilder methods.
4012         * decl.cs (MemberCore): Make Attributable.
4013         * class.cs (Accessor): Make Attributable.
4014         (MethodData.ApplyAttributes): Use proper attribute types, not
4015         attribute names.
4016         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
4017         (TypeContainer.ApplyAttributeBuilder)
4018         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
4019         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
4020         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
4021         (Operator.ApplyAttributeBuilder): New factored-out methods.
4022         * const.cs (Const.ApplyAttributeBuilder): Likewise.
4023         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
4024         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
4025         * parameter.cs (ParameterBase): New Attributable base class
4026         that can also represent Return types.
4027         (Parameter): Update to the changes.
4028
4029 2004-04-29  Jackson Harper  <jackson@ximian.com>
4030
4031         * driver.cs: Prefer the corlib system version when looking for
4032         assemblies in the GAC. This is still a hack, but its a better hack
4033         now.
4034         
4035 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
4036
4037         * decl.cs, enum.cs: Improved error 3005 reporting.
4038   
4039         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
4040         (related_symbols): New private member for list of symbols
4041         related to reported error/warning.
4042         
4043         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
4044
4045 2004-04-29  Martin Baulig  <martin@ximian.com>
4046
4047         * ecore.cs (Expression.Constantify): If we're an enum and
4048         TypeManager.TypeToCoreType() doesn't give us another type, use
4049         t.UnderlyingSystemType.  Fixes #56178.  
4050
4051 2004-04-29  Martin Baulig  <martin@ximian.com>
4052
4053         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
4054         interfaces and for each interface, only add members directly
4055         declared in that interface.  Fixes #53255.
4056
4057 2004-04-28  Martin Baulig  <martin@ximian.com>
4058
4059         * expression.cs (ConditionalLogicalOperator): Use a temporary
4060         variable for `left' to avoid that we evaluate it more than once;
4061         bug #52588.
4062
4063 2004-04-28  Martin Baulig  <martin@ximian.com>
4064
4065         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
4066         `void[]' (CS1547).
4067
4068 2004-04-28  Martin Baulig  <martin@ximian.com>
4069
4070         * statement.cs (LocalInfo.Resolve): Check whether the type is not
4071         void (CS1547).
4072
4073         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
4074         whether the type is not void (CS1547).
4075
4076 2004-04-28  Martin Baulig  <martin@ximian.com>
4077
4078         * expression.cs (Unary.DoResolveLValue): Override this and report
4079         CS0131 for anything but Operator.Indirection.
4080
4081 2004-04-28  Martin Baulig  <martin@ximian.com>
4082
4083         Committing a patch from Ben Maurer; see bug #50820.
4084
4085         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
4086         check for classes.
4087
4088         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
4089         classes.        
4090
4091 2004-04-28  Martin Baulig  <martin@ximian.com>
4092
4093         Committing a patch from Ben Maurer; see bug #50820.
4094
4095         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
4096         check for classes.
4097
4098         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
4099         classes.        
4100
4101 2004-04-28  Martin Baulig  <martin@ximian.com>
4102
4103         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
4104         (Block.AddLabel): Call DoLookupLabel() to only search in the
4105         current block.
4106
4107 2004-04-28  Martin Baulig  <martin@ximian.com>
4108
4109         * cfold.cs (ConstantFold.BinaryFold): Added special support for
4110         comparing StringConstants and NullLiterals in Equality and Inequality.
4111
4112 2004-04-28  Jackson Harper  <jackson@ximian.com>
4113
4114         * driver.cs: Attempt to load referenced assemblies from the
4115         GAC. This is the quick and dirty version of this method that
4116         doesnt take into account versions and just takes the first
4117         canidate found. Will be good enough for now as we will not have more
4118         then one version installed into the GAC until I update this method.
4119
4120 2004-04-28  Martin Baulig  <martin@ximian.com>
4121
4122         * typemanager.cs (TypeManager.CheckStructCycles): New public
4123         static method to check for cycles in the struct layout.
4124
4125         * rootcontext.cs (RootContext.PopulateTypes): Call
4126         TypeManager.CheckStructCycles() for each TypeContainer.
4127         [Note: We only need to visit each type once.]
4128
4129 2004-04-28  Martin Baulig  <martin@ximian.com>
4130
4131         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
4132
4133         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
4134         success and added `out object value'.  Use a `bool resolved' field
4135         to check whether we've already been called rather than
4136         `ConstantValue != null' since this breaks for NullLiterals.
4137
4138 2004-04-28  Raja R Harinath  <rharinath@novell.com>
4139
4140         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
4141         setting of this flag, since the 'set' method may be non-public.
4142
4143 2004-04-28  Raja R Harinath  <rharinath@novell.com>
4144
4145         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
4146         check on current_vector.Block.
4147
4148 2004-04-27  Martin Baulig  <martin@ximian.com>
4149
4150         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
4151         a field initializer.  Fixes #56459.
4152
4153 2004-04-27  Martin Baulig  <martin@ximian.com>
4154
4155         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
4156         we're not attempting to use an indexer.  Fixes #52154.
4157
4158 2004-04-27  Martin Baulig  <martin@ximian.com>
4159
4160         * statement.cs (Return): Don't create a return label if we don't
4161         need it; reverts my change from January 20th.  Thanks to Ben
4162         Maurer for this.
4163
4164 2004-04-27  Martin Baulig  <martin@ximian.com>
4165
4166         According to the spec, `goto' can only leave a nested scope, but
4167         never enter it.
4168
4169         * statement.cs (Block.LookupLabel): Only lookup in the current
4170         block, don't recurse into parent or child blocks.
4171         (Block.AddLabel): Check in parent and child blocks, report
4172         CS0140/CS0158 if we find a duplicate.
4173         (Block): Removed this indexer for label lookups.
4174         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
4175         this already does the error reporting for us.
4176
4177         * flowanalysis.cs
4178         (FlowBranching.UsageVector.Block): New public variable; may be null.
4179         (FlowBranching.CreateSibling): Added `Block' argument.
4180         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
4181         label for the target of a `goto' and check whether we're not
4182         leaving a `finally'.
4183
4184 2004-04-27  Martin Baulig  <martin@ximian.com>
4185
4186         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
4187         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
4188         just for returns).
4189
4190 2004-04-27  Martin Baulig  <martin@ximian.com>
4191
4192         * statement.cs (Block.AddLabel): Also check for implicit blocks
4193         and added a CS0158 check.
4194
4195 2004-04-27  Martin Baulig  <martin@ximian.com>
4196
4197         * flowanalysis.cs (FlowBranchingLoop): New class.
4198         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
4199         UsageVector's instead of an ArrayList.
4200         (FlowBranching.Label): Likewise.
4201         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
4202         (FlowBranching.AddBreakVector): New method.
4203
4204 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
4205
4206         * attribute.cs: Small regression fix: only convert the type if we
4207         the type is different, fixes System.Drawing build.
4208
4209 2004-04-27  Martin Baulig  <martin@ximian.com>
4210
4211         * attribute.cs (Attribute.Resolve): If we have a constant value
4212         for a named field or property, implicity convert it to the correct
4213         type.
4214
4215 2004-04-27  Raja R Harinath  <rharinath@novell.com>
4216
4217         * statement.cs (Block.Block): Implicit blocks share
4218         'child_variable_names' fields with parent blocks.
4219         (Block.AddChildVariableNames): Remove.
4220         (Block.AddVariable): Mark variable as "used by a child block" in
4221         every surrounding block.
4222         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
4223         been used in a child block, complain about violation of "Invariant
4224         meaning in blocks" rule.
4225         * cs-parser.jay (declare_local_variables): Don't use
4226         AddChildVariableNames.
4227         (foreach_statement): Don't create an implicit block: 'foreach'
4228         introduces a scope.
4229
4230 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
4231
4232         * convert.cs (ImplicitNumericConversion): 0 is also positive when
4233         converting from 0L to ulong.  Fixes 57522.
4234
4235 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
4236
4237         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
4238         derived class hides via 'new' keyword field from base class (test-242.cs).
4239         TODO: Handle this in the more general way.
4240         
4241         * class.cs (CheckBase): Ditto.
4242
4243 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
4244
4245         * decl.cs (caching_flags): New member for storing cached values
4246         as bit flags.
4247         (MemberCore.Flags): New enum where bit flags for caching_flags
4248         are defined.
4249         (MemberCore.cls_compliance): Moved to caching_flags.
4250         (DeclSpace.Created): Moved to caching_flags.
4251
4252         * class.cs: Use caching_flags instead of DeclSpace.Created
4253         
4254 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
4255
4256         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
4257         if we are only a derived class, not a nested class.
4258
4259         * typemanager.cs: Same as above, but do this at the MemberLookup
4260         level (used by field and methods, properties are handled in
4261         PropertyExpr).   Allow for the qualified access if we are a nested
4262         method. 
4263
4264 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
4265
4266         * class.cs: Refactoring.
4267         (IMethodData): New inteface; Holds links to parent members
4268         to avoid member duplication (reduced memory allocation).
4269         (Method): Implemented IMethodData interface.
4270         (PropertyBase): New inner classes for get/set methods.
4271         (PropertyBase.PropertyMethod): Implemented IMethodData interface
4272         (Event): New inner classes for add/remove methods.
4273         (Event.DelegateMethod): Implemented IMethodData interface.
4274
4275         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
4276         EmitContext (related to class.cs refactoring).
4277
4278 2004-04-21  Raja R Harinath  <rharinath@novell.com>
4279
4280         * delegate.cs (Delegate.VerifyApplicability): If the number of
4281         arguments are the same as the number of parameters, first try to
4282         verify applicability ignoring  any 'params' modifier on the last
4283         parameter.
4284         Fixes #56442.
4285
4286 2004-04-08  Martin Baulig  <martin@ximian.com>
4287
4288         Merged latest changes into gmcs.  Please keep this comment in
4289         here, it makes it easier for me to see what changed in MCS since
4290         the last time I merged.
4291
4292 2004-04-16  Raja R Harinath  <rharinath@novell.com>
4293
4294         * class.cs (TypeContainer.AddIndexer): Use
4295         'ExplicitInterfaceName' to determine if interface name was
4296         explicitly specified.  'InterfaceType' is not initialized at this time.
4297         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
4298         Indexers array is already in the required order.  Initialize
4299         'IndexerName' only if there are normal indexers.
4300         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
4301         (TypeContainer.Emit): Emit DefaultMember attribute only if
4302         IndexerName is initialized.
4303         Fixes #56300.
4304
4305 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
4306
4307         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
4308         Fixes #57007
4309
4310 2004-04-15  Raja R Harinath  <rharinath@novell.com>
4311
4312         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
4313         attributes.
4314         Fix for #56456.
4315
4316         * attribute.cs (Attribute.Resolve): Check for duplicate named
4317         attributes.
4318         Fix for #56463.
4319
4320 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
4321
4322         * iterators.cs (MarkYield): track whether we are in an exception,
4323         and generate code accordingly.  Use a temporary value to store the
4324         result for our state.
4325
4326         I had ignored a bit the interaction of try/catch with iterators
4327         since their behavior was not entirely obvious, but now it is
4328         possible to verify that our behavior is the same as MS .NET 2.0
4329
4330         Fixes 54814
4331
4332 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
4333
4334         * iterators.cs: Avoid creating temporaries if there is no work to
4335         do. 
4336
4337         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
4338         Enumerations, use TypeManager.EnumToUnderlying and call
4339         recursively. 
4340
4341         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
4342         bug #57013
4343
4344         (This.Emit): Use EmitContext.EmitThis to emit our
4345         instance variable.
4346
4347         (This.EmitAssign): Ditto.
4348
4349         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
4350         codepaths, we will move all the functionality into
4351         Mono.CSharp.This 
4352
4353         (FieldExpr.EmitAssign): Ditto.
4354
4355         This fixes several hidden bugs that I uncovered while doing a code
4356         review of this today.
4357
4358         * codegen.cs (EmitThis): reworked so the semantics are more clear
4359         and also support value types "this" instances.
4360
4361         * iterators.cs: Changed so that for iterators in value types, we
4362         do not pass the value type as a parameter.  
4363
4364         Initialization of the enumerator helpers is now done in the caller
4365         instead of passing the parameters to the constructors and having
4366         the constructor set the fields.
4367
4368         The fields have now `assembly' visibility instead of private.
4369
4370 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
4371
4372         * expression.cs (Argument.Resolve): Check if fields passed as ref
4373         or out are contained in a MarshalByRefObject.
4374
4375         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
4376         another compiler type.
4377
4378 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
4379
4380         * class.cs (Indexer.Define): use the new name checking method.
4381         Also, return false on an error.
4382         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
4383         (is_identifier_[start/part]_character): make static.
4384
4385 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
4386
4387         * expression.cs (Binary.ResolveOperator): Do no append strings
4388         twice: since we can be invoked more than once (array evaluation)
4389         on the same concatenation, take care of this here.  Based on a fix
4390         from Ben (bug #56454)
4391
4392 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
4393
4394         * codegen.cs: Fix another case where CS1548 must be reported (when 
4395         delay-sign isn't specified and no private is available #56564). Fix
4396         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
4397         error when MCS is used on the MS runtime and we need to delay-sign 
4398         (which seems unsupported by AssemblyBuilder - see #56621).
4399
4400 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
4401
4402         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
4403         (TypeManager.ComputeNamespaces): Faster implementation for
4404         Microsoft runtime.
4405
4406         * compiler.csproj: Updated AssemblyName to mcs.
4407
4408 2004-05-11  Jackson Harper  <jackson@ximian.com>
4409
4410         * Makefile: Preserve MONO_PATH
4411         
4412 2004-05-11  Jackson Harper  <jackson@ximian.com>
4413
4414         * Makefile: Use mono and mcs to build gmcs
4415         
4416 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
4417
4418         * codegen.cs: Add patch from Robert Shade
4419         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
4420         sync with mcs.
4421
4422 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
4423
4424         * CryptoConvert.cs: Updated to latest version. Fix issue with 
4425         incomplete key pairs (#57941).
4426
4427 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
4428
4429         * codegen.cs: Fix another case where CS1548 must be reported (when 
4430         delay-sign isn't specified and no private is available #56564). Fix
4431         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
4432         error when MCS is used on the MS runtime and we need to delay-sign 
4433         (which seems unsupported by AssemblyBuilder - see #56621).
4434
4435 2004-04-29  Jackson Harper  <jackson@ximian.com>
4436
4437         * Makefile: Set MONO_PATH to use the bootstrap corlib
4438         * driver.cs: Check the GAC for referenced assemblies.
4439                 
4440 2004-04-29  Martin Baulig  <martin@ximian.com>
4441
4442         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
4443
4444 2004-04-07  Martin Baulig  <martin@ximian.com>
4445
4446         * expression.cs (Binary.ResolveOperator): Added special case for
4447         Equality/Inequality between a type parameter and a null literal.
4448
4449 2004-04-07  Martin Baulig  <martin@ximian.com>
4450
4451         * convert.cs: Check null literal -> type parameter conversions.
4452
4453 2004-04-07  Martin Baulig  <martin@ximian.com>
4454
4455         * generic.cs (ConstructedType.CheckConstraints): Enforce the
4456         `class' and `struct' constraints.
4457
4458 2004-04-07  Martin Baulig  <martin@ximian.com>
4459
4460         * generic.cs (SpecialConstraint): New public enum.
4461         (Constraints.Resolve): Added support for the `class' and `struct'
4462         constraints.
4463
4464         * cs-parser.jay (type_parameter_constraint): Added support for the
4465         `class' and `struct' constraints.
4466
4467 2004-04-07  Martin Baulig  <martin@ximian.com>
4468
4469         * support.cs (GenericConstraints): Replaced `Types' by
4470         `ClassConstraint' and `InterfaceConstraints'; added
4471         `HasClassConstraint'.   
4472
4473 2004-04-07  Martin Baulig  <martin@ximian.com>
4474
4475         * generic.cs
4476         (Constraints.InterfaceConstraints): New public property.
4477         (Constraints.Types): Make this property public
4478         (TypeParameter): Implement IMemberContainer.
4479         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
4480         instead of a TypeBuilder/MethodBuilder; pass the interface
4481         constraints to TypeManager.AddTypeParameter().
4482         (TypeParameter.DefineType): Just take an EmitContext and no
4483         TypeBuilder/MethodBuilder.  Use the new public API.
4484
4485         * typemanager.cs (TypeManager.AddTypeParameter): Added
4486         `TypeExpr[]' argument; add the interfaces to the
4487         `builder_to_ifaces' hash.
4488         (TypeManager.LookupMemberContainer): For
4489         GenericTypeParameterBuilders, get the TypeParameter from the
4490         `builder_to_type_param'.
4491         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
4492         the TypeParameter and call FindMembers on it.
4493
4494 2004-04-07  Martin Baulig  <martin@ximian.com>
4495
4496         * class.cs
4497         (MethodCore.GenericMethod): Moved this field here from Method.
4498         (MethodCore.IsDuplicateImplementation): Take the number of type
4499         parameters into account if we're a generic method.
4500
4501         * expression.cs (Invocation.InferTypeArguments): Don't return true
4502         if `arguments' is null; we still need to check whether we actually
4503         don't need to infer anything in this case.
4504         (MemberAccess): Merged the functionality from GenericMemberAccess
4505         into this class.
4506
4507         * generic.cs (GenericMemberAccess): Removed.
4508
4509 2004-04-05  Martin Baulig  <martin@ximian.com>
4510
4511         * decl.cs (MemberCore): For generic classes, interfaces and
4512         structs, `Name' now includes the number of type parameters
4513         ("Stack!1.Node!1").
4514         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
4515         encode the number of type arguments in the type name.
4516
4517         * expression.cs (Expression.MemberLookup): Removed the
4518         `num_type_args' argument; we now encode the number of type
4519         arguments in the type name.
4520
4521         * ecore.cs (SimpleName): Encode the number of type arguments in
4522         the type name itself.
4523
4524         * generic.cs (ConstructedType): Likewise.
4525
4526         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
4527         `MemberName'; we now include the number of type parameters in the
4528         type name.
4529
4530         * typemanager.cs (TypeManager.CheckGeneric): Removed.
4531         (TypeManager.MemberLookup): Removed the
4532         `num_type_args' argument; we now encode the number of type
4533         arguments in the type name.     
4534
4535 2004-04-03  Martin Baulig  <martin@ximian.com>
4536
4537         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
4538         (MemberCore.MemberName): Moved here from MemberBase.
4539         (DeclSpace.SetParameterInfo): Just take the constraints as an
4540         ArrayList; we already have the type parameters in our
4541         `MemberName'; also do the CS0080 reporting here.
4542
4543         * cs-parser.jay (struct_declaration): Use `member_name' instead of
4544         `IDENTIFIER opt_type_parameter_list'; when constructing our
4545         `MemberName', it'll already include our type parameters.
4546         (class_declaration, interface_declaration): Likewise.
4547         (delegate_declaration): Likewise.
4548         (MakeName): Take a MemberName and return a MemberName.
4549         The following two changes are required to avoid shift/reduce conflicts:
4550         (member_name): Don't include a TypeName anymore; ie. this is now
4551         just 'IDENTIFIER opt_type_parameter_list'.
4552         (property_declaration, event_declaration): Use a
4553         `namespace_or_type_name' instead of a `member_name'.            
4554
4555 2004-04-03  Martin Baulig  <martin@ximian.com>
4556
4557         * decl.cs (MemberName): Renamed to `TypeName' and created a new
4558         `MemberName' class.
4559         (TypeName): Formerly known as MemberName.
4560
4561         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
4562         instead of a `MemberName'.
4563
4564         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
4565         (member_name): New rule; create a MemberName.
4566
4567 2004-04-02  Martin Baulig  <martin@ximian.com>
4568
4569         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
4570         (CS0305 and CS0308).
4571
4572 2004-04-02  Martin Baulig  <martin@ximian.com>
4573
4574         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
4575         support for nested types.
4576
4577 2004-04-02  Martin Baulig  <martin@ximian.com>
4578
4579         * ecore.cs (IAlias): New public interface.
4580         (TypeExpr, TypeExpression): Implement IAlias.
4581         (TypeAliasExpression): New public class.
4582
4583         * namespace.cs (Namespace): Implement IAlias.
4584         (Namespace.Lookup): Return an IAlias instead on an object.
4585         (Namespace.DefineName): Take an IAlias instead of an object.
4586         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
4587         an object.
4588         (NamespaceEntry.UsingAlias): Take a Membername instead of an
4589         Expression.
4590         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
4591         object.
4592         (NamespaceEntry.Lookup): Likewise.
4593
4594         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
4595         instead of a Type.      
4596
4597         * decl.cs (DeclSpace): Implement IAlias.
4598         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
4599
4600         * generic.cs (ConstructedType): Improved error checking.
4601
4602 2004-04-02  Martin Baulig  <martin@ximian.com>
4603
4604         * convert.cs: Added type parameter conversions.
4605
4606         * ecore.cs
4607         (UnboxCast.Emit): Emit an `unbox.any' for type params.
4608         (ClassCast.Emit): If the source type is a type parameter, box it.
4609         If the target type is a type parameter, emit an `unbox.any'
4610         instead of a `classcast'.1      
4611
4612 2004-04-01  Martin Baulig  <martin@ximian.com>
4613
4614         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
4615
4616 2004-04-01  Martin Baulig  <martin@ximian.com>
4617
4618         * generic.cs (ConstructedType.CheckConstraints): Use
4619         Convert.ImplicitStandardConversionExists(); user-defined implicit
4620         conversions are not allowed according to the spec.
4621
4622 2004-03-30  Martin Baulig  <martin@ximian.com>
4623
4624         * expression.cs (New): Added support for type parameters.
4625
4626         * typemanager.cs
4627         (TypeManager.activator_type): New public static field.
4628         (TypeManager.activator_create_instance): Likewise.
4629
4630 2004-03-30  Martin Baulig  <martin@ximian.com>
4631
4632         * typemanager.cs (TypeManager.HasConstructorConstraint): New
4633         public method.
4634
4635 2004-03-30  Martin Baulig  <martin@ximian.com>
4636
4637         * generic.cs (ConstructedType.CheckConstraints): Actually follow
4638         the spec here: the argument type must be convertible to the
4639         constraints.
4640
4641 2004-03-30  Martin Baulig  <martin@ximian.com>
4642
4643         * generic.cs
4644         (TypeParameter.Define, TypeParameter.DefineMethod): Call
4645         TypeManager.AddTypeParameter().
4646         (ConstructedType.CheckConstraints): Re-enable this and actually
4647         check whether we have a constructor constraint.
4648
4649         * typemanager.cs
4650         (TypeManager.builder_to_type_param): New static field.
4651         (TypeManager.AddTypeParameter): New static method.
4652         (TypeManager.LookupTypeParameter): New public method.
4653
4654 2004-03-30  Martin Baulig  <martin@ximian.com>
4655
4656         * generic.cs (TypeParameter.DefineType): Return a boolean and use
4657         the new API to actually define the constructor constraint.
4658
4659         * typemanager.cs
4660         (TypeManager.new_constraint_attr_type): New static field.
4661         (TypeManager.InitCoreTypes): Initialize it.
4662
4663 2004-03-30  Martin Baulig  <martin@ximian.com>
4664
4665         * generic.cs (Constraints): Completed error checking, use correct
4666         error numbers.
4667
4668 2004-03-29  Martin Baulig  <martin@ximian.com>
4669
4670         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
4671
4672         * expression.cs (Invocation.InferTypeArguments): Added overloaded
4673         public version which takes a `ParameterData pd' instead of an
4674         `ArrayList args'.
4675
4676 2004-03-29  Martin Baulig  <martin@ximian.com>
4677
4678         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
4679         not a MethodInfo.       
4680
4681 2004-03-29  Martin Baulig  <martin@ximian.com>
4682
4683         * expression.cs (Argument.ResolveMethodGroup): If we're a
4684         ConstructedType, call GetMemberAccess() on it.  
4685
4686 2004-03-29  Martin Baulig  <martin@ximian.com>
4687
4688         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
4689         (MethodCore.CheckGenericOverride): When overriding a generic
4690         method, check whether the constraints match.
4691
4692         * support.cs (GenericConstraints): New public interface.
4693         (ParameterData.GenericConstraints): New public method.
4694
4695         * parameter.cs (Parameter.Resolve): Check whether we're a generic
4696         method parameter and compute our constraints if appropriate.
4697         (Parameter.GenericConstraints): New public property.
4698
4699         * generic.cs (Constraints): Implement GenericConstraints.
4700
4701 2004-03-29  Martin Baulig  <martin@ximian.com>
4702
4703         * decl.cs (MemberCache.FindMemberToOverride): Use
4704         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
4705
4706 2004-03-29  Martin Baulig  <martin@ximian.com>
4707
4708         * generic.cs (GenericMethod.Define): Resolve our type parameters.
4709
4710 2004-03-29  Martin Baulig  <martin@ximian.com>
4711
4712         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
4713         not allowed on non-generic declarations").
4714
4715 2004-03-29  Martin Baulig  <martin@ximian.com>
4716
4717         * expression.cs (Invocation.InferTypeArguments): Added overloaded
4718         public version of this method.
4719
4720         * class.cs (MethodCore.IsDuplicateImplementation): Use
4721         Invocation.InferTypeArguments() to check this.
4722
4723 2004-03-29  Martin Baulig  <martin@ximian.com>
4724
4725         * convert.cs: Use TypeManager.IsDelegateType() instead of
4726         comparing types correctly.
4727
4728 2004-03-29  Martin Baulig  <martin@ximian.com>
4729
4730         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
4731         types directly to make it work for generic instances.
4732
4733         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
4734
4735 2004-03-29  Martin Baulig  <martin@ximian.com>
4736
4737         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
4738         support for arrays.     
4739
4740 2004-03-24  Martin Baulig  <martin@ximian.com>
4741
4742         * decl.cs (DeclSpace.FindType): Also use
4743         TypeManager.CheckGeneric() for types from the using clauses.
4744
4745 2004-03-23  Martin Baulig  <martin@ximian.com>
4746
4747         * expression.cs (Invocation.OverloadResolve): Added `bool
4748         may_fail' argument and use it instead of the Location.IsNull() hack.
4749
4750 2004-03-23  Martin Baulig  <martin@ximian.com>
4751
4752         * expression.cs (Invocation.InferType): Use correct type inference
4753         rules here.     
4754
4755 2004-03-23  Martin Baulig  <martin@ximian.com>
4756
4757         * ecore.cs (MethodGroupExpr.Name): Use
4758         TypeManager.CSharpSignature() instead of just the name.
4759
4760         * expression.cs (Invocation.OverloadResolve): Provide better error
4761         reporting.
4762         (Invocation.DoResolve): OverloadResolve() never returns null
4763         without reporting an error, so removed the error -6 reporting here.
4764
4765 2004-03-23  Martin Baulig  <martin@ximian.com>
4766
4767         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
4768         generic methods.
4769
4770         * cs-parser.jay (delegate_declaration): Support generic delegates.
4771
4772         * delegate.cs: Support generic delegates.
4773
4774 2004-03-22  Martin Baulig  <martin@ximian.com>
4775
4776         * expression.cs (Invocation.InferParamsTypeArguments): New static
4777         method; does type inference for params arguments.
4778
4779 2004-03-21  Martin Baulig  <martin@ximian.com>
4780
4781         * typemanager.cs (TypeManager.IsGenericMethod): New public static
4782         method; checks whether a method is a generic method.    
4783
4784         * expression.cs (Invocation.InferTypeArguments): New static method;
4785         infer type arguments for generic method invocation.
4786
4787         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
4788         property; we set this to true if we're resolving a generic method
4789         invocation and the user specified type arguments, ie. we're not
4790         doing type inference.
4791
4792 2004-03-20  Martin Baulig  <martin@ximian.com>
4793
4794         * class.cs (MethodData.DeclaringType): New public property.
4795         (MethodData.Define): Set DeclaringType here.
4796         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
4797         instead of OperatorMethodBuilder.DeclaringType.
4798
4799 2004-03-20  Martin Baulig  <martin@ximian.com>
4800
4801         * cs-tokenizer.cs (xtoken): Return a special
4802         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
4803
4804         * cs-parser.jay (default_value_expression): Switch to the new
4805         syntax (14.5.13).
4806
4807 2004-03-19  Martin Baulig  <martin@ximian.com>
4808
4809         * decl.cs (MemberName): New class.  We use this to "construct"
4810         namespace_or_type_name's.
4811
4812         * generics.cs (TypeArguments.GetDeclarations): New public method;
4813         returns the type arguments as a string[] and reports a CS0081 if
4814         one of them is not an identifier.
4815
4816         * class.cs (MemberBase): The .ctor now takes the name as a
4817         MemberName instead of a string.
4818         (MemberBase.ExplicitInterfaceName): Changed type from string to
4819         Expression.
4820         (MemberBase.DoDefine): If we're an explicit implementation, the
4821         InterfaceType may be a generic instance.
4822
4823         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
4824         (namespace_name): Call MemberName.GetName () to transform the
4825         MemberName into a string and ensure we don't have any type
4826         arguments.
4827         (type_name): Call MemberName.GetTypeExpression() to transfrom the
4828         MemberName into an expression.
4829         (method_header): Use namespace_or_type_name instead of member_name.     
4830
4831 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
4832
4833         * rootcontext.cs: Add new types to the boot resolution.
4834
4835         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
4836         MulticastDelegate is not allowed.
4837
4838         * typemanager.cs: Add new types to lookup: System.TypedReference
4839         and ArgIterator.
4840
4841         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
4842         check for TypedReference or ArgIterator, they are not allowed. 
4843
4844         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
4845         makes us properly catch 1510 in some conditions (see bug 56016 for
4846         details). 
4847
4848 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
4849
4850         * CryptoConvert.cs: update from corlib version
4851         with endian fixes.
4852
4853 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
4854
4855         * class.cs (Indexer.Define): Check indexername declaration
4856
4857 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
4858
4859         * attribute.cs (IsClsCompliant): Fixed problem with handling
4860         all three states (compliant, not-compliant, undetected).
4861
4862 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
4863
4864         * attribute.cs (Attribute): Location is now public.
4865         (Resolve): Store resolved arguments (pos_values) in attribute class.
4866         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
4867         (GetClsCompliantAttributeValue): New method that gets
4868         CLSCompliantAttribute value.
4869         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
4870         if exists else null.
4871         (AttributeTester): New class for CLS-Compliant verification routines.
4872
4873         * class.cs (Emit): Add CLS-Compliant verification.
4874         (Method.GetSignatureForError): Implemented.
4875         (Constructor.GetSignatureForError): Implemented
4876         (Constructor.HasCompliantArgs): Returns if constructor has
4877         CLS-Compliant arguments.
4878         (Constructor.Emit): Override.
4879         (Construcor.IsIdentifierClsCompliant): New method; For constructors
4880         is needed to test only parameters.
4881         (FieldBase.GetSignatureForError): Implemented.
4882         (TypeContainer): New member for storing base interfaces.
4883         (TypeContainer.FindMembers): Search in base interfaces too.
4884
4885         * codegen.cs (GetClsComplianceAttribute): New method that gets
4886         assembly or module CLSCompliantAttribute value.
4887         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
4888         for assembly.
4889         (ModuleClass.Emit): Add error 3012 test.
4890
4891         * const.cs (Emit): Override and call base for CLS-Compliant tests.
4892
4893         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
4894         state for all decl types.
4895         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
4896         if CLS-Compliant tests are required.
4897         (IsClsCompliaceRequired): New method. Analyze whether code
4898         must be CLS-Compliant.
4899         (IsExposedFromAssembly): New method. Returns true when MemberCore
4900         is exposed from assembly.
4901         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
4902         value or gets cached value.
4903         (HasClsCompliantAttribute): New method. Returns true if MemberCore
4904         is explicitly marked with CLSCompliantAttribute.
4905         (IsIdentifierClsCompliant): New abstract method. This method is
4906         used to testing error 3005.
4907         (IsIdentifierAndParamClsCompliant): New method. Common helper method
4908         for identifier and parameters CLS-Compliant testing.
4909         (VerifyClsCompliance): New method. The main virtual method for
4910         CLS-Compliant verifications.
4911         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
4912         null. I don't know why is null (too many public members !).
4913         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
4914         and get value of first CLSCompliantAttribute that found.
4915
4916         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
4917         (VerifyClsCompliance): Override and add extra tests.
4918
4919         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
4920         clscheck- disable CLS-Compliant verification event if assembly is has
4921         CLSCompliantAttribute(true).
4922
4923         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
4924         ApllyAttribute is now called in emit section as in the other cases.
4925         Possible future Emit integration.
4926         (IsIdentifierClsCompliant): New override.
4927         (VerifyClsCompliance): New override.
4928         (GetEnumeratorName): Returns full enum name.
4929
4930         * parameter.cs (GetSignatureForError): Implemented.
4931
4932         * report.cs (WarningData): New struct for Warning message information.
4933         (LocationOfPreviousError): New method.
4934         (Warning): New method. Reports warning based on the warning table.
4935         (Error_T): New method. Reports error based on the error table.
4936
4937         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
4938         verifications are done here.
4939
4940         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
4941
4942         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
4943         CLSCompliantAttribute.
4944         (all_imported_types): New member holds all imported types from other
4945         assemblies.
4946         (LoadAllImportedTypes): New method fills static table with exported types
4947         from all referenced assemblies.
4948         (Modules): New property returns all assembly modules.
4949
4950 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
4951
4952         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
4953         throwing a parser error.
4954
4955         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
4956         which removes the hardcoded get_/set_ prefixes for properties, as
4957         IL allows for the properties to be named something else.  
4958
4959         Bug #56013
4960
4961         * expression.cs: Do not override operand before we know if it is
4962         non-null.  Fix 56207
4963
4964 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4965
4966         * typemanager.cs: support for pinned variables.
4967
4968 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4969
4970         * decl.cs, typemanager.cs: Avoid using an arraylist
4971         as a buffer if there is only one result set.
4972
4973 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4974
4975         * expression.cs: Make sure you cant call a static method
4976         with an instance expression, bug #56174.
4977
4978 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
4979
4980         * class.cs (IsDuplicateImplementation): Improve error reporting to
4981         flag 663 (method only differs in parameter modifier).
4982
4983         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
4984         in preprocessor directives.
4985
4986         * location.cs (LookupFile): Allow for the empty path.
4987
4988         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
4989         better approach for some of that patch, but its failing with the
4990         CharSet enumeration.  For now try/catch will do.
4991
4992         * typemanager.cs: Do not crash if a struct does not have fields.
4993         Fixes 56150.
4994
4995 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4996
4997         * expression.cs: cs0213, cant fix a fixed expression.
4998         fixes 50231.
4999
5000 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5001
5002         * cs-parser.jay: detect invalid embeded statements gracefully.
5003         bug #51113.
5004
5005 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5006
5007         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
5008         As a regex:
5009         s/
5010         the invocation type may not be a subclass of the tye of the item/
5011         The type of the item must be a subclass of the invocation item.
5012         /g
5013
5014         Fixes bug #50820.
5015
5016 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
5017
5018         * attribute.cs: Added methods to get a string and a bool from an
5019         attribute. Required to information from AssemblyKeyFileAttribute,
5020         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
5021         * codegen.cs: Modified AssemblyName creation to include support for
5022         strongnames. Catch additional exceptions to report them as CS1548.
5023         * compiler.csproj: Updated include CryptoConvert.cs.
5024         * compiler.csproj.user: Removed file - user specific configuration.
5025         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
5026         Mono.Security assembly. The original class is maintained and tested in
5027         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
5028         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
5029         like CSC 8.0 (C# v2) supports.
5030         * Makefile: Added CryptoConvert.cs to mcs sources.
5031         * rootcontext.cs: Added new options for strongnames.
5032
5033 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
5034
5035         * driver.cs: For --expect-error, report error code `2'
5036         if the program compiled with no errors, error code `1' if
5037         it compiled with an error other than the one expected.
5038
5039 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
5040
5041         * compiler.csproj: Updated for Visual Studio .NET 2003.
5042         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
5043         * compiler.sln: Updated for Visual Studio .NET 2003.
5044
5045 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
5046
5047         * expression.cs: Fix bug #47234. We basically need to apply the
5048         rule that we prefer the conversion of null to a reference type
5049         when faced with a conversion to 'object' (csc behaviour).
5050
5051 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5052
5053         * statement.cs: Shorter form for foreach, eliminates
5054         a local variable. r=Martin.
5055
5056 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5057
5058         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
5059         checks if we can use brtrue/brfalse to test for 0.
5060         * expression.cs: use the above in the test for using brtrue/brfalse.
5061         cleanup code a bit.
5062
5063 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5064
5065         * expression.cs: Rewrite string concat stuff. Benefits:
5066
5067         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
5068         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
5069         rather than a concat chain.
5070
5071         * typemanager.cs: Add lookups for more concat overloads.
5072
5073 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5074
5075         * expression.cs: Emit shorter il code for array init.
5076
5077         newarr
5078         dup
5079         // set 1
5080
5081         // set 2
5082
5083         newarr
5084         stloc.x
5085
5086         ldloc.x
5087         // set 1
5088
5089         ldloc.x
5090         // set 2
5091
5092 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
5093
5094         * statement.cs: Before, two switch blocks would be merged if the
5095         total size of the blocks (end_item - begin_item + 1) was less than
5096         two times the combined sizes of the blocks.
5097
5098         Now, it will only merge if after the merge at least half of the
5099         slots are filled.
5100
5101         fixes 55885.
5102
5103 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
5104
5105         * class.cs : csc build fix for GetMethods(). See bug #52503.
5106
5107 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
5108
5109         * expression.cs: Make sure fp comparisons work with NaN.
5110         This fixes bug #54303. Mig approved this patch a long
5111         time ago, but we were not able to test b/c the runtime
5112         had a related bug.
5113
5114 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
5115
5116         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
5117
5118 2004-03-19  Martin Baulig  <martin@ximian.com>
5119
5120         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
5121         two overloads may unify for some type parameter substitutions and
5122         report a CS0408 if appropriate.
5123
5124 2004-03-19  Martin Baulig  <martin@ximian.com>
5125
5126         * class.cs (MemberCore.IsDuplicateImplementation): Report the
5127         error here and not in our caller.
5128
5129 2004-03-19  Martin Baulig  <martin@ximian.com>
5130
5131         * interface.cs: Completely killed this file.
5132         (Interface): We're now a TypeContainer and live in class.cs.
5133
5134         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
5135         argument; we're now also called for interfaces.
5136         (TypeContainer.DefineMembers): Allow this method being called
5137         multiple times.
5138         (TypeContainer.GetMethods): New public method; formerly known as
5139         Interface.GetMethod().  This is used by PendingImplementation.
5140         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
5141         it's now private and non-static.
5142         (Interface): Moved this here; it's now implemented similar to
5143         Class and Struct.
5144         (Method, Property, Event, Indexer): Added `bool is_interface'
5145         argument to their .ctor's.
5146         (MemberBase.IsInterface): New public field.
5147
5148         * cs-parser.jay: Create normal Method, Property, Event, Indexer
5149         instances instead of InterfaceMethod, InterfaceProperty, etc.
5150         (opt_interface_base): Removed; we now use `opt_class_base' instead.
5151         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
5152
5153 2004-03-19  Martin Baulig  <martin@ximian.com>
5154
5155         * class.cs (MethodCore.IsDuplicateImplementation): New private
5156         method which does the CS0111 checking.
5157         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
5158         Use IsDuplicateImplementation().
5159
5160 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
5161
5162         * decl.cs (FindMemberToOverride): New method to find the correct
5163         method or property to override in the base class.
5164         * class.cs
5165             - Make Method/Property use the above method to find the
5166               version in the base class.
5167             - Remove the InheritableMemberSignatureCompare as it is now
5168               dead code.
5169
5170         This patch makes large code bases much faster to compile, as it is
5171         O(n) rather than O(n^2) to do this validation.
5172
5173         Also, it fixes bug 52458 which is that nested classes are not
5174         taken into account when finding the base class member.
5175
5176         Reviewed/Approved by Martin.
5177
5178 2004-03-17  Martin Baulig  <martin@ximian.com>
5179
5180         * expression.cs (MemberAccess.DoResolve): Take the parent's number
5181         of type arguments into account; use the `real_num_type_args'
5182         approach like in DoResolveAsTypeStep().
5183
5184         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
5185         nested types.
5186
5187 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
5188
5189         * interface.cs: In all interface classes removed redundant
5190         member initialization.
5191
5192 2004-03-16  Martin Baulig  <martin@ximian.com>
5193
5194         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
5195
5196 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
5197
5198         * decl.cs (DefineTypeAndParents): New helper method to define a
5199         type's containers before the type itself is defined;  This is a
5200         bug exposed by the recent changes to Windows.Forms when an
5201         implemented interface was defined inside a class that had not been
5202         built yet.   
5203
5204         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
5205
5206         (Check): Loop correctly to report errors modifiers
5207         (UNSAFE was not in the loop, since it was the same as TOP).
5208
5209         * interface.cs: Every interface member now takes a ModFlags,
5210         instead of a "is_new" bool, which we set on the base MemberCore. 
5211
5212         Every place where we called "UnsafeOk" in the interface, now we
5213         call the proper member (InterfaceMethod.UnsafeOK) instead to get
5214         the unsafe settings from the member declaration instead of the
5215         container interface. 
5216
5217         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
5218
5219         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
5220         `set_indexer_name' to the pending bits (one per type).
5221
5222         We fixed a bug today that was picking the wrong method to
5223         override, since for properties the existing InterfaceMethod code
5224         basically ignored the method name.  Now we make sure that the
5225         method name is one of the valid indexer names.
5226
5227 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
5228  
5229         * support.cs (SeekableStreamReader): Keep track of stream byte
5230         positions and don't mix them with character offsets to the buffer.
5231
5232         Patch from Gustavo Giráldez
5233
5234 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
5235
5236         * interface.cs (InterfaceSetGetBase): Removed double member
5237         initialization, base class does it as well.
5238
5239 2004-03-13  Martin Baulig  <martin@ximian.com>
5240
5241         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
5242         when compiling corlib.
5243
5244 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
5245
5246         * convert.cs (ExplicitConversion): We were reporting an error on
5247         certain conversions (object_type source to a value type, when the
5248         expression was `null') before we had a chance to pass it through
5249         the user defined conversions.
5250
5251         * driver.cs: Replace / and \ in resource specifications to dots.
5252         Fixes 50752
5253
5254         * class.cs: Add check for duplicate operators.  Fixes 52477
5255
5256 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
5257
5258         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
5259         that are in the middle of the statements, not only at the end.
5260         Fixes #54987
5261
5262         * class.cs (TypeContainer.AddField): No longer set the
5263         `HaveStaticConstructor' flag, now we call it
5264         `UserDefineStaticConstructor' to diferentiate the slightly
5265         semantic difference.
5266
5267         The situation is that we were not adding BeforeFieldInit (from
5268         Modifiers.TypeAttr) to classes that could have it.
5269         BeforeFieldInit should be set to classes that have no static
5270         constructor. 
5271
5272         See:
5273
5274         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
5275
5276         And most importantly Zoltan's comment:
5277
5278         http://bugzilla.ximian.com/show_bug.cgi?id=44229
5279
5280         "I think beforefieldinit means 'it's ok to initialize the type sometime 
5281          before its static fields are used', i.e. initialization does not need
5282          to be triggered by the first access to the type. Setting this flag
5283          helps the JIT to compile better code, since it can run the static
5284          constructor at JIT time, and does not need to generate code to call it
5285          (possibly lots of times) at runtime. Unfortunately, mcs does not set
5286          this flag for lots of classes like String. 
5287          
5288          csc sets this flag if the type does not have an explicit static 
5289          constructor. The reasoning seems to be that if there are only static
5290          initalizers for a type, and no static constructor, then the programmer
5291          does not care when this initialization happens, so beforefieldinit
5292          can be used.
5293          
5294          This bug prevents the AOT compiler from being usable, since it 
5295          generates so many calls to mono_runtime_class_init that the AOT code
5296          is much slower than the JITted code. The JITted code is faster, 
5297          because it does not generate these calls if the vtable is type is
5298          already initialized, which is true in the majority of cases. But the
5299          AOT compiler can't do this."
5300
5301 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
5302
5303         * class.cs (MethodData.Emit): Refactor the code so symbolic
5304         information is generated for destructors;  For some reasons we
5305         were taking a code path that did not generate symbolic information
5306         before. 
5307
5308 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
5309
5310         * class.cs: Create a Constructor.CheckBase method that
5311         takes care of all validation type code. The method
5312         contains some code that was moved from Define.
5313
5314         It also includes new code that checks for duplicate ctors.
5315         This fixes bug #55148.
5316
5317 2004-03-09  Joshua Tauberer <tauberer@for.net>
5318
5319         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
5320         a { ... }-style array creation invokes EmitStaticInitializers
5321         which is not good for reference-type arrays.  String, decimal
5322         and now null constants (NullCast) are not counted toward
5323         static initializers.
5324
5325 2004-03-05  Martin Baulig  <martin@ximian.com>
5326
5327         * location.cs (SourceFile.HasLineDirective): New public field;
5328         specifies whether the file contains or is referenced by a "#line"
5329         directive.
5330         (Location.DefineSymbolDocuments): Ignore source files which
5331         either contain or are referenced by a "#line" directive.        
5332
5333 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
5334
5335         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
5336         direct access to our parent, so check the method inline there.
5337
5338 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
5339
5340         * expression.cs (Invocation.EmitCall): Miguel's last commit
5341         caused a regression. If you had:
5342
5343             T t = null;
5344             t.Foo ();
5345
5346         In Foo the implict this would be null.
5347
5348 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
5349
5350         * expression.cs (Invocation.EmitCall): If the method is not
5351         virtual, do not emit a CallVirt to it, use Call.
5352
5353         * typemanager.cs (GetFullNameSignature): Improve the method to
5354         cope with ".ctor" and replace it with the type name.
5355
5356         * class.cs (ConstructorInitializer.Resolve): Now the method takes
5357         as an argument the ConstructorBuilder where it is being defined,
5358         to catch the recursive constructor invocations.
5359
5360 2004-03-16  Martin Baulig  <martin@ximian.com>
5361
5362         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
5363         ConstructedType, call ResolveType() on it to get the type rather
5364         than just using `expr.Type'.
5365
5366 2004-03-16  Martin Baulig  <martin@ximian.com>
5367
5368         * generics.cs (ConstructedType.GetMemberAccess): Take the
5369         EmitContext instead on the TypeExpr and use
5370         ec.TypeContainer.CurrentType/ec.ContainerType.
5371
5372 2004-03-16  Martin Baulig  <martin@ximian.com>
5373
5374         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
5375         parameters before aliases.
5376
5377 2004-03-16  Martin Baulig  <martin@ximian.com>
5378
5379         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
5380         New oublic function; checks whether two generic instances may become
5381         equal under some instantiations (26.3.1).
5382
5383         * class.cs (TypeContainer.Define): Call
5384         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
5385         error.
5386
5387 2004-03-16  Martin Baulig  <martin@ximian.com>
5388
5389         * class.cs (TypeContainer.GetClassBases): Moved
5390         Error_TypeParameterAsBase() here and also check whether the base
5391         class is not an attribute.
5392
5393 2004-03-16  Martin Baulig  <martin@ximian.com>
5394
5395         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
5396
5397 2004-03-16  Martin Baulig  <martin@ximian.com>
5398
5399         * class.cs (Error_TypeParameterAsBase): Use correct error number
5400         here (CS0689).  
5401
5402 2004-03-16  Martin Baulig  <martin@ximian.com>
5403
5404         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
5405         for generics.
5406
5407         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
5408         error reporting.
5409
5410 2004-03-15  Martin Baulig  <martin@ximian.com>
5411
5412         * typemanager.cs (TypeManager.GetFullName): New public method.
5413         (TypeManager.MemberLookup): Added `int_num_type_arguments'
5414         argument; only return members with the correct number of type
5415         arguments.
5416         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
5417         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
5418         whether the number of type arguments matches.
5419
5420         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
5421         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
5422
5423         * expression.cs (MemberAccess): Added public `NumTypeArguments'
5424         field; it's set by the protected .ctor when we're actually a
5425         GenericMemberAccess.
5426         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
5427         arguments and pass it to MemberLookupFinal ().
5428
5429         * ecore.cs (Expression.MemberLookup): Added `int
5430         num_type_arguments' argument; only return members with the correct
5431         number of type arguments.
5432         (Expression.MemberLookupFailed): Check whether the MemberLookup
5433         failed because we did not have the correct number of type
5434         arguments; report CS0305 in this case.
5435
5436         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
5437         `e.ResolveAsTypeTerminal()' already did so.
5438
5439 2004-03-15  Martin Baulig  <martin@ximian.com>
5440
5441         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
5442         we're a ConstructedType; in this case, the caller must report an
5443         error (for instance CS0131).
5444
5445         * generic.cs (TypeArguments): Added Location argument to the .ctor.
5446         (TypeArguments.Resolve): Actually report errors here.
5447
5448 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
5449
5450         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
5451         `set_indexer_name' to the pending bits (one per type).
5452
5453         We fixed a bug today that was picking the wrong method to
5454         override, since for properties the existing InterfaceMethod code
5455         basically ignored the method name.  Now we make sure that the
5456         method name is one of the valid indexer names.
5457
5458 2004-03-15  Martin Baulig  <martin@ximian.com>
5459
5460         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
5461         for generic instances.
5462
5463 2004-03-13  Martin Baulig  <martin@ximian.com>
5464
5465         * class.cs (TypeContainer.DefineType): Call
5466         TypeManager.AddUserType() immediately after creating the
5467         TypeBuilder; pass all type parameters when creating the
5468         CurrentType.
5469
5470         * decl.cs (DeclSpace.FindNestedType): New public method.
5471         (DeclSpace.FindType): Added `int num_type_args' argument; only
5472         return types with the correct number of type parameters.
5473         (DeclSpace.CountTypeParams): New public property.
5474
5475         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
5476         the number of type parameters; defaults to zero.
5477
5478         * generic.cs (TypeArguments.Count): New public property.
5479         (ConstructedType.DoResolveAsTypeStep): First call
5480         ds.FindNestedType() to find out whether we're nested in the
5481         current generic type; in this case, we inherit all type parameters
5482         from the current class.
5483
5484         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
5485         num_type_args' argument.
5486         (RootContext.LookupType): Added overloaded version which takes the
5487         number of type arguments; only return types with the correct
5488         number of type arguments.
5489
5490         * typemanager.cs (TypeManager.CheckGeneric): New public function;
5491         checks whether `Type t' has `int num_type_args'.
5492
5493 2004-03-13  Martin Baulig  <martin@ximian.com>
5494
5495         * generic.cs (GenericMethod.DefineType): New method; calls
5496         DefineType() on all the type parameters.
5497
5498         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
5499         (MethodData.Define): If we're a generic method, call
5500         GenericMethod.DefineType() to define the type parameters.       
5501
5502 2004-03-10  Martin Baulig  <martin@ximian.com>
5503
5504         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
5505         instead of IsAssignableFrom.    
5506
5507 2004-03-10  Martin Baulig  <martin@ximian.com>
5508
5509         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
5510
5511         * support.cs (ParameterData.HasArrayParameter): New property.
5512         (ReflectionParameters.ctor): Take a MethodBase instead of a
5513         ParameterInfo[].  If we have any type parameters, get the generic
5514         method definition and ask it whether we have variable arguments.
5515
5516 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
5517
5518         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
5519         routines to check if a type is an enumerable/enumerator allow
5520         classes that implement the IEnumerable or IEnumerator interfaces.
5521
5522         * class.cs (Property, Operator): Implement IIteratorContainer, and
5523         implement SetYields.
5524
5525         (Property.Define): Do the block swapping for get_methods in the
5526         context of iterators.   We need to check if Properties also
5527         include indexers or not.
5528
5529         (Operator): Assign the Block before invoking the
5530         OperatorMethod.Define, so we can trigger the Iterator code
5531         replacement. 
5532
5533         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
5534         Property and Operator classes are not created when we parse the
5535         declarator but until we have the block completed, so we use a
5536         singleton SimpleIteratorContainer.Simple to flag whether the
5537         SetYields has been invoked.
5538
5539         We propagate this setting then to the Property or the Operator to
5540         allow the `yield' to function.
5541
5542 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
5543
5544         * codegen.cs: Implemented attribute support for modules.
5545         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
5546         Assembly/Module functionality.
5547
5548         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
5549         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
5550         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
5551
5552 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
5553
5554         * interface.cs (FindMembers): The operation is performed on all base
5555         interfaces and not only on the first. It is required for future CLS Compliance patch.
5556
5557 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
5558
5559         * statement.cs, codegen.cs:
5560         This patch deals with patterns such as:
5561
5562         public class List : IEnumerable {
5563
5564                 public MyEnumerator GetEnumerator () {
5565                         return new MyEnumerator(this);
5566                 }
5567
5568                 IEnumerator IEnumerable.GetEnumerator () {
5569                         ...
5570                 }
5571                 
5572                 public struct MyEnumerator : IEnumerator {
5573                         ...
5574                 }
5575         }
5576
5577         Before, there were a few things we did wrong:
5578         1) we would emit callvirt on a struct, which is illegal
5579         2) we emited ldarg when we needed to emit ldarga
5580         3) we would mistakenly call the interface methods on an enumerator
5581         type that derived from IEnumerator and was in another assembly. For example:
5582
5583         public class MyEnumerator : IEnumerator
5584
5585         Would have the interface methods called, even if there were public impls of the
5586         method. In a struct, this lead to invalid IL code.
5587
5588 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
5589
5590         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
5591           renamed to Emit.
5592
5593         * delegate.cs (Define): Fixed crash when delegate type is undefined.
5594
5595 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
5596
5597         * cs-parser.jay: Fix small regression: we were not testing V2
5598         compiler features correctly.
5599
5600         * interface.cs: If the emit context is null, then create one
5601
5602 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
5603
5604         * decl.cs (GetSignatureForError): New virtual method to get full name
5605           for error messages.
5606
5607         * attribute.cs (IAttributeSupport): New interface for attribute setting.
5608           Now it is possible to rewrite ApplyAttributes method to be less if/else.
5609
5610         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
5611           Duplicated members and code in these classes has been removed.
5612           Better encapsulation in these classes.
5613
5614 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
5615
5616         * assign.cs (Assign.DoResolve): When dealing with compound
5617         assignments, there is a new rule in ECMA C# 2.4 (might have been
5618         there before, but it is documented here) that states that in:
5619
5620         a op= b;
5621
5622         If b is of type int, and the `op' is a shift-operator, then the
5623         above is evaluated as:
5624
5625         a = (int) a op b 
5626
5627         * expression.cs (Binary.ResolveOperator): Instead of testing for
5628         int/uint/long/ulong, try to implicitly convert to any of those
5629         types and use that in pointer arithmetic.
5630
5631         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
5632         method to print information for from the type, not from the
5633         null-method we were given.
5634
5635 2004-02-01  Duncan Mak  <duncan@ximian.com>
5636
5637         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
5638         parsing for cmd, fixes bug #53694.
5639
5640 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
5641
5642         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
5643         in the member name duplication tests. Property and operator name duplication
5644         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
5645
5646 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
5647
5648         * interface.cs (PopulateMethod): Fixed crash when interface method
5649         returns not existing type (error test cs0246-3.cs).
5650
5651 2004-02-02  Ravi Pratap M <ravi@ximian.com>
5652
5653         * cs-parser.jay (interface_accessors): Re-write actions to also
5654         store attributes attached to get and set methods. Fix spelling
5655         while at it.
5656
5657         (inteface_property_declaration): Modify accordingly.
5658
5659         (InterfaceAccessorInfo): New helper class to store information to pass
5660         around between rules that use interface_accessors.
5661
5662         * interface.cs (Emit): Apply attributes on the get and set
5663         accessors of properties and indexers too.
5664
5665         * attribute.cs (ApplyAttributes): Modify accordingly to use the
5666         right MethodBuilder when applying attributes to the get and set accessors.
5667
5668 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
5669
5670         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
5671
5672 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
5673
5674         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
5675
5676 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
5677
5678         * cs-parser.jay: Remove YIELD token, instead use the new grammar
5679         changes that treat `yield' specially when present before `break'
5680         or `return' tokens.
5681
5682         * cs-tokenizer.cs: yield is no longer a keyword.
5683
5684 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
5685
5686         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
5687         setting for default constructors.
5688         For default constructors are almost every time set wrong Modifier. The
5689         generated IL code has been alright. But inside mcs this values was
5690         wrong and this was reason why several of my CLS Compliance tests
5691         failed.
5692
5693 2004-02-27  Martin Baulig  <martin@ximian.com>
5694
5695         * generics.cs (ConstructedType.ResolveType): Make the nested type
5696         stuff actually work.
5697
5698 2004-02-25  Martin Baulig  <martin@ximian.com>
5699
5700         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
5701         property; returns the type parameters just from the current type,
5702         ie. with the ones from outer classes.
5703         (DeclSpace.LookupGeneric): First search in the current class, then
5704         in outer classes.
5705         (DeclSpace.initialize_type_params): When hiding a type parameter
5706         from an outer class, put it into the `type_param_list' anyways.
5707
5708         * expression.cs (MemberAccess.expr): Made this field protected.
5709
5710         * class.cs (TypeContainer.Define): The `CurrentType' just contains
5711         the type parameters from the current class.
5712
5713         * generic.cs (ConstructedType.ResolveType): Support nested generic
5714         types by taking the type parameters which we inherit from outer
5715         classes into account.
5716         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
5717         support for nested generic types.
5718
5719 2004-02-23  Martin Baulig  <martin@ximian.com>
5720
5721         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
5722         field and check whether we're nested inside a generic type.
5723         (DeclSpace.ResolveType): If we're resolving to a generic type
5724         definition, create a ConstructedType and return its resolved type.
5725         (DeclSpace.initialize_type_params): New private method;
5726         initializes the `type_param_list' field from the type parameters
5727         from this and all enclosing classes.
5728         (DeclSpace.TypeParameters): Call initialize_type_params() unless
5729         we're already initialized.
5730
5731 2004-02-23  Martin Baulig  <martin@ximian.com>
5732
5733         * class.cs (Method.Define): Create the generic method before
5734         calling DoDefine().
5735         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
5736         the TypeContainer one); we use this for generic methods.
5737
5738         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
5739         parent's TypeBuilder.
5740
5741 2004-02-18  Martin Baulig  <martin@ximian.com>
5742
5743         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
5744         to check for equality.
5745
5746 2004-02-05  Martin Baulig  <martin@ximian.com>
5747
5748         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
5749         `ec.TypeContainer.CurrentType', use it instead of
5750         `ec.ContainerType' to check whether we're in the type's ctor.
5751
5752 2004-01-29  Martin Baulig  <martin@ximian.com>
5753
5754         * expression.cs (Invocation.DoResolve): If we're a
5755         `ConstructedType', then we're actually a generic method, so
5756         rewrite the expr as a GenericMemberAccess.
5757
5758         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
5759         here; manually parse it into a string.
5760
5761 2004-01-28  Martin Baulig  <martin@ximian.com>
5762
5763         * typemanager.cs (TypeManager.IsEqual): New static method.
5764         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
5765         check for equality instead of using `=='.
5766
5767 2004-01-26  Martin Baulig  <martin@ximian.com>
5768
5769         * decl.cs (DeclSpace.CurrentType): New public field.
5770
5771         * expression.cs (This.ResolveBase): If we have an
5772         `ec.TypeContainer.CurrentType', use it instead of
5773         `ec.ContainerType'.
5774
5775         * class.cs (TypeContainer.DefineType): If we're a generic type,
5776         create the `CurrentType' (unresolved).
5777         (TypeContainer.GenericType): New private field.
5778         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
5779         it and store it in `GenericType' before creating the MemberCache.
5780         (TypeContainer.GetMembers): If we have a `GenericType', call
5781         TypeManager.FindMembers() on it.
5782
5783         * interface.cs (Interface.GenericType): New private field.
5784         (Interface.DefineType): If we're a generic type, create the
5785         `CurrentType' (unresolved).
5786         (Interface.DefineMembers): If we have a `CurrentType', resolve it
5787         and store it in `GenericType' before creating the MemberCache.
5788         (Interface.GetMembers): If we have a `GenericType', call
5789         TypeManager.FindMembers() on it.
5790
5791 2004-01-22  Martin Baulig  <martin@ximian.com>
5792
5793         * cs-parser.jay (namespace_or_type_name): Return an Expression,
5794         not a QualifiedIdentifier.  This is what `type_name_expression'
5795         was previously doing.
5796         (type_name_expression): Removed; the code is now in
5797         `namespace_or_type_name'.
5798         (qualified_identifier): Removed, use `namespace_or_type_name'
5799         instead.
5800         (QualifiedIdentifier): Removed this class.      
5801
5802 2004-01-22  Martin Baulig  <martin@ximian.com>
5803
5804         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
5805         not a string as alias name.
5806
5807 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
5808
5809         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
5810         #52730 bug, and instead compute correctly the need to use a
5811         temporary variable when requesting an address based on the
5812         static/instace modified of the field and the constructor.
5813  
5814 2004-01-21  Martin Baulig  <martin@ximian.com>
5815
5816         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
5817         class and namespace before looking up aliases.  Fixes #52517.
5818
5819 2004-01-21  Martin Baulig  <martin@ximian.com>
5820
5821         * flowanalysis.cs (UsageVector.Merge): Allow variables being
5822         assinged in a 'try'; fixes exception4.cs.
5823
5824 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5825         * class.cs : Implemented parameter-less constructor for TypeContainer
5826
5827         * decl.cs: Attributes are now stored here. New property OptAttributes
5828
5829         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
5830
5831         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
5832
5833 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5834
5835         * typemanager.cs (CSharpSignature): Now reports also inner class name.
5836           (CSharpSignature): New method for indexer and property signature.
5837
5838 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5839
5840         * pending.cs (IsVirtualFilter): Faster implementation.
5841
5842 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5843
5844         * typemanager.cs: Avoid inclusion of same assembly more than once.
5845
5846 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5847
5848         * cs-parser.jay: Fixed problem where the last assembly attribute
5849           has been applied also to following declaration (class, struct, etc.)
5850           
5851 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5852
5853         * class.cs: Added error CS0538, CS0539 reporting.
5854         Fixed crash on Microsoft runtime when field type is void.
5855
5856         * cs-parser.jay: Added error CS0537 reporting.
5857
5858         * pending.cs: Added error CS0535 reporting.
5859         Improved error report for errors CS0536, CS0534.
5860
5861 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
5862
5863         Merge a few bits from the Anonymous Method MCS tree.
5864
5865         * statement.cs (ToplevelBlock): New class for toplevel methods,
5866         will hold anonymous methods, lifted variables.
5867
5868         * cs-parser.jay: Create toplevel blocks for delegates and for
5869         regular blocks of code. 
5870
5871 2004-01-20  Martin Baulig  <martin@ximian.com>
5872
5873         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
5874         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
5875         and `NeedExplicitReturn'; added `IsLastStatement'.
5876         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
5877         have a `ReturnLabel' or we're not unreachable.
5878
5879         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
5880         child's reachability; don't just override ours with it.  Fixes
5881         #58058 (lluis's example).
5882         (FlowBranching): Added public InTryOrCatch(), InCatch(),
5883         InFinally(), InLoop(), InSwitch() and
5884         BreakCrossesTryCatchBoundary() methods.
5885
5886         * statement.cs (Return): Do all error checking in Resolve().
5887         Unless we are the last statement in a top-level block, always
5888         create a return label and jump to it.
5889         (Break, Continue): Do all error checking in Resolve(); also make
5890         sure we aren't leaving a `finally'.
5891         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
5892         statement in a top-level block.
5893         (Block.Flags): Added `IsDestructor'.
5894         (Block.IsDestructor): New public property.
5895
5896 2004-01-20  Martin Baulig  <martin@ximian.com>
5897
5898         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
5899
5900 2004-01-20  Martin Baulig  <martin@ximian.com>
5901
5902         * statement.cs (Statement.ResolveUnreachable): New public method.
5903         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
5904         (Block.Resolve): Resolve unreachable statements.
5905
5906 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
5907
5908         * expression.cs: We need to fix the case where we do
5909         not have a temp variable here.
5910
5911         * assign.cs: Only expression compound assignments need
5912         temporary variables.
5913
5914 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
5915
5916         * flowanalysis.cs: Reduce memory allocation in a few ways:
5917           - A block with no variables should not allocate a bit
5918             vector for itself.
5919           - A method with no out parameters does not need any tracking
5920             for assignment of the parameters, so we need not allocate
5921             any data for it.
5922           - The arrays:
5923                 public readonly Type[] VariableTypes;
5924                 public readonly string[] VariableNames;
5925             Are redundant. The data is already stored in the variable
5926             map, so we need not allocate another array for it.
5927           - We need to add alot of checks for if (params | locals) == null
5928             due to the first two changes.
5929
5930 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
5931
5932         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
5933         implement IMemoryLocation, we store a copy on a local variable and
5934         take the address of it.  Patch from Benjamin Jemlich
5935
5936         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
5937         to use a special "type_name_expression" rule which reduces the
5938         number of "QualifiedIdentifier" classes created, and instead
5939         directly creates MemberAccess expressions.
5940
5941 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
5942
5943         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
5944         that fixes #52853.  Null literal assignment to ValueType
5945
5946         * class.cs (MethodData.Emit): Instead of checking the name of the
5947         method to determine if its a destructor, create a new derived
5948         class from Method called Destructor, and test for that.  
5949
5950         * cs-parser.jay: Create a Destructor object instead of a Method.  
5951
5952         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
5953
5954         Fixes: 52933
5955
5956 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
5957
5958         * expression.cs (Binary.ResolveOperator): Perform an implicit
5959         conversion from MethodGroups to their delegate types on the
5960         Addition operation.
5961
5962         * delegate.cs: Introduce a new class DelegateCreation that is the
5963         base class for `NewDelegate' and `ImplicitDelegateCreation',
5964         factor some code in here.
5965
5966         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
5967         conversion from MethodGroups to compatible delegate types. 
5968
5969         * ecore.cs (Expression.Resolve): Do not flag error 654
5970         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
5971         we allow conversions from MethodGroups to delegate types now.
5972
5973         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
5974         assignments in v2 either.
5975
5976 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
5977
5978         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
5979         static read-only fields in ctors.
5980
5981         Applied patch from Benjamin Jemlich 
5982
5983         * expression.cs (UnaryMutator): Avoid leaking local variables. 
5984
5985 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
5986
5987         * cs-tokenizer.cs (IsCastToken): Allow the various native types
5988         here to return true, as they can be used like this:
5989
5990                 (XXX) int.MEMBER ()
5991
5992         Fixed 49836 and all the other dups
5993
5994 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
5995
5996         * driver.cs: Implement /win32res and /win32icon.
5997
5998 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
5999
6000         * cs-parser.jay: Add a rule to improve error handling for the
6001         common mistake of placing modifiers after the type.
6002
6003 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
6004
6005         * cs-parser.jay (interface_event_declaration): Catch
6006         initialization of events on interfaces, and report cs0068
6007
6008         * cs-parser.jay (interface_event_declaration): Catch
6009         initialization of events. 
6010
6011         * ecore.cs: Better report missing constructors.
6012
6013         * expression.cs (Binary.ResolveOperator): My previous bug fix had
6014         the error reporting done in the wrong place.  Fix.
6015
6016         * expression.cs (Binary.ResolveOperator): Catch the 
6017         operator + (E x, E y) error earlier, and later allow for implicit
6018         conversions in operator +/- (E e, U x) from U to the underlying
6019         type of E.
6020
6021         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
6022         52596, if the container class is abstract, the default constructor
6023         is protected otherwise its public (before, we were always public).
6024
6025         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
6026         fixed statement.
6027
6028         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
6029         Jemlich that fixes bug #52597, MCS was generating invalid code for
6030         idisposable structs.   Thanks to Ben for following up with this
6031         bug as well.
6032
6033 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
6034
6035         * driver.cs: Allow assemblies without code to be generated, fixes
6036         52230.
6037
6038 2004-01-07  Nick Drochak <ndrochak@gol.com>
6039
6040         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
6041
6042 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
6043
6044         * cs-parser.jay: Add rules to improve error reporting if fields or
6045         methods are declared at the namespace level (error 116)
6046
6047         * Add rules to catch event add/remove
6048
6049 2004-01-04  David Sheldon <dave-mono@earth.li>
6050
6051   * expression.cs: Added matching ")" to error message for 
6052   CS0077
6053
6054 2004-01-03 Todd Berman <tberman@gentoo.org>
6055
6056         * ecore.cs, attribute.cs:
6057         Applying fix from #52429.
6058
6059 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6060
6061         * ecore.cs, expression.cs, statement.cs:
6062         Total rewrite of how we handle branching. We
6063         now handle complex boolean expressions with fewer
6064         jumps. As well if (x == 0) no longer emits a ceq.
6065
6066         if (x is Foo) is much faster now, because we generate
6067         better code.
6068
6069         Overall, we get a pretty big improvement on our benchmark
6070         tests. The code we generate is smaller and more readable.
6071
6072         I did a full two-stage bootstrap. The patch was reviewed
6073         by Martin and Miguel.
6074
6075 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6076
6077         * cs-parser.jay: Make primary_expression not take a QI.
6078         we dont need this because the member_access rule covers
6079         us here. So we replace the rule with just IDENTIFIER.
6080
6081         This has two good effects. First, we remove a s/r conflict.
6082         Second, we allocate many fewer QualifiedIdentifier objects.
6083
6084 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6085
6086         * attribute.cs: Handle MarshalAs attributes as pseudo, and
6087         set the correct information via SRE. This prevents
6088         hanging on the MS runtime. Fixes #29374.
6089
6090 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6091
6092         * convert.cs: correctly handle conversions to value types
6093         from Enum and ValueType as unboxing conversions.
6094
6095         Fixes bug #52569. Patch by Benjamin Jemlich.
6096
6097 2004-01-02  Ravi Pratap  <ravi@ximian.com>
6098
6099         * expression.cs (BetterConversion): Prefer int -> uint
6100         over int -> ulong (csc's behaviour). This fixed bug #52046.
6101
6102 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
6103
6104         * decl.cs (MemberCache.FindMembers): now returns a
6105         MemberInfo [].
6106
6107         * typemanager.cs: In general, go with with ^^.
6108         (CopyNewMethods): take an IList.
6109         (RealMemberLookup): Only allocate an arraylist
6110         if we copy from two sets of methods.
6111
6112         This change basically does two things:
6113         1) Fewer array lists allocated due to CopyNewMethods.
6114         2) the explicit cast in MemberList costed ALOT.
6115
6116 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
6117
6118         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
6119         a hashtable to avoid needless string allocations when an identifier is
6120         used more than once (the common case).
6121
6122 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
6123
6124         * pending.cs: MS's TypeBuilder.GetInterfaces ()
6125         is broken, it will not return anything. So, we
6126         have to use the information we have in mcs to
6127         do the task.
6128
6129         * typemanager.cs: Add a cache for GetInterfaces,
6130         since this will now be used more often (due to ^^)
6131
6132         (GetExplicitInterfaces) New method that gets the
6133         declared, not effective, interfaces on a type
6134         builder (eg, if you have interface IFoo, interface
6135         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
6136         { IBar }.
6137
6138         This patch makes MCS able to bootstrap itself on
6139         Windows again.
6140
6141 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
6142
6143         * expression.cs: Remove the Nop's that Miguel put
6144         in by mistake.
6145
6146 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6147
6148         * report.cs, codegen.cs: Give the real stack trace to
6149         the error when an exception is thrown.
6150
6151 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6152
6153         * decl.cs: only allocate hashtables for ifaces if 
6154         it is an iface!
6155
6156 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6157
6158         * expression.cs: fix the error from cs0121-2.cs
6159         (a parent interface has two child interfaces that
6160         have a function with the same name and 0 params
6161         and the function is called through the parent).
6162
6163 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
6164
6165         * class.cs, rootcontext.cs, typmanager.cs: do not
6166         leak pointers.
6167
6168 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
6169
6170         * codegen.cs: remove stack for the ec flow branching.
6171         It is already a linked list, so no need.
6172
6173 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
6174
6175         * Makefile: Allow custom profiler here.
6176
6177 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
6178
6179         * typemanager.cs (LookupType):
6180           - Use a static char [], because split takes
6181             a param array for args, so it was allocating
6182             every time.
6183           - Do not store true in a hashtable, it boxes.
6184
6185 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
6186
6187         * flowanalysis.cs: bytify common enums.
6188
6189 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6190
6191         * modifiers.cs: Add a new set of flags for the
6192         flags allowed on explicit interface impls.
6193         * cs-parser.jay: catch the use of modifiers in
6194         interfaces correctly.
6195         * class.cs: catch private void IFoo.Blah ().
6196
6197         All related to bug #50572.
6198
6199 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6200
6201         * decl.cs: Rewrite the consistant accessability checking.
6202         Accessability is not linear, it must be implemented in
6203         a tableish way. Fixes #49704.
6204
6205 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6206
6207         * expression.cs: Handle negation in a checked context.
6208         We must use subtraction from zero. Fixes #38674.
6209
6210 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
6211
6212         * class.cs: Ignore static void main in DLLs.
6213         * rootcontext.cs: Handle the target type here,
6214         since we are have to access it from class.cs
6215         * driver.cs: account for the above.
6216
6217 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
6218
6219         * report.cs: Give line numbers and files if available.
6220
6221 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
6222
6223         * driver.cs: Implement /addmodule.
6224
6225         * typemanager.cs:  Change 'modules' field so it now contains Modules not
6226         ModuleBuilders.
6227
6228 2003-12-20  Martin Baulig  <martin@ximian.com>
6229
6230         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
6231         (FieldBase.IsAssigned): Removed this field.
6232         (FieldBase.SetAssigned): New public method.
6233         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
6234
6235 2003-12-20  Martin Baulig  <martin@ximian.com>
6236
6237         * expression.cs (LocalVariableReference.DoResolve): Don't set
6238         `vi.Used' if we're called from DoResolveLValue().
6239
6240         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
6241         returns the usage vector it just merged into the current one -
6242         pass this one to UsageWarning().
6243         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
6244         of the `EmitContext', don't call this recursively on our children.
6245
6246 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
6247
6248         * driver.cs: Implement /target:module.
6249
6250 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
6251
6252         * support.cs (CharArrayHashtable): New helper class.
6253
6254         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
6255         char arrays, not strings, so we can avoid creating a string in
6256         consume_identifier if the identifier is a keyword.
6257
6258 2003-12-16  Martin Baulig  <martin@ximian.com>
6259
6260         * statement.cs (LocalInfo.Assigned): Removed this property.
6261         (LocalInfo.Flags): Removed `Assigned'.
6262         (LocalInfo.IsAssigned): New public method; takes the EmitContext
6263         and uses flow analysis.
6264         (Block.UsageWarning): Made this method private.
6265         (Block.Resolve): Call UsageWarning() if appropriate.
6266
6267         * expression.cs (LocalVariableReference.DoResolve): Always set
6268         LocalInfo.Used here.
6269
6270 2003-12-13  Martin Baulig  <martin@ximian.com>
6271
6272         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
6273         any value here; we're now using flow analysis to figure out
6274         whether a statement/block returns a value.
6275
6276 2003-12-13  Martin Baulig  <martin@ximian.com>
6277
6278         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
6279         working again.
6280         (FlowBranching.MergeFinally): Don't call
6281         `branching.CheckOutParameters()' here, this is called in
6282         MergeTopBlock().
6283         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
6284         when adding the `finally' vector.       
6285
6286 2003-12-13  Martin Baulig  <martin@ximian.com>
6287
6288         * flowanalysis.cs
6289         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
6290         actually work and also fix #48962.
6291
6292 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
6293
6294         * decl.cs: Do not check System.Object for nested types,
6295         since we know it does not have any. Big bang for buck:
6296
6297         BEFORE:
6298            Run 1:   8.35 seconds
6299            Run 2:   8.32 seconds
6300            corlib:  17.99 seconds
6301         AFTER:
6302            Run 1:   8.17 seconds
6303            Run 2:   8.17 seconds
6304            corlib:  17.39 seconds
6305
6306 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
6307
6308         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
6309         time we are returning 0 members, so we save alot here.
6310
6311 2003-12-11  Martin Baulig  <martin@ximian.com>
6312
6313         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
6314         `MergeChild()', also just take the `FlowBranching' as argument;
6315         call Merge() on it and return the result.
6316         (FlowBranching.Merge): We don't need to do anything if we just
6317         have one sibling.
6318
6319 2003-12-11  Martin Baulig  <martin@ximian.com>
6320
6321         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
6322         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
6323         Maurer for this idea.
6324
6325 2003-12-11  Martin Baulig  <martin@ximian.com>
6326
6327         * flowanalysis.cs (MergeResult): This class is now gone; we now
6328         use the `UsageVector' for this.  The reason for this is that if a
6329         branching just has one sibling, we don't need to "merge" them at
6330         all - that's the next step to do.
6331         (FlowBranching.Merge): We now return a `UsageVector' instead of a
6332         `MergeResult'.
6333
6334 2003-12-11  Martin Baulig  <martin@ximian.com>
6335
6336         Reworked flow analyis and made it more precise and bug-free.  The
6337         most important change is that we're now using a special `Reachability'
6338         class instead of having "magic" meanings of `FlowReturns'.  I'll
6339         do some more cleanups and optimizations and also add some more
6340         documentation this week.
6341
6342         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
6343         largely reworked this class.
6344         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
6345         the new `Reachability' class instead of having "magic" values here.
6346         (FlowBranching): We're now using an instance of `Reachability'
6347         instead of having separate `Returns', `Breaks' etc. fields.
6348
6349         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
6350         based on flow analysis; ignore the return value of block.Emit ().
6351
6352 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
6353
6354         * driver.cs typemanager.cs: Find the mono extensions to corlib even
6355         if they are private.
6356
6357 2003-12-09  Martin Baulig  <martin@ximian.com>
6358
6359         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
6360         call them directly on the UsageVector.
6361
6362 2003-12-09  Martin Baulig  <martin@ximian.com>
6363
6364         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
6365         Changed return type from `FlowReturns' to `Reachability'.
6366
6367 2003-12-09  Martin Baulig  <martin@ximian.com>
6368
6369         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
6370         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
6371         `Reachable' fields with a single `Reachability' one.
6372
6373 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6374
6375         * class.cs (FindMembers): Remove foreach's.
6376
6377         Bootstrap times:
6378
6379         BEFORE
6380                 Run 1:   8.74 seconds
6381                 Run 2:   8.71 seconds
6382
6383         AFTER
6384                 Run 1:   8.64 seconds
6385                 Run 2:   8.58 seconds
6386
6387
6388 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6389
6390         * cs-parser.jay:
6391         * gen-treedump.cs:
6392         * statement.cs:
6393         This patch does a few things:
6394                 1. EmptyStatement is now a singleton, so it is never reallocated.
6395                 2. All blah is EmptyStatement constructs have been changed to
6396                    blah == EmptyStatement.Value, which is much faster and valid
6397                    now that EmptyStatement is a singleton.
6398                 3. When resolving a block, rather than allocating a new array for
6399                    the non-empty statements, empty statements are replaced with
6400                    EmptyStatement.Value
6401                 4. Some recursive functions have been made non-recursive.
6402         Mainly the performance impact is from (3), however (1) and (2) are needed for
6403         this to work. (4) does not make a big difference in normal situations, however
6404         it makes the profile look saner.
6405
6406         Bootstrap times:
6407
6408         BEFORE
6409         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
6410         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
6411         Total memory allocated: 56397 KB
6412
6413         AFTER
6414         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
6415         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
6416         Total memory allocated: 55666 KB
6417
6418 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6419
6420         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
6421         than the hashtable in a hashtable version
6422
6423         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
6424         we always end up concating a string. This results in a huge perf
6425         loss, because many strings have to be tracked by the GC. In this
6426         patch, we first use a hashtable that works with two keys, so that
6427         the strings do not need to be concat'ed.
6428
6429         Bootstrap times:
6430         BEFORE
6431                 Run 1:   8.74 seconds
6432                 Run 2:   8.71 seconds
6433
6434         AFTER
6435                 Run 1:   8.65 seconds
6436                 Run 2:   8.56 seconds
6437
6438 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6439
6440         * Makefile: Add a new target `do-time' that does a quick and simple
6441         profile, leaving easy to parse output.
6442
6443 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
6444
6445         * codegen.cs (Init): Create the dynamic assembly with 
6446         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
6447
6448 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
6449
6450         * support.cs: Make the PtrHashtable use only one
6451         instance of its comparer.
6452
6453 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
6454
6455         * typemanager.cs: Fix lookup of GetNamespaces.
6456
6457 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
6458
6459         * expression.cs: Removed redundant line.
6460
6461         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
6462         ArrayLists, use for loops with bounds.  
6463
6464         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
6465         arraylist.
6466
6467         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
6468         arraylists, use for loop with bounds.
6469
6470         The above three changes give us a 0.071 second performance
6471         improvement out of 3.294 seconds down to 3.223.  On my machine
6472         the above changes reduced the memory usage by 1,387 KB during
6473         compiler bootstrap.
6474
6475         * cs-parser.jay (QualifiedIdentifier): New class used to represent
6476         QualifiedIdentifiers.  Before we created a new string through
6477         concatenation, and mostly later on, the result would be
6478         manipulated by DecomposeQI through string manipulation.
6479
6480         This reduced the compiler memory usage for bootstrapping from
6481         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
6482         compile times in 0.05 seconds.
6483
6484 2003-11-28  Dick Porter  <dick@ximian.com>
6485
6486         * support.cs: Do string compares with the Invariant culture.
6487
6488         * rootcontext.cs: 
6489         * gen-treedump.cs: 
6490         * expression.cs: 
6491         * driver.cs: 
6492         * decl.cs: 
6493         * codegen.cs: 
6494         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
6495         the comparison is done with the Invariant culture.
6496
6497 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
6498
6499         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
6500         GetEnumerator method.
6501
6502         (ProbeCollectionType): Iterate starting at the most specific type
6503         upwards looking for a GetEnumerator
6504
6505         * expression.cs: Shift count can be up to 31 for int/uint and 63
6506         for long/ulong.
6507
6508 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
6509
6510         * statement.cs (Block.LookupLabel): Also look for the label on the
6511         children blocks.  Use a hash table to keep track of visited
6512         nodes. 
6513
6514         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
6515         we actually did transform the other operand, otherwise fall back
6516         to the common codepath that casts to long.
6517
6518         * cs-tokenizer.cs: Use the same code pattern as the int case.
6519         Maybe I should do the parsing myself, and avoid depending on the
6520         Parse routines to get this done.
6521
6522 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
6523
6524         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
6525         which fixes bug 51347.  This time test it.
6526
6527         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
6528         attributes for example can not tell the difference between these.
6529         The difference was only a syntax feature of the language. 
6530
6531         * attribute.cs: Apply attributes to delegates.
6532
6533         * delegate.cs: Call the apply attributes method.
6534
6535 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
6536
6537         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
6538         comparing 0 vs Byte.MinValue, not the value
6539
6540         (ImplicitConversionRequired): When reporting a conversion error,
6541         use error 31 to print out the constant error instead of the
6542         simpler 29.
6543
6544         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
6545         which fixes bug 51347.
6546
6547 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
6548
6549         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
6550         which fixes the -warnaserror command line option.
6551
6552 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
6553
6554         * cfold.cs (DoNumericPromotions): During constant folding of
6555         additions on UIntConstant, special case intconstants with
6556         IntConstants like we do on the expression binary operator. 
6557
6558 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
6559
6560         * convert.cs (ImplicitReferenceConversion): We were missing a case
6561         (System.Enum are not value types or class types, so we need to
6562         classify them separatedly).
6563
6564         * driver.cs: We do not support error 2007.
6565
6566 2003-11-12 Jackson Harper <jackson@ximian.com>
6567
6568         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
6569         system directory. Also use the full file name so users can
6570         libraries names mscorlib-o-tron.dll in a non system dir.
6571         
6572 2004-01-04  David Sheldon <dave-mono@earth.li>
6573
6574         * expression.cs: Added matching ")" to error message for CS0077.
6575
6576 2003-12-19  Martin Baulig  <martin@ximian.com>
6577
6578         * typemanager.cs (TypeManager.IsEqualGenericType): New public
6579         static method; see documentation in the method.
6580         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
6581
6582         * convert.cs (Convert.ImplicitReferenceConversion,
6583         Convert.ImplicitReferenceConversionExists): Add support for
6584         generic type declarations; see gen-36.cs.
6585
6586 2003-12-19  Martin Baulig  <martin@ximian.com>
6587
6588         * pending.cs (Pending.InterfaceMethod): Use
6589         `Type.IsAssignableFrom()' instead of `=='.
6590
6591 2003-12-18  Martin Baulig  <martin@ximian.com>
6592
6593         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
6594         byref types first.
6595
6596         * convert.cs (Convert.ImplicitStandardConversionExists): Use
6597         `expr_type.Equals (target_type)' instead of `=='.
6598
6599 2003-12-08  Martin Baulig  <martin@ximian.com>
6600
6601         * generics.cs (Constraints.Types): Removed.
6602         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
6603         to Type's.
6604         (Constraints.ResolveTypes): New public method; resolves the
6605         TypeExpr's to Type's.
6606         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
6607         longer takes the constraints.
6608         (TypeParameter.DefineMethod): Likewise.
6609         (TypeParameter.DefineType): New public method.  Calls
6610         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
6611         the constraints.
6612
6613 2003-12-08  Martin Baulig  <martin@ximian.com>
6614
6615         * convert.cs (Convert.ImplicitConversionStandard): Use
6616         `expr_type.Equals (target_type)' instead of `=='.
6617
6618 2003-12-08  Martin Baulig  <martin@ximian.com>
6619
6620         * typemanager.cs (TypeManager.GetReferenceType): Call
6621         `Type.MakeByRefType ()'.
6622
6623 2003-12-08  Martin Baulig  <martin@ximian.com>
6624
6625         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
6626         just has some special meaning in some situations.  For instance,
6627         it is allowed to use `where' as the name of a variable etc.
6628
6629 2003-12-04  Martin Baulig  <martin@ximian.com>
6630
6631         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
6632         `Type.MakeArrayType()' for array types.
6633
6634 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
6635
6636         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
6637         debugging message.
6638
6639         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
6640         corlib to compile.
6641
6642 2003-11-16  Martin Baulig  <martin@ximian.com>
6643
6644         * codegen.cs (EmitContext.IsGeneric): Removed.
6645
6646         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
6647         ResolveGeneric() on the DeclSpace.
6648
6649 2003-11-16  Martin Baulig  <martin@ximian.com>
6650
6651         * generic.cs (TypeArguments.Resolve):
6652         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
6653         `ResolveType()' on it to get the Type.
6654
6655 2003-11-15  Martin Baulig  <martin@ximian.com>
6656
6657         * generic.cs (ConstructedType.GetInterfaces): Override this.
6658
6659 2003-11-14  Martin Baulig  <martin@ximian.com>
6660
6661         * interface.cs (Interface.DefineType): Define all type parameters
6662         before adding the interfaces we inherit.
6663
6664 2003-11-11  Martin Baulig  <martin@ximian.com>
6665
6666         * generic.cs (ConstructedType.ResolveType): Always call
6667         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
6668
6669 2003-11-10  Martin Baulig  <martin@ximian.com>
6670
6671         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
6672         (TypeManager.InitCoreTypes): Initialize them here, but instead of
6673         calling `ResolveType()' on them, directly assign their `Type'.
6674
6675 2003-11-08  Martin Baulig  <martin@ximian.com>
6676
6677         * generic.cs (ConstructedType): Override `IsClass' etc.
6678
6679 2003-11-08  Martin Baulig  <martin@ximian.com>
6680
6681         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
6682         return value and the `out parent' parameter.
6683         (TypeContainer.DefineType): Moved the CS0644 check into
6684         GetClassBases().  Don't pass the interface types to the
6685         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
6686         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
6687
6688         * ecore.cs (TypeExpr.IsAttribute): New property.
6689         (TypeExpr.GetInterfaces): New method.
6690
6691         * interface.cs (Interface.GetInterfaceTypeByName): Return a
6692         TypeExpr instead of a Type.
6693         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
6694         (Interface.DefineType): Don't pass the interface types to the
6695         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
6696         them later and then call `TypeBulider.AddInterfaceImplementation()'.
6697
6698         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
6699         instead of a `Type[]'.
6700         (TypeManager.RegisterBuilder): Likewise.
6701         (TypeManager.AddUserInterface): Likewise.
6702         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
6703         `Type[]' and also return a `TypeExpr[]'.
6704         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
6705
6706 2003-11-08  Martin Baulig  <martin@ximian.com>
6707
6708         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
6709         Expression.     
6710
6711 2003-11-08  Martin Baulig  <martin@ximian.com>
6712
6713         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
6714         TypeManager.ResolveExpressionTypes().
6715
6716         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
6717         instead of an Expression.
6718         (TypeExpr): This is now an abstract base class for `TypeExpression'.
6719         (TypeExpression): New public class; formerly known as `TypeExpr'.
6720
6721         * expression.cs (ComposedCast): Derive from TypeExpr.
6722
6723         * typemanager.cs (TypeManager.system_*_expr): These are now
6724         TypExpr's instead of Expression's.
6725         (TypeManager.ResolveExpressionTypes): New public static function;
6726         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
6727         of them.        
6728
6729 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
6730
6731         * expression.cs (New.DoResolve): Do not dereference value that
6732         might be a null return.
6733
6734         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
6735         sure that the constant value has the right type.  Fixes an
6736         unreported bug, similar to 50425.
6737
6738         * const.cs (Const.LookupConstantValue): Call
6739         ImplicitStandardConversionExists before doing a conversion to
6740         avoid havng the TypeManager.ChangeType do conversions.
6741
6742         Reduced the number of casts used
6743
6744         (Const.ChangeType): New routine to enable reuse of the constant
6745         type changing code from statement.
6746
6747         * typemanager.cs (ChangeType): Move common initialization to
6748         static global variables.
6749
6750         Fixes #50425.
6751
6752         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
6753         every value type to go through, even if it was void.  Fix that. 
6754
6755         * cs-tokenizer.cs: Use is_identifier_start_character on the start
6756         character of the define, and the is_identifier_part_character for
6757         the rest of the string.
6758
6759 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
6760
6761         * expression.cs (UnaryMutator.EmitCode): When I updated
6762         LocalVariableReference.DoResolve, I overdid it, and dropped an
6763         optimization done on local variable references.
6764
6765 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
6766
6767         * ecore.cs: Convert the return from Ldlen into an int.
6768
6769 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
6770
6771         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
6772         the accessibility, this is a special case for toplevel non-public
6773         classes (internal for instance).
6774
6775 2003-10-20  Nick Drochak <ndrochak@gol.com>
6776
6777         * ecore.cs: Fix typo and build.  Needed another right paren.
6778
6779 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
6780
6781         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
6782         `internal' case regular and protected, but not allowing protected
6783         to be evaluated later.  Bug 49840
6784
6785 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
6786
6787         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
6788         to kb.Nlast, and not the kb.nFirst to isolate the switch
6789         statement.
6790
6791         Extract the underlying type, so enumerations of long/ulong are
6792         treated like long/ulong.
6793
6794 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
6795
6796         * expression.cs (New): Overload the meaning of RequestedType to
6797         track the possible creation of the NewDelegate type, since
6798         DoResolve is invoked more than once for new constructors on field
6799         initialization.
6800
6801         See bugs: #48800 and #37014
6802
6803         * cs-parser.jay (declare_local_constants): Take an arraylist
6804         instead of a single constant.
6805
6806         (local_constant_declaration): It should take a
6807         constant_declarators, not a constant_declarator.  Fixes 49487
6808
6809         * convert.cs: Fix error report.
6810
6811 2003-10-13 Jackson Harper <jackson@ximian.com>
6812
6813         * typemanager.cs (TypeToCoreType): Add float and double this fixes
6814         bug #49611
6815         
6816 2003-11-03  Martin Baulig  <martin@ximian.com>
6817
6818         * expression.cs (ArrayAccess.GetStoreOpcode): Added
6819         `out bool has_type_arg'; if set, we need to pass the type to
6820         ig.Emit().
6821         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
6822         Stelem_Any/Ldelem_Any for generic parameters.   
6823
6824 2003-11-02  Martin Baulig  <martin@ximian.com>
6825
6826         * expression.cs (Invocation.EmitCall): Use
6827         `TypeManager.IsValueType()' to check whether it's a value type.
6828         Don't set `struct_call' when calling a method on a type parameter.
6829
6830 2003-11-02  Martin Baulig  <martin@ximian.com>
6831
6832         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
6833         and removed the TypeBuilder argument.
6834
6835         * typemanager.cs (TypeManager.IsValueType): Return
6836         `t.IsGenericParameter || t.IsValueType'.
6837
6838 2003-10-25  Martin Baulig  <martin@ximian.com>
6839
6840         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
6841         call ConstructedType.Resolve() on it.
6842
6843         * generic.cs (ConstructedType.Resolve): Set `type' on success.
6844
6845 2003-10-25  Martin Baulig  <martin@ximian.com>
6846
6847         * class.cs (TypeContainer.GetClassBases): Changed
6848         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
6849         CS8214 reporting here.
6850         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
6851         instead of a `Type' for our parent.  In case of a recursive
6852         declaration (see tests/gen-23.cs for an example), our parent is a
6853         ConstructedType and it doesn't have its type set.  So, first
6854         create our own TypeBuilder, then call constructed.Resolve() to get
6855         the parent's type and finally TypeBuilder.SetParent() it.
6856
6857         * ecore.cs (TypeExpr.Name): New public virtual property.
6858
6859         * generic.cs
6860         (ConstructedType): We're now a TypeExpr and not just an Expression.
6861         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
6862         arguments here; this is done later.
6863         (ConstructedType.Resolve): New public method to resolve the type
6864         arguments and bind them.
6865
6866 2003-10-21  Martin Baulig  <martin@ximian.com>
6867
6868         * convert.cs: Use `TypeManager.IsValueType' instead of
6869         'type.IsValueType' everywhere.
6870
6871         * typemanager.cs (TypeManager.IsValueType): Return true for type
6872         parameters.  The reason for this is that we need to box a type
6873         parameter when converting it to a reference type.
6874
6875         * cs-parser.jay: Added support for default value expressions.
6876
6877         * generics.cs (DefaultValueExpression): New public class.       
6878
6879 2003-10-17  Martin Baulig  <martin@ximian.com>
6880
6881         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
6882         TypeContainer so we can also use this for Interfaces.
6883         (TypeParameter.Resolve): Likewise.
6884
6885         * interface.cs (Interface.DefineType): Added support for generic
6886         interfaces.
6887
6888         * cs-parser.jay: Added support for generic structs and interfaces.
6889
6890 2003-10-17  Martin Baulig  <martin@ximian.com>
6891
6892         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
6893         call generic methods :-)
6894
6895 2003-10-16  Martin Baulig  <martin@ximian.com>
6896
6897         * cs-parser.jay (namespace_or_type_name): Only create a
6898         GenericMemberAccess if we actually have type arguments.
6899
6900 2003-10-13  Martin Baulig  <martin@ximian.com>
6901
6902         * class.cs (Method.Define): If we're a generic method, call
6903         TypeBuilder.DefineGenericMethod () before resolving
6904         the parameters.
6905         (MethodData): Added .ctor which takes an additional MethodBuilder
6906         argument; this is used for generic methods.
6907         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
6908         we already have a MethodBuilder.
6909
6910 2003-10-10  Martin Baulig  <martin@ximian.com>
6911
6912         * class.cs (Method): Added .ctor which takes a `GenericMethod'
6913         instead of a `DeclSpace'.  This is used for generic methods.
6914
6915         * cs-parser.jay (method_header): Added support for generic
6916         methods; create a `GenericMethod' instance and pass it to the
6917         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
6918         parameters and locals.
6919
6920         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
6921         since we already have the location.  Check whether we're a generic
6922         type declaration or a generic method and create the correct type
6923         parameter.
6924
6925         * generic.cs (TypeParameter.DefineMethod): New public method.
6926         (GenericMethod): New public class; derives from DeclSpace and is
6927         used for generic methods.       
6928
6929 2003-10-09  Martin Baulig  <martin@ximian.com>
6930
6931         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
6932         to the .ctor.
6933         (MethodCore.DoDefineParameters): Removed the TypeContainer
6934         argument; use the DeclSpace which was passed to the .ctor instead.
6935         (MethodCore.CheckParameter): Take a DeclSpace instead of a
6936         TypeContainer; we only need a DeclSpace here.
6937
6938 2003-10-09  Martin Baulig  <martin@ximian.com>
6939
6940         * class.cs (MethodData): Added additional `DeclSpace ds' argument
6941         to the .ctor.
6942         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
6943         EmitContext's .ctor.    
6944
6945 2003-10-09  Martin Baulig  <martin@ximian.com>
6946
6947         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
6948         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
6949         AsAccessible(), moved them as well.
6950
6951         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
6952
6953 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
6954
6955         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
6956         generation for >=, as spotted by Paolo, bug 48679.  
6957         Patch from David Waite.
6958
6959         * cs-tokenizer.cs: Add handling for #pragma.
6960
6961         * cs-parser.jay: Allow for both yield and yield return in the
6962         syntax.  The anti-cobolization of C# fight will go on!
6963
6964         * class.cs (TypeBuilder.DefineType): Catch error condition here
6965         (Parent.DefineType erroring out and returning null).
6966
6967         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6968         coping with enumerations variables, we were mistakenly processing
6969         them as a regular value type instead of built-in types.  Fixes the
6970         bug #48063
6971
6972         * typemanager.cs (IsBuiltinOrEnum): New method.
6973
6974 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
6975
6976         * cs-parser.jay: Upgrade: yield now needs the return clause.
6977
6978 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
6979
6980         * cs-parser.jay : Renamed yyName to yyNames related to jay.
6981
6982 2003-09-29  Martin Baulig  <martin@ximian.com>
6983
6984         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
6985         inflated generic methods.
6986
6987         * generics.cs (ConstructedType): Distinguish between open and
6988         closed constructed types; correctly resolve the arguments.
6989
6990 2003-09-22  Martin Baulig  <martin@ximian.com>
6991
6992         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
6993         all type arguments meet their constraints.
6994
6995 2003-09-19  Martin Baulig  <martin@ximian.com>
6996
6997         * decl.cs (MemberCache.SetupCacheForInterface): Take a
6998         `MemberCache parent' argument.  Normally, an interface doesn't
6999         have a parent type except System.Object, but we use this in gmcs
7000         for generic type parameters.
7001
7002 2003-09-18  Martin Baulig  <martin@ximian.com>
7003
7004         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
7005         on `type.IsInterface'; don't check whether the type has a parent
7006         to determine whether it's an interface.
7007
7008 2003-09-17  Martin Baulig  <martin@ximian.com>
7009
7010         * generic.cs (ConstructedType.ToString): Always use `name' as the
7011         type name.
7012
7013 2003-09-15  Martin Baulig  <martin@ximian.com>
7014
7015         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
7016
7017         * generic.cs (Constraints.Resolve): New public method; this is
7018         called to resolve the constraint types and to check whether all
7019         the constraints are correct.
7020         (Constraints.Types): New public property.
7021         (TypeParameter.Resolve): New public method; resolves all the
7022         type's constraints.
7023
7024         * class.cs (TypeContainer.DefineType): Call
7025         TypeParameter.Resolve() before actually defining the type.
7026
7027 2003-09-15  Martin Baulig  <martin@ximian.com>
7028
7029         * class.cs (TypeContainer.DefineType): Added an error flag to
7030         avoid reporting duplicate CS0146's ("class definition is
7031         circular.").
7032
7033         * driver.cs (Driver.MainDriver): Abort if
7034         RootContext.ResolveTree() reported any errors.
7035
7036 2003-09-07  Martin Baulig  <martin@ximian.com>
7037
7038         * report.cs (Error, Warning): Added overloaded versions which take
7039         a `params object[] args' and call String.Format().
7040
7041 2003-09-07  Martin Baulig  <martin@ximian.com>
7042
7043         * decl.cs (DeclSpace..ctor): Don't call
7044         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
7045         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
7046         (DeclSpace.RecordDecl): New method.
7047
7048         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
7049
7050 2003-09-02  Ravi Pratap  <ravi@ximian.com>
7051
7052         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
7053         value attributes to be applied to ParameterBuilders.
7054
7055         * class.cs (MethodCore.LabelParameters): Make static and more
7056         generic so that it can be used from other places - like interface
7057         methods, for instance.
7058
7059         * interface.cs (Interface.Emit): Call LabelParameters before
7060         emitting attributes on the InterfaceMethod.
7061
7062 2003-09-07  Martin Baulig  <martin@ximian.com>
7063
7064         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
7065         if the number of type parameters doesn't match.
7066
7067 2003-09-04  Martin Baulig  <martin@ximian.com>
7068
7069         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
7070         for arrays of generic type params (ie. `!0[]').
7071
7072 2003-09-04  Martin Baulig  <martin@ximian.com>
7073
7074         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
7075         for the moment.
7076
7077 2003-09-04  Martin Baulig  <martin@ximian.com>
7078
7079         * decl.cs (DeclSpace.LookupGeneric): New method.
7080         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
7081         moment.
7082
7083         * generic.cs (TypeParameterExpr): Take a TypeParameter as
7084         argument, not just a string.
7085         (TypeParameter.Define): New public method; this is called to
7086         actually define the generic parameter; after this, you can use the
7087         new `Type' property to get the type.
7088
7089 2003-09-04  Martin Baulig  <martin@ximian.com>
7090
7091         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
7092         is now an ArrayList; initialize the result of the `TypeParameters'
7093         property here.
7094         (DeclSpace.GetGenericData): Removed.
7095         (DeclSpace.LookupGeneric): Temporarily removed; we need to
7096         implement this in a different way.
7097         (DeclSpace.GetTypeParameters): Removed; there's now a
7098         `TypeParameters' property.
7099         (DeclSpace.TypeParameters): New public property.
7100
7101         * generic.cs (Constraints): Make this class public.
7102         (TypeParameter): New public class.
7103
7104 2003-09-04  Martin Baulig  <martin@ximian.com>
7105
7106         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
7107         generic parameters.
7108
7109         * class.cs (TypeContainer.DefineType): Call
7110         TypeBuilder.DefineGenericParameter () on all generic parameters if
7111         this is a generic type.
7112
7113 2003-08-28  Martin Baulig  <martin@ximian.com>
7114
7115         * sample-stack.il: Compile this with ilasm: "ilasm /dll
7116         sample-stack.il".
7117
7118         * sample-hello.cs: Compile this with gmcs: "gmcs
7119         /r:sample-stack.dll sample-hello.cs".
7120
7121 2003-08-28  Martin Baulig  <martin@ximian.com>
7122
7123         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
7124         the parameters to the generic type.
7125
7126 2003-08-28  Martin Baulig  <martin@ximian.com>
7127
7128         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
7129
7130 2003-08-28  Martin Baulig  <martin@ximian.com>
7131
7132         * cs-parser.jay (opt_type_argument_list): Use
7133         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
7134         (primary_expression): Replace `qualified_identifier' with `type_name'.
7135         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
7136
7137         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
7138         parser to check whether it is syntactically a type parameter list;
7139         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
7140         this case.
7141
7142 2003-08-26  Martin Baulig  <martin@ximian.com>
7143
7144         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
7145         resolving aliases; fixes #47927.
7146
7147 2003-08-26  Martin Baulig  <martin@ximian.com>
7148
7149         * statement.cs (Using.DoResolve): This is internally emitting a
7150         try/finally clause, so we need to set ec.NeedExplicitReturn if we
7151         do not always return.  Fixes #47681.
7152
7153 2003-08-26  Martin Baulig  <martin@ximian.com>
7154
7155         * decl.cs (MemberCore): Moved WarningNotHiding(),
7156         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
7157         into MemberBase.
7158         (AdditionResult): Make this nested in DeclSpace.
7159         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
7160         argument; call NamespaceEntry.Define() unless we're nested in a
7161         class or struct.
7162
7163         * namespace.cs (Namespace.DefineName): New public function.  This
7164         is called from DeclSpace's .ctor to add 
7165         (Namespace.Lookup): Include DeclSpaces in the lookup.
7166
7167         * class.cs (Operator): Derive from MemberBase, not MemberCore.
7168
7169         * const.cs (Const): Derive from MemberBase, not MemberCore.     
7170
7171 2003-08-25  Martin Baulig  <martin@ximian.com>
7172
7173         * convert.cs (Convert.ExplicitReferenceConversion): When
7174         converting from an interface type to a class, unbox if the target
7175         type is a struct type.  Fixes #47822.
7176
7177 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7178
7179         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
7180         #47854.
7181
7182 2003-08-22  Martin Baulig  <martin@ximian.com>
7183
7184         * class.cs (TypeManager.DefineType): When defining a nested type,
7185         call DefineType() on our parent; fixes #47801.
7186
7187 2003-08-22  Martin Baulig  <martin@ximian.com>
7188
7189         * class.cs (MethodData.Define): While checking if a method is an
7190         interface implementation, improve the test a bit more to fix #47654.
7191
7192 2003-08-22  Martin Baulig  <martin@ximian.com>
7193
7194         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
7195         correctly; fixes #47722.
7196
7197 2003-08-22  Martin Baulig  <martin@ximian.com>
7198
7199         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
7200         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
7201
7202         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
7203
7204 2003-08-22  Martin Baulig  <martin@ximian.com>
7205
7206         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
7207         can only be assigned in static constructors.  Fixes #47161.
7208
7209 2003-08-22  Martin Baulig  <martin@ximian.com>
7210
7211         Rewrote and improved the flow analysis code.
7212
7213         * flowbranching.cs (FlowBranching): Make this class abstract.
7214         (FlowBranching.CreateBranching): New static function to create a
7215         new flow branching.
7216         (FlowBranchingBlock, FlowBranchingException): New classes.
7217         (FlowBranching.UsageVector.Type): New public readonly field.
7218         (FlowBranching.UsageVector.Breaks): Removed the setter.
7219         (FlowBranching.UsageVector.Returns): Removed the setter.
7220         (FlowBranching.UsageVector): Added Break(), Return(),
7221         NeverReachable() and Throw() methods to modify the reachability.
7222         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
7223         done by FlowBranching.Merge().
7224         (FlowBranching.UsageVector.MergeChild): New method; merges the
7225         merge result into the current vector.
7226         (FlowBranching.Merge): New abstract method to merge a branching.
7227
7228 2003-08-12  Martin Baulig  <martin@ximian.com>
7229
7230         * expression.cs (Indirection.CacheTemporaries): Create the
7231         LocalTemporary with the pointer type, not its element type.
7232
7233 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
7234
7235         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
7236         token was a keyword or not.
7237
7238         Add `error' options where an IDENTIFIER was expected;  Provide
7239         CheckToken and CheckIdentifierToken convenience error reporting
7240         functions. 
7241
7242         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
7243
7244         * decl.cs: Rename `NamespaceEntry Namespace' public field into
7245         NameSpaceEntry NameSpaceEntry.
7246
7247         (LookupInterfaceOrClass): Avoid creating a full qualified name
7248         from namespace and name: avoid doing lookups when we know the
7249         namespace is non-existant.   Use new Tree.LookupByNamespace which
7250         looks up DeclSpaces based on their namespace, name pair.
7251
7252         * driver.cs: Provide a new `parser verbose' to display the
7253         exception thrown during parsing.  This is turned off by default
7254         now, so the output of a failure from mcs is more graceful.
7255
7256         * namespace.cs: Track all the namespaces defined in a hashtable
7257         for quick lookup.
7258
7259         (IsNamespace): New method
7260
7261 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
7262
7263         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
7264         we know that we need to concatenate (full typename can never be
7265         null). 
7266
7267         * class.cs: ditto.
7268
7269         * statement.cs: Use a bitfield;  Do not initialize to null things
7270         which are done by the constructor by default.
7271
7272         * cs-parser.jay: bug fix, parameter was 4, not 3.
7273
7274         * expression.cs: Just use the property;
7275
7276         * statement.cs: No need for GetVariableInfo method.
7277
7278 2003-08-08  Martin Baulig  <martin@ximian.com>
7279
7280         * flowanalysis.cs (FlowReturns): This is now nested in the
7281         `FlowBranching' class.
7282         (MyBitVector): Moved this here from statement.cs.
7283         (FlowBranching.SiblingType): New enum type.
7284         (FlowBranching.CreateSibling): Added `SiblingType' argument.
7285
7286 2003-08-07  Martin Baulig  <martin@ximian.com>
7287
7288         * flowanalysis.cs (FlowBranchingType): This is now nested in the
7289         `FlowBranching' class and called `BranchingType'.
7290
7291 2003-08-07  Martin Baulig  <martin@ximian.com>
7292
7293         * flowanalysis.cs: Moved all the control flow analysis code into
7294         its own file.
7295
7296 2003-08-07  Martin Baulig  <martin@ximian.com>
7297
7298         * assign.cs (Assign.DoResolve): `target' must either be an
7299         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
7300         #37319.
7301
7302 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
7303
7304         * expression.cs (BinaryMethod): This kind of expression is created by the
7305         Binary class if it determines that the operator has to be handled
7306         by a method.
7307
7308         (BinaryDelegate): This kind of expression is created if we are
7309         dealing with a + or - operator on delegates.
7310
7311         (Binary): remove method, argumetns, and DelegateOperator: when
7312         dealing with methods, 
7313
7314         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
7315
7316         * statement.cs (Block): use bitfields for the three extra booleans
7317         we had in use.   Remove unused topblock parameter.
7318
7319         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
7320
7321         * assign.cs: Drop extra unneeded tests.
7322
7323 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
7324
7325         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
7326
7327         * statement.cs (Foreach): Use VariableStorage instead of
7328         LocalBuilders.   
7329
7330         * codegen.cs (VariableStorage): New class used by clients that
7331         require a variable stored: locals or fields for variables that
7332         need to live across yield.
7333
7334         Maybe provide a convenience api for EmitThis+EmitLoad?
7335
7336         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
7337         these bad boys.
7338
7339 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
7340
7341         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
7342         RemapParameterLValue): New methods that are used to turn a
7343         precomputed FieldInfo into an expression like this:
7344
7345                 instance.FieldInfo
7346
7347         The idea is to use this instead of making LocalVariableReference
7348         have more than one meaning.
7349
7350         * cs-parser.jay: Add error production to BASE.
7351
7352         * ecore.cs: Deal with TypeManager.GetField returning null, which
7353         is now a valid return value.
7354
7355         (FieldExprNoAddress): New expression for Fields whose address can
7356         not be taken.
7357
7358         * expression.cs (LocalVariableReference): During the resolve
7359         phases, create new expressions if we are in a remapping context.
7360         Remove code that dealt with remapping here.
7361
7362         (ParameterReference): same.
7363
7364         (ProxyInstance): New expression, like the `This' expression, but
7365         it is born fully resolved.  We know what we are doing, so remove
7366         the errors that are targeted to user-provided uses of `this'.
7367
7368         * statement.cs (Foreach): our variable is now stored as an
7369         Expression;  During resolution, follow the protocol, dont just
7370         assume it will return this.
7371
7372 2003-08-06  Martin Baulig  <martin@ximian.com>
7373
7374         * support.cs (SeekableStreamReader.cs): New public class.
7375
7376         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
7377         SeekableStreamReader instead of the normal StreamReader.
7378
7379 2003-08-04  Martin Baulig  <martin@ximian.com>
7380
7381         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
7382         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
7383         deambiguate casts and delegate invocations.
7384         (parenthesized_expression): Use the new tokens to ensure this is
7385         not a cast of method invocation.
7386
7387         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
7388         when reading a `)' and Deambiguate_CloseParens () was previously
7389         called.
7390
7391         * expression.cs (ParenthesizedExpression): New class.  This is
7392         just used for the CS0075 test.
7393         (Binary.DoResolve): Check for CS0075.   
7394
7395 2003-07-29  Ravi Pratap  <ravi@ximian.com>
7396
7397         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
7398         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
7399         reference comparison.
7400
7401         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
7402         examine the ReturnType for equality - this is necessary in the
7403         cases of implicit and explicit operators whose signature also
7404         includes the return type.
7405
7406 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
7407
7408         * namespace.cs: Cache the result of the namespace computation,
7409         instead of computing it every time.
7410
7411 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
7412
7413         * decl.cs: Use a global arraylist that we reuse over invocations
7414         to avoid excesive memory consumption.  Reduces memory usage on an
7415         mcs compile by one meg (45 average).
7416
7417         * typemanager.cs (LookupTypeReflection): In .NET pointers are
7418         private, work around that.
7419
7420 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
7421
7422         * literal.cs (IntLiteral): Define Zero and One static literals. 
7423
7424         * cs-parser.jay (integer_literal): use static literals to reduce
7425         memory usage for the most used literals (0, 1 and -1).  211kb
7426         reduced in memory usage.
7427
7428         Replace all calls to `new ArrayList' with `new
7429         ArrayList(4)' which is a good average number for most allocations,
7430         and also requires only 16 bytes of memory for its buffer by
7431         default. 
7432
7433         This reduced MCS memory usage in seven megabytes for the RSS after
7434         bootstrapping.
7435
7436 2003-07-28  Ravi Pratap  <ravi@ximian.com>
7437
7438         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
7439         handle params methods the correct way by forming only one
7440         applicable set with params and normal methods in them. Earlier we
7441         were looking at params methods only if we found no normal methods
7442         which was not the correct thing to do.
7443
7444         (Invocation.BetterFunction): Take separate arguments indicating
7445         when candidate and the best method are params methods in their
7446         expanded form.
7447
7448         This fixes bugs #43367 and #46199.
7449
7450         * attribute.cs: Documentation updates.
7451
7452         (CheckAttribute): Rename to CheckAttributeTarget.
7453         (GetValidPlaces): Rename to GetValidTargets.
7454
7455         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
7456         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
7457
7458         Fixes bug #44468.
7459
7460 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
7461
7462         * codegen.cs: Compute IsGeneric correctly.
7463
7464         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
7465         resolution. 
7466
7467         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
7468         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
7469         regressions, and I was chasing more bugs than I required.
7470
7471         * interface.cs: Use expressions for base type names (like classes
7472         and structs have been doing for a while now), and resolve that.
7473         This patch should probably go into head as well.
7474
7475         This makes it one less user of FindType.
7476
7477 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
7478
7479         This compiler can not self host currently.  Need to fix that.
7480         
7481         * Makefile: compile to `gmcs.exe'
7482
7483         * driver.cs: Turn on v2 by default on gmcs.
7484
7485         * generic.cs (ConstructedType): Does no longer take a container
7486         type argument;  That will be taken care of later.
7487
7488         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
7489         Use SimpleName to resolve for now, so we can continue the work on
7490         the parser, until we get Type.GetType that understands generics.
7491
7492         (ConstructedType.ToString): Implement
7493
7494         (TypeArguments.Resolve): Resolve the child expressions as types. 
7495         
7496         * cs-parser.jay: Rename interface_constraints to
7497         type_parameter_constraints
7498
7499         (namespace_or_type_name): Only use constructed types for the basic
7500         construction, we will deal with identifier<...> later.
7501
7502         (type/type_name): No longer call DecomposeQI, as
7503         namespace_or_type_name is always decoded now.
7504         
7505 2003-07-22  Ravi Pratap  <ravi@ximian.com>
7506
7507         * expression.cs (Invocation.OverloadResolve): Follow the spec more
7508         closely: we eliminate methods in base types when we have an
7509         applicable method in a top-level type.
7510
7511         Please see section 14.5.5.1 for an exact description of what goes
7512         on. 
7513
7514         This fixes bug #45127 and a host of other related to corlib compilation.
7515
7516         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
7517         array is the method corresponding to the top-level type (this is
7518         because of the changes made to icall.c) so we change this
7519         accordingly.
7520
7521         (MethodGroupExpr.Name): This too.
7522
7523         * typemanager.cs (GetElementType): New method which does the right
7524         thing when compiling corlib. 
7525
7526         * everywhere: Make use of the above in the relevant places.
7527
7528 2003-07-22  Martin Baulig  <martin@ximian.com>
7529
7530         * cs-parser.jay (invocation_expression): Moved
7531         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
7532         `cast_expression', but create a InvocationOrCast which later
7533         resolves to either an Invocation or a Cast.
7534
7535         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
7536         method; call this before EmitStatement() to make sure that this
7537         expression can be used as a statement.
7538
7539         * expression.cs (InvocationOrCast): New class; resolves to either
7540         an Invocation or a Cast.
7541
7542         * statement.cs (StatementExpression): Call ResolveStatement() on
7543         the ExpressionStatement before emitting it.
7544
7545 2003-07-21  Martin Baulig  <martin@ximian.com>
7546
7547         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
7548         `ref' and `out' attributes match; fixes #46220.
7549         (MemberAccess.ResolveMemberAccess): You can't reference a type
7550         through an expression; fixes #33180.
7551         (Indexers.GetIndexersForType): Don't return the indexers from
7552         interfaces the class implements; fixes #46502.
7553
7554 2003-07-21  Martin Baulig  <martin@ximian.com>
7555
7556         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
7557         CS0661 checks; fixes bug #30442.
7558
7559 2003-07-21  Martin Baulig  <martin@ximian.com>
7560
7561         * decl.cs (AdditionResult): Added `Error'.
7562
7563         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
7564
7565         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
7566         cs0031.cs actually work.
7567
7568  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
7569  
7570         * cs-parser.jay (namespace_name): do not use
7571         namespace_or_type_name, use qualified_identifier, because
7572         namespace_or_type_name will soon return a composed expression
7573         instead of a string.
7574  
7575         (namespace_or_type_name): Instead of returning a string, now this
7576         production returns an expression.
7577  
7578         * codegen.cs (EmitContext): Setup IsGeneric property based on
7579         whether our DeclSpace is generic, our the method is generic.
7580  
7581         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
7582         the method is generic.
7583  
7584         * cs-parser.jay (type_arguments, opt_type_argument_list,
7585         type_parameters, type_parameter_list, opt_type_parameter_list,
7586         type_parameter,, opt_type_parameter_constraints_clauses,
7587         type_parameter_constraints_clauses,
7588         type_parameter_constraint_clause, type_parameter_constraint,
7589         interface_constraints): Add new production
7590  
7591         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
7592         DeclSpace is generic or not.
7593  
7594         (DeclSpace.SetParameterInfo): New routine, used to set the
7595         parameter info for a type.
7596  
7597         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
7598         returns a GenericTypeExpr
7599  
7600         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
7601         generic, lookup the generic argument.
7602  
7603         * attribute.cs: Do not allow TypeParameterExpressions in
7604         Attributes.
7605  
7606         * class.cs: Do not allow the Main method to be defined in a
7607         Generic container.
7608  
7609         * expression.cs (SizeOf): Do not allow generic types to be used as
7610         arguments to sizeof.
7611  
7612         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
7613         it: whether a type is generic or not.  Only works for types we are
7614         currently building for now.
7615         
7616 2003-07-20  Martin Baulig  <martin@ximian.com>
7617
7618         * namespace.cs: Fixed that bug which caused a crash when compiling
7619         the debugger's GUI.
7620
7621 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
7622
7623         * typemanager.cs (LookupTypeReflection): Never expose types which
7624         are NotPublic, NestedPrivate, NestedAssembly, or
7625         NestedFamANDAssem.  We used to return these, and later do a check
7626         that would report a meaningful error, but the problem is that we
7627         would not get the real match, if there was a name override.
7628
7629 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
7630
7631         * namespace.cs (Namespace, Name): Do not compute the namespace
7632         name dynamically, compute it in the constructor.  This reduced
7633         memory usage by 1697 KB.
7634
7635         * driver.cs: Use --pause to pause at the end.
7636
7637 2003-07-17  Peter Williams  <peter@newton.cx>
7638
7639         * Makefile: Change the name of the test target so that it doesn't
7640         conflict with the recursive test target.
7641
7642 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
7643
7644         * expression.cs (LocalVariableReference.Emit, EmitAssign,
7645         AddressOf): Do not use EmitThis, that was wrong, use the actual
7646         this pointer.
7647
7648 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
7649
7650         * class.cs (MethodData.Define): While checking if a method is an
7651         interface implementation, improve the test: If we are not public
7652         (use new test here: use the computed MethodAttributes directly,
7653         instead of the parsed modifier flags) check if the `implementing'
7654         method comes from an interface or not.
7655
7656         * pending.cs (VerifyPendingMethods): Slightly better error
7657         message.
7658
7659         * makefile: add test target that does the mcs bootstrap.
7660
7661 2003-07-16  Ravi Pratap  <ravi@ximian.com>
7662
7663         * interface.cs (Define): Do nothing here since there are no
7664         members to populate etc. Move the attribute emission out of here
7665         since this was just totally the wrong place to put it. Attribute
7666         application happens during the 'Emit' phase, not in the 'Define'
7667         phase.
7668
7669         (Emit): Add this method and move the attribute emission here
7670
7671         * rootcontext.cs (EmitCode): Call the Emit method on interface
7672         types too.
7673
7674 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
7675
7676         * expression.cs (OverloadResolve): Report error only if Location
7677         is not 'Null' which means that there was a probe going on.
7678
7679 2003-07-14  Martin Baulig  <martin@ximian.com>
7680
7681         * expression.cs (ConditionalLogicalOperator): New public class to
7682         implement user defined conditional logical operators.
7683         This is section 14.11.2 in the spec and bug #40505.
7684
7685 2003-07-14  Martin Baulig  <martin@ximian.com>
7686
7687         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
7688
7689 2003-07-14  Martin Baulig  <martin@ximian.com>
7690
7691         * codegen.cs (EmitContext.InFixedInitializer): New public field.
7692
7693         * ecore.cs (IVariable.VerifyFixed): New interface method.
7694
7695         * expression.cs (Unary.ResolveOperator): When resolving the `&'
7696         operator, check whether the variable is actually fixed.  Fixes bug
7697         #36055.  Set a variable definitely assigned when taking its
7698         address as required by the spec.
7699
7700         * statement.cs (LocalInfo.IsFixed): New field.
7701         (LocalInfo.MakePinned): Set `IsFixed' to true.
7702
7703 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
7704
7705         * attribute.cs (Attribute.Resolve): While doing a Member lookup
7706         for .ctors, ensure that we only ask for members declared in the
7707         attribute type (BindingFlags.DeclaredOnly).
7708
7709         Fixes bug #43632.
7710
7711         * expression.cs (Error_WrongNumArguments): Report error 1501
7712         correctly the way CSC does.
7713
7714 2003-07-13  Martin Baulig  <martin@ximian.com>
7715
7716         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
7717         lookup on the fully qualified name, to make things like "X.X" work
7718         where "X.X" is a fully qualified type name, but we also have a
7719         namespace "X" in the using list.  Fixes #41975.
7720
7721 2003-07-13  Martin Baulig  <martin@ximian.com>
7722
7723         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
7724         function. If we're a CompoundAssign, we need to create an embedded
7725         CompoundAssign, not an embedded Assign.
7726         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
7727         Fixes #45854.
7728
7729 2003-07-13  Martin Baulig  <martin@ximian.com>
7730
7731         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
7732         work to fix bug #46088.
7733
7734 2003-07-13  Ravi Pratap <ravi@ximian.com>
7735
7736         * class.cs (Operator.Emit): Do not emit attributes here - it is
7737         taken care of by the Method class that we delegate too. This takes
7738         care of bug #45876.
7739
7740 2003-07-10  Martin Baulig  <martin@ximian.com>
7741
7742         * expression.cs (TypeOfVoid): New class.
7743         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
7744
7745 2003-07-10  Martin Baulig  <martin@ximian.com>
7746
7747         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
7748         bug #35957.
7749
7750 2003-07-10  Martin Baulig  <martin@ximian.com>
7751
7752         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
7753         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
7754
7755         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
7756
7757         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
7758
7759 2003-07-10  Martin Baulig  <martin@ximian.com>
7760
7761         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
7762         of decimal.  Fixes #42850.
7763
7764         NOTE: I also fixed the created byte blob, but this doesn't work on
7765         the MS runtime and csc never produces any byte blobs for decimal
7766         arrays.
7767
7768 2003-07-10  Martin Baulig  <martin@ximian.com>
7769
7770         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
7771         structs; fixes #32068.
7772         (Block.AddChildVariableNames): Fixed #44302.
7773
7774 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7775
7776         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
7777
7778 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
7779
7780         * attribute.cs: And this test is onger needed.
7781
7782 2003-07-08  Martin Baulig  <martin@ximian.com>
7783
7784         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
7785         inaccessible types.  Fixes #36313.
7786
7787         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
7788
7789         * namespace.cs (NamespaceEntry): Create implicit entries for all
7790         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
7791         implicit entries for N1.N2 and N1.
7792
7793 2003-07-08  Martin Baulig  <martin@ximian.com>
7794
7795         Rewrote the handling of namespaces to fix a lot of the issues
7796         wrt. `using' aliases etc.
7797
7798         * namespace.cs (Namespace): Splitted this class into a
7799         per-assembly `Namespace' and a per-file `NamespaceEntry'.
7800
7801         * typemanager.cs (TypeManager.IsNamespace): Removed.
7802         (TypeManager.ComputeNamespaces): Only compute namespaces from
7803         loaded assemblies here, not the namespaces from the assembly we're
7804         currently compiling.
7805
7806 2003-07-08  Martin Baulig  <martin@ximian.com>
7807
7808         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
7809
7810 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
7811
7812         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
7813         already fixed it.  
7814
7815         I thought about the memory savings here, but LookupTypeReflection
7816         is used under already very constrained scenarios.  Compiling
7817         corlib or mcs only exposes one hit, so it would not really reduce
7818         any memory consumption.
7819
7820 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7821
7822         * typemanager.cs: fixes bug #45889 by only adding public types from
7823         other assemblies to the list of known types.
7824
7825 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
7826
7827         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
7828         on the type we resolved.
7829
7830 2003-07-05  Martin Baulig  <martin@ximian.com>
7831
7832         * pending.cs (PendingImplementation.ParentImplements): Don't
7833         create the proxy if the parent is abstract.
7834
7835         * class.cs (TypeContainer.DefineIndexers): Process explicit
7836         interface implementations first.  Fixes #37714.
7837
7838 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
7839
7840         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
7841         defined recursively;  but since we modify the input parameters
7842         (left is set to `this' temporarily), we reset this value if the
7843         left_is_explicit is false, which gives the original semantics to
7844         the code.  
7845
7846         * literal.cs (NullPointer): new class used to represent a null
7847         literal in a pointer context.
7848
7849         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
7850         type is a pointer, use a NullPointer object instead of a
7851         NullLiteral.   Closes 43687
7852
7853         (ExplicitConversion): Convert pointer values using
7854         the conv opcode to the proper type.
7855
7856         * ecore.cs (New): change ValueTypeVariable property into a method,
7857         that returns whether the valuetype is suitable for being used.
7858
7859         * expression.cs (Binary.DoNumericPromotions): Only return if we
7860         the int constant was a valid uint, and we can return both left and
7861         right as uints.  If not, we continue processing, to trigger the
7862         type conversion.  This fixes 39018.
7863
7864         * statement.cs (Block.EmitMeta): During constant resolution, set
7865         the CurrentBlock property on the emitcontext, so that we resolve
7866         constants propertly.
7867
7868 2003-07-02  Martin Baulig  <martin@ximian.com>
7869
7870         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
7871         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
7872
7873         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
7874         than emitting it here.
7875
7876         * statement.cs: Fixed some more flow analysis bugs.
7877
7878 2003-07-02  Martin Baulig  <martin@ximian.com>
7879
7880         * class.cs (MethodData.Define): When implementing interface
7881         methods, set Final unless we're Virtual.
7882
7883         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
7884         check work for interface methods.
7885
7886 2003-07-01  Martin Baulig  <martin@ximian.com>
7887
7888         * ecore.cs (EmitContext.This): Replaced this property with a
7889         GetThis() method which takes a Location argument.  This ensures
7890         that we get the correct error location for a CS0188.
7891
7892 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
7893
7894         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
7895         ImplicitStandardConversion.
7896
7897         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
7898
7899 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
7900
7901         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
7902         optimization.
7903
7904 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
7905
7906         * class.cs (Constructor.Define): Turn off initlocals for unsafe
7907         constructors.
7908
7909         (MethodData.Define): Turn off initlocals for unsafe methods.
7910
7911 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
7912
7913         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
7914         complete;  Fixes #37521.
7915
7916         * delegate.cs: Use Modifiers.TypeAttr to compute the
7917         TypeAttributes, instead of rolling our own.  This makes the flags
7918         correct for the delegates.
7919
7920 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
7921
7922         * class.cs (Constructor.Define): Set the private flag for static
7923         constructors as well.
7924
7925         * cs-parser.jay (statement_expression): Set the return value to
7926         null, to avoid a crash when we catch an error.
7927
7928 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
7929
7930         * cs-parser.jay: Applied patch from Jackson that adds support for
7931         extern and unsafe modifiers to destructor declarations.
7932
7933         * expression.cs: Report error 21 if the user is trying to index a
7934         System.Array.
7935
7936         * driver.cs: Add an error message, suggested by the bug report.
7937
7938         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
7939         if we do not have a ": this ()" constructor initializer.  Fixes 45149
7940
7941 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
7942
7943         * namespace.cs: Add some information to reduce FAQs.
7944
7945 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
7946
7947         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
7948         underlying enumeration types.  Fixes #43915.
7949
7950         * expression.cs: Treat ushort/short as legal values to be used in
7951         bitwise operations.
7952
7953 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
7954
7955         * delegate.cs: transfer custom attributes for paramenters from
7956         the delegate declaration to Invoke and BeginInvoke.
7957
7958 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
7959
7960         * attribute.cs: handle custom marshalers and emit marshal info
7961         for fields, too.
7962
7963 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
7964
7965         * makefile.gnu: Added anonymous.cs to the compiler sources.
7966
7967 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
7968
7969         * iterators.cs: Change the name of the proxy class to include two
7970         underscores.
7971
7972         * cs-parser.jay: Update grammar to include anonymous methods.
7973
7974         * anonymous.cs: new file.
7975
7976 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
7977
7978         * class.cs (Field.Define): Add missing test for pointers and
7979         safety. 
7980
7981 2003-05-27  Ravi Pratap  <ravi@ximian.com>
7982
7983         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
7984         we use the stobj opcode.
7985
7986         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
7987         since it wasn't the correct fix. 
7988
7989         It still is puzzling that we are required to use stobj for IntPtr
7990         which seems to be a ValueType.
7991
7992 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
7993
7994         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
7995         during regular simple name resolution.   Now, the trick is that
7996         instead of returning for processing the simplename, we do a
7997         TypeManager.LookupType (ie, a rooted lookup as opposed to a
7998         contextual lookup type).   If a match is found, return that, if
7999         not, return for further composition.
8000
8001         This fixes long-standing 30485.
8002
8003         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
8004         using the address to initialize an object, do an Stobj instead of
8005         using the regular Stelem.
8006
8007         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
8008         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
8009         Because if we are a BaseIndexerAccess that value will be true.
8010         Fixes 43643.
8011
8012         * statement.cs (GotoCase.Resolve): Return after reporting an
8013         error, do not attempt to continue. 
8014
8015         * expression.cs (PointerArithmetic.Emit): If our operand is a
8016         long, convert our constants to match the operand before
8017         multiplying.  Convert to I type before adding.   Fixes 43670.
8018
8019 2003-05-14  Ravi Pratap  <ravi@ximian.com>
8020
8021         * enum.cs (ImplicitConversionExists) : Rename to
8022         ImplicitEnumConversionExists to remove ambiguity. 
8023
8024         * ecore.cs (NullCast): New type of cast expression class which
8025         basically is very similar to EmptyCast with the difference being
8026         it still is a constant since it is used only to cast a null to
8027         something else
8028         (eg. (string) null)
8029
8030         * convert.cs (ImplicitReferenceConversion): When casting a null
8031         literal, we return a NullCast.
8032
8033         * literal.cs (NullLiteralTyped): Remove - I don't see why this
8034         should be around anymore.
8035
8036         The renaming (reported was slightly wrong). Corrections:
8037
8038         ConvertImplicitStandard -> ImplicitConversionStandard
8039         ConvertExplicitStandard -> ExplicitConversionStandard
8040
8041         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
8042         before passing them in !
8043
8044         * convert.cs (ImplicitConversionStandard): When comparing for
8045         equal expr and target types, ensure that expr is not a
8046         NullLiteral.
8047
8048         In general, we must not be checking (expr_type ==
8049         target_type) in the top level conversion methods
8050         (ImplicitConversion, ExplicitConversion etc). This checking is
8051         done in the methods that they delegate to.
8052
8053 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
8054
8055         * convert.cs: Move Error_CannotConvertType,
8056         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
8057         ImplicitNumericConversion, ImplicitConversionExists,
8058         ImplicitUserConversionExists, StandardConversionExists,
8059         FindMostEncompassedType, FindMostSpecificSource,
8060         FindMostSpecificTarget, ImplicitUserConversion,
8061         ExplicitUserConversion, GetConversionOperators,
8062         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
8063         TryImplicitIntConversion, Error_CannotConvertImplicit,
8064         ConvertImplicitRequired, ConvertNumericExplicit,
8065         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
8066         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
8067         its own file.
8068
8069         Perform the following renames:
8070
8071         StandardConversionExists -> ImplicitStandardConversionExists
8072         ConvertImplicit -> ImplicitConversion
8073         ConvertImplicitStandard -> ImplicitStandardConversion
8074         TryImplicitIntConversion -> ImplicitIntConversion
8075         ConvertImplicitRequired -> ImplicitConversionRequired
8076         ConvertNumericExplicit -> ExplicitNumericConversion
8077         ConvertReferenceExplicit -> ExplicitReferenceConversion
8078         ConvertExplicit -> ExplicitConversion
8079         ConvertExplicitStandard -> ExplicitStandardConversion
8080
8081 2003-05-19  Martin Baulig  <martin@ximian.com>
8082
8083         * statement.cs (TypeInfo.StructInfo): Made this type protected.
8084         (TypeInfo): Added support for structs having structs as fields.
8085
8086         * ecore.cs (FieldExpr): Implement IVariable.
8087         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
8088         VariableInfo for the field.
8089
8090 2003-05-18  Martin Baulig  <martin@ximian.com>
8091
8092         * expression.cs (This.DoResolve): Report a CS0027 if we're
8093         emitting a field initializer.
8094
8095 2003-05-18  Martin Baulig  <martin@ximian.com>
8096
8097         * expression.cs (This.ResolveBase): New public function.
8098         (This.DoResolve): Check for CS0188.
8099
8100         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
8101         This.Resolve().
8102
8103         * ecore.cs (MethodGroupExpr.DoResolve): Set the
8104         `instance_expression' to null if we don't have any non-static
8105         methods.
8106
8107 2003-05-18  Martin Baulig  <martin@ximian.com>
8108
8109         Reworked the way how local variables and parameters are handled by
8110         the flow analysis code.
8111
8112         * statement.cs (TypeInfo, VariableMap): New public classes.
8113         (VariableInfo): New public class.  This is now responsible for
8114         checking whether a variable has been assigned.  It is used for
8115         parameters and local variables.
8116         (Block.EmitMeta): Take the InternalParameters as argument; compute
8117         the layout of the flow vectors here.
8118         (Block.LocalMap, Block.ParameterMap): New public properties.
8119         (FlowBranching): The .ctor doesn't get the InternalParameters
8120         anymore since Block.EmitMeta() now computes the layout of the flow
8121         vector.
8122         (MyStructInfo): This class is now known as `StructInfo' and nested
8123         in `TypeInfo'; we don't access this directly anymore.
8124
8125         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
8126         property and removed IsAssigned(), IsFieldAssigned(),
8127         SetAssigned() and SetFieldAssigned(); we now call them on the
8128         VariableInfo so we don't need to duplicate this code everywhere.
8129
8130         * expression.cs (ParameterReference): Added `Block block' argument
8131         to the .ctor.
8132         (LocalVariableReference, ParameterReference, This): The new
8133         VariableInfo class is now responsible for all the definite
8134         assignment stuff.
8135
8136         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
8137         IsParameterAssigned, SetParameterAssigned): Removed.
8138
8139 2003-05-18  Martin Baulig  <martin@ximian.com>
8140
8141         * typemanager.cs (InitCoreTypes): Try calling
8142         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
8143         the 3-args-version.  Corlib now also needs our `void_type'.
8144         (GetMethod): Added overloaded version which takes an optional
8145         `bool report_errors' to allow lookups of optional methods.
8146
8147 2003-05-12  Martin Baulig  <martin@ximian.com>
8148
8149         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
8150         only used for locals and not for parameters.
8151
8152 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
8153
8154         * support.cs (InternalParameters.ParameterType): Return the
8155         ExternalType of the parameter.
8156
8157         * parameter.cs (Parameter.ExternalType): drop the two arguments,
8158         they were unused.
8159
8160 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
8161
8162         * class.cs (MethodData.Define): Do not set the `newslot' on
8163         interface members, if they are also flagged as "override".
8164
8165         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
8166         better code for ++i and i++.  This only works for static fields
8167         and local variables.
8168
8169         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
8170         want to pull the DeclSpace out of the builder_to_declspace instead
8171         of the TypeBuilder (like in TypeContainer.FindMembers).
8172
8173         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
8174         instead of LookupTypeContainer.  Fixes the crash on .NET for
8175         looking up interface members.
8176
8177         * const.cs: Create our own emit context during the Definition
8178         stage, so that constants are evaluated in the proper context, when
8179         a recursive definition happens.
8180
8181 2003-05-11  Martin Baulig  <martin@ximian.com>
8182
8183         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
8184         new block for a switch section.
8185         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
8186         the adding/lookup in the switch block.  Fixes #39828.
8187
8188 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
8189
8190         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
8191         functionality: I needed to convert the data after I had performed
8192         the add/sub operation into the operands type size.
8193
8194         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
8195         pass the type for the box operation, otherwise the resulting
8196         object would have been of type object.
8197
8198         (BoxedCast): Add constructor to specify the type to box as.
8199
8200 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
8201
8202         * iterators.cs: I was reusing the `count' variable inadvertently,
8203         take steps to not allow this to happen.
8204
8205 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
8206
8207         * attribute.cs (Attribute.Resolve): Params attributes are encoded
8208         by creating an array at the point where the params starts and
8209         putting all those arguments there, then adjusting the size of the
8210         array.
8211
8212 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
8213
8214         * expression.cs (New.AddressOf): Implement interface
8215         IMemoryLocation.  This is used when the `new' operator is used in
8216         the context of an invocation to a method on a value type.
8217
8218         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
8219         example. 
8220
8221         * namespace.cs: Also check the using aliases here.
8222
8223         * driver.cs: Move the test for using validity after the types have
8224         been entered, so we do a single pass that also includes the using
8225         aliases. 
8226
8227         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
8228         in the regular case.   CreateSiblingForFinally is doing extra
8229         error checking.
8230
8231         * attribute.cs (GetAttributeArgumentExpression): Store the result
8232         on an out value, and use the return value to indicate failure
8233         instead of using null (which is a valid return for Constant.GetValue).
8234
8235         * statement.cs: Perform the analysis flow for the increment
8236         portion after the statement, because this will be the real flow of
8237         execution.  Fixes #42385
8238
8239         * codegen.cs (EmitContext.EmitArgument,
8240         EmitContext.EmitStoreArgument): New helper functions when the
8241         RemapToProxy flag is set.
8242
8243         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
8244         function.
8245
8246         Add support for remapping parameters. 
8247
8248         * iterators.cs: Propagate parameter values;  Store parameter
8249         values in the proxy classes.
8250
8251 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
8252
8253         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
8254         need a proxy reference;  I do not know what I was thinking
8255
8256         * cs-parser.jay (constructor_initializer): catch another error,
8257         and display nice message.
8258
8259         (field_declaration): catch void field declaration
8260         to flag a better error. 
8261
8262         * class.cs (MemberBase.CheckBase): Report an error instead of a
8263         warning if a new protected member is declared in a struct. 
8264         (Field.Define): catch the error of readonly/volatile.
8265
8266         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
8267
8268         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
8269         volatile variable is taken
8270
8271 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
8272
8273         * statement.cs (Fixed.Resolve): Report an error if we are not in
8274         an unsafe context.
8275
8276 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
8277
8278         * typemanager.cs: reuse the code that handles type clashes for
8279         delegates and enumerations.
8280
8281         * class.cs (Report28): Always report.
8282
8283         * expression.cs (EncodeAsAttribute): Allow nulls here.
8284
8285 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
8286
8287         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
8288         the functionality for testing whether an expression is valid for
8289         an attribute here.  Also handle the case of arrays of elements
8290         being stored. 
8291
8292         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
8293         encoding a linear array into an array of objects that are suitable
8294         to be passed to an CustomAttributeBuilder.
8295
8296         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
8297
8298         * ecore.cs: (FieldExpr): Handle field remapping here.
8299
8300         * iteratators.cs: Pass the instance variable (if the method is an
8301         instance method) to the constructors, so we can access the field
8302         variables on the class.
8303
8304         TODO: Test this with structs.  I think the THIS variable on
8305         structs might have to be a pointer, and not a refenrece
8306
8307 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
8308
8309         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
8310         local variables to fields in a proxy class.
8311
8312         * iterators.cs (PopulateProxy): Rename our internal fields to
8313         <XXX>.  
8314         Create a <THIS> field if we are an instance method, so we can
8315         reference our parent container variables.
8316         (MapVariable): Called back from the EmitContext code to enter a
8317         new variable to field mapping into the proxy class (we just create
8318         a FieldBuilder).
8319
8320         * expression.cs
8321         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
8322         for using the remapped locals to fields.
8323
8324         I placed the code here, because that gives the same semantics to
8325         local variables, and only changes the Emit code.
8326
8327         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
8328         statements inside iterators.
8329         (VariableInfo): Add a FieldBuilder for the cases when we are
8330         remapping local variables to fields in a proxy class
8331
8332         * ecore.cs (SimpleNameResolve): Avoid testing two times for
8333         current_block != null.
8334
8335         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
8336         not cope with strings, as it has been moved to the
8337         TableSwitchEmit.  Fixed bug in switch generation.
8338
8339         * expression.cs (New.DoResolve): Provide more context for the user
8340         when reporting an error.
8341
8342         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
8343         pointers. 
8344
8345         * expression.cs (MemberAccess.DoResolve): When we get a type back,
8346         check the permissions for it.  Note than in a type-resolution
8347         context the check was already present in DeclSpace.ResolveType,
8348         but was missing from the MemberAccess.
8349
8350         (ArrayCreation.CheckIndices): warn if the user has
8351         more nested levels of expressions, but there are no more
8352         dimensions specified.  Avoids crash on bug 41906.
8353
8354 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
8355
8356         * statement.cs (Block): replace Implicit bool, for a generic
8357         flags.   
8358         New flag: `Unchecked'.  This is used during the EmitMeta phase
8359         (which is out-of-line with the regular Resolve/Emit process for a
8360         statement, as this is done ahead of time, but still gets a chance
8361         to call constant resolve).
8362
8363         (Block.Flags): new enum for adding a new flag.
8364
8365         (Block.EmitMeta): track the state of unchecked.
8366
8367         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
8368         to enable constant resolution to work there as well.
8369
8370 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
8371
8372         * typemanager.cs (ienumerable_type): Also look up
8373         System.Collections.IEnumerable. 
8374
8375 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
8376
8377         TODO: Test more than one conditional per method.
8378
8379         * class.cs (Indexer.Define): Report the location where the user is
8380         referencing the unsupported feature.
8381
8382         (MethodData): Overload the use of `conditionals' to
8383         minimize the creation of needless ArrayLists.   This saves roughly
8384         212kb on my machine.
8385
8386         (Method): Implement the new IIteratorContainer interface.
8387         (Method.SetYields): Implement the method by setting the ModFlags
8388         to contain METHOD_YIELDS.
8389
8390         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
8391         which just got set to null.
8392
8393         * iterators.cs: New file.
8394
8395         (Yield, YieldBreak): New statements.
8396
8397         * statement.cs (Return.Resolve): Flag an error if we are used in
8398         an iterator method.
8399
8400         * codegen.cs (InIterator): New flag set if the code is being
8401         compiled in an iterator method.
8402
8403         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
8404         internal modifier, and we just use it to avoid adding extra
8405         fields, as this is seldom used.  
8406
8407         * cs-parser.jay: Add yield_statement (yield and yield break).
8408
8409         * driver.cs: New flag -v2 to turn on version 2 features. 
8410
8411         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
8412         hashtable when v2 is enabled.
8413
8414 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
8415
8416         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
8417         there is already a namespace defined with this name.
8418
8419         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
8420         people upgraded their corlibs.
8421
8422         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
8423         always use fully qualified types, no need to use the compiler
8424         front end.
8425
8426         (TypeManager.IsNamespace): Use binarysearch.
8427
8428         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
8429         AddDelegate): I did not quite use the new IsValid API properly: I
8430         have to pass the short-name and the fullname.  I was passing only
8431         the basename instead of the fullname sometimes. 
8432
8433         (TypeContainer.DefineType): call NamespaceClash.
8434
8435         * interface.cs (Interface.DefineType): use NamespaceClash before
8436         defining the type.
8437
8438         * delegate.cs (Delegate.DefineType): use NamespaceClash before
8439         defining the type.
8440
8441         * enum.cs: (Enum.DefineType): use NamespaceClash before
8442         defining the type.
8443
8444         * typemanager.cs (: 3-line patch that gives us some tasty 11%
8445         speed increase.  First, use the negative_hits cache when we get a
8446         negative.  Second, add the type with its full original name
8447         instead of the new . and + encoded name (reflection uses + to
8448         separate type from a nested type).  Use LookupTypeReflection
8449         directly which bypasses the type->name hashtable (that we already
8450         know does not contain the type.
8451
8452         * decl.cs (DeclSpace.ResolveTypeExpr): track the
8453         location/container type. 
8454
8455         * driver.cs: When passing utf8, use directly the UTF8Encoding.
8456
8457 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
8458
8459         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
8460
8461         * delegate.cs (NewDelegate.Resolve): Test whether an instance
8462         method is being referenced in the method group from a static
8463         context, and report error 120 if so.
8464
8465         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
8466         Error118. 
8467
8468         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
8469         is created, we create the A namespace).
8470
8471         * cs-parser.jay: A namespace also introduces a DeclarationFound.
8472         Fixes #41591
8473
8474 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
8475
8476         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
8477         invocation to ModuleBuilder.GetType with the same values will
8478         return a new type instance, so we need to cache its return
8479         values. 
8480
8481         * expression.cs (Binary.ResolveOperator): Only allow the compare
8482         operators on enums if they are of the same type.
8483
8484         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
8485         types of ValueType on their own case.  Before we were giving them
8486         the same treatment as objects.
8487
8488         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
8489         fullname.  Short name is used to compare against container name.
8490         Fullname is used to check against defined namespace names.
8491
8492         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
8493         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
8494
8495         (Method.CheckBase): Call parent.
8496         (MemberBase.CheckBase): Check for protected members on sealed
8497         classes.
8498         (PropertyBase.CheckBase): Call parent.
8499         (Field.Define): Call parent.
8500
8501         * report.cs: Negative error codes are now mapped to 8000 - code,
8502         so that the display is render more nicely.
8503
8504         * typemanager.cs: Do not use try/catch, instead report a regular
8505         error. 
8506
8507         (GetPointerType, GetReferenceType): These methods provide
8508         mechanisms to obtain the T* and T& from a T.  We had the code
8509         previously scattered around the code base, and it also used
8510         TypeManager.LookupType that would go through plenty of caches.
8511         This one goes directly to the type source.
8512
8513         In some places we did the Type.GetType followed by
8514         ModuleBuilder.GetType, but not in others, so this unifies the
8515         processing as well.
8516
8517         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
8518         statements now that we have namespace information.
8519
8520         * typemanager.cs (IsNamespace): New method, returns whether the
8521         string presented is a namespace or not.
8522
8523         (ComputeNamespaces): New public entry point, computes the list of
8524         available namespaces, using the GetNamespaces API call in Mono, or
8525         the slower version in MS.NET.   
8526
8527         Now before we start the semantic analysis phase, we have a
8528         complete list of namespaces including everything that the user has
8529         provided.
8530
8531         Deleted old code to cache namespaces in .nsc files.
8532
8533 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
8534
8535         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
8536         class/struct location definition Location for the implicit
8537         constructor location.
8538
8539         (Operator.Define): Use the location of the operator for the
8540         implicit Method definition.
8541
8542         (Constructor.Emit): use the constructor location for the implicit
8543         base initializer constructor.
8544
8545         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
8546         and the Expression class now contains two new methods:
8547
8548         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
8549         isolate type lookup from the rest of the resolution process.
8550
8551         Since we use Expressions to hold type definitions due to the way
8552         we parse the input we have historically overloaded Resolve to
8553         perform the Type lookups if a special flag is passed.  Now this is
8554         eliminated and two methods take their place. 
8555
8556         The differences in the two methods between xStep and xTerminal is
8557         that xStep is involved in our current lookup system that uses
8558         SimpleNames to compose a name, while xTerminal is used just to
8559         catch the case where the simplename lookup failed.
8560
8561 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
8562
8563         * expression.cs (ResolveMemberAccess): Remove redundant code.
8564         TypeExpr expressions are always born fully resolved.
8565
8566         * interface.cs (PopulateMethod): Do not lookup the types twice.
8567         We were doing it once during SemanticAnalysis and once during
8568         PopulateMethod.
8569
8570         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
8571         in local variable type definitions, were being returned as a
8572         SimpleName (we decomposed everything into a string), that is
8573         because primary_expression was being used instead of a type in the
8574         grammar (reduce/reduce conflicts).
8575
8576         The part that was wrong is that we converted the expression into a
8577         string (an oversimplification in one hand, compounded with primary
8578         expressions doing string concatenation).
8579
8580         So things like:
8581
8582         A.B.C [] x;
8583
8584         Would return "A.B.C[]" as a SimpleName.  This stopped things like
8585         using clauses from working on this particular context.  And a type
8586         was being matched directly against "A.B.C[]".
8587
8588         We now use the correct approach, and allow for ComposedCast to be
8589         part of the unary expression.  So the "A.B.C []" become a composed
8590         cast of "A.B.C" (as a nested group of MemberAccess with a
8591         SimpleName at the end) plus the rank composition "[]". 
8592
8593         Also fixes 35567
8594
8595 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
8596
8597         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
8598         for the access level checking.
8599
8600         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
8601         `TypeContainer container', because I kept getting confused when I
8602         was debugging this code.
8603
8604         * expression.cs (Indexers): Instead of tracking getters/setters,
8605         we now track them in parallel.  We create one arraylist less, but
8606         most importantly it is possible now for the LValue code to find a
8607         matching get for a set.
8608
8609         (IndexerAccess.DoResolveLValue): Update the code.
8610         GetIndexersForType has been modified already to extract all the
8611         indexers from a type.  The code assumed it did not.
8612
8613         Also make the code set the correct return type for the indexer.
8614         This was fixed a long time ago for properties, but was missing for
8615         indexers.  It used to be void_type.
8616
8617         (Binary.Emit): Test first for doubles instead of
8618         floats, as they are more common.
8619
8620         (Binary.EmitBranchable): Use the .un version of the branch opcodes
8621         when dealing with floats and the <=, >= operators.  This fixes bug
8622         #39314 
8623
8624         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
8625         to load the array value by emitting a load on the foreach variable
8626         type.  This was incorrect.  
8627
8628         We now emit the code to load an element using the the array
8629         variable type, and then we emit the conversion operator.
8630
8631         Fixed #40176
8632
8633 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
8634
8635         * attribute.cs: Avoid allocation of ArrayLists in the common case.
8636
8637 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
8638
8639         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
8640         test for protection before we test for signatures. 
8641
8642         (MethodSignature.ToString): implement.
8643
8644         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
8645         to the case where we reduced into a LongConstant.
8646
8647         * decl.cs (CheckAccessLevel): If the type is an array, we can not
8648         depend on whether the information is acurrate, because the
8649         Microsoft runtime will always claim that the array type is public,
8650         regardless of the real state.
8651
8652         If the type is a pointer, another problem happens: the type is
8653         reported as non-public in Microsoft.  
8654
8655         In both cases we have to call CheckAccessLevel recursively with
8656         the underlying type as the argument to be tested.
8657
8658 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
8659
8660         * assign.cs (Assign.Emit): If we are dealing with a compound
8661         assignment expression, we should use the code path that stores the
8662         intermediate result in a temporary value.  This fixes #40903.
8663
8664         *expression.cs (Indirection.ToString): Provide ToString method for
8665         debugging. 
8666
8667 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
8668
8669         * class.cs: Null out fields holding references to Block objects so
8670         they can be garbage collected.
8671
8672         * expression.cs (OverloadResolve): Remove unused local.
8673
8674 2003-04-07  Martin Baulig  <martin@ximian.com>
8675
8676         * codegen.cs (EmitContext.CurrentFile): New public field.
8677         (EmitContext.Mark): Use the CurrentFile to check whether the
8678         location is in the correct file.
8679         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
8680
8681 2003-04-07  Martin Baulig  <martin@ximian.com>
8682
8683         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
8684
8685         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
8686         location.  [FIXME: The location argument which gets passed to this
8687         method is sometimes wrong!]
8688
8689 2003-04-07  Nick Drochak <ndrochak@gol.com>
8690
8691         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
8692
8693 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
8694
8695         * expression.cs (Indirection.EmitAssign): We were using the
8696         temporary, but returning immediately instead of continuing the
8697         EmitAssing flow.
8698
8699 2003-04-06  Martin Baulig  <martin@ximian.com>
8700
8701         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
8702         if it's a nested child, but also deriving from the outer class.
8703         See test 190.cs.
8704
8705         * typemanager.cs (IsNestedChildOf): Make this work if it's a
8706         nested child, but also deriving from the outer class.  See
8707         test-190.cs.
8708         (FilterWithClosure): We may access private members of the outer
8709         class if we're a nested child and deriving from the outer class.
8710         (RealMemberLookup): Only set `closure_private_ok' if the
8711         `original_bf' contained BindingFlags.NonPublic.
8712
8713 2003-04-05  Martin Baulig  <martin@ximian.com>
8714
8715         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
8716         probe if its a type parameter, and if so, flag an error.
8717
8718         * decl.cs: Move here the SetParameterInfo code from class.cs.
8719         Handle IsGeneric here.
8720
8721         Handle a variety of errors in the parameter info definition.
8722
8723         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
8724         type parameters here.
8725
8726         * cs-parser.jay (class_declaration): report errors for parameters
8727         here as well.
8728
8729 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
8730
8731         * generic.cs: New file, contains support code for generics.
8732
8733         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
8734         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
8735
8736         Update parser for the above removals.
8737
8738         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
8739         now taken care of in the parser.
8740
8741 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
8742
8743         * class.cs (Event.Define): Do not allow abstract events to have
8744         initializers. 
8745
8746 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
8747
8748         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
8749         block in event declarations.
8750
8751         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
8752         value type, get its address.
8753
8754         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
8755         leaving a class on the stack instead of a boolean value (int
8756         0/1).  Change the code so we compare against null, and then the
8757         result against zero.
8758
8759         * class.cs (TypeContainer.GetClassBases): We were checking for the
8760         parent class being sealed too late.
8761
8762         * expression.cs (Binary.Emit): For <= and >= when dealing with
8763         floating point values, use cgt.un and clt.un instead of cgt and
8764         clt alone.
8765
8766 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
8767
8768         * statement.cs: Apply the same optimization as MS: skip the 
8769         GetEnumerator returning an IEnumerator, and use the one returning a 
8770         CharEnumerator instead. This allows us to avoid the try-finally block 
8771         and the boxing.
8772
8773 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
8774
8775         * cs-parser.jay: Attributes cannot be applied to
8776                          namespaces. Fixes #40473
8777
8778 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8779
8780         * class.cs:
8781         (Add*): check if the name is valid using the full name for constants,
8782         fields, properties and events.
8783
8784 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
8785
8786         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
8787         char constants to be part of the enumeration.
8788
8789         * expression.cs (Conditional.DoResolve): Add support for operator
8790         true. Implements the missing functionality from 14.12
8791
8792         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
8793         operator true/false as required by the spec.
8794
8795         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
8796         implicit conversion to boolean.
8797
8798         * statement.cs (Statement.ResolveBoolean): A boolean expression is
8799         also one where the type implements `operator true'. 
8800
8801         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
8802         get an expression that will invoke operator true based on an
8803         expression.  
8804
8805         (GetConversionOperators): Removed the hack that called op_True
8806         here.  
8807
8808         (Expression.ResolveBoolean): Move this from Statement.
8809
8810 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
8811
8812         * ecore.cs (FieldExpr): do not allow initialization of initonly
8813         fields on derived classes
8814
8815 2003-03-13  Martin Baulig  <martin@ximian.com>
8816
8817         * statement.cs (Block.Emit): Call ig.BeginScope() and
8818         ig.EndScope() when compiling with debugging info; call
8819         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
8820
8821 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
8822
8823         * expression.cs (Indexers): Do not construct immediately, allow
8824         for new members to be appended as we go.  Fixes 38143
8825
8826 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8827
8828         * expression.cs: save/restore context when resolving an unchecked
8829         expression.
8830
8831 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
8832
8833         * cfold.cs: Catch division by zero in modulus operator during
8834         constant folding.
8835
8836 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
8837
8838         * interface.cs (Interface.DefineMembers): Avoid defining members
8839         twice. 
8840
8841 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
8842
8843         * driver.cs: handle the +/- options for -noconfig
8844
8845         * statement.cs (Unckeched.Resolve): Also track the state of
8846         unchecked in the Resolve phase.
8847
8848 2003-02-27  Martin Baulig  <martin@ximian.com>
8849
8850         * ecore.cs (Expression.MemberLookup): Don't create a
8851         MethodGroupExpr for something which is not a method.  Fixes #38291.
8852
8853 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
8854
8855         * class.cs (MemberBase.CheckParameters): Also check that the type
8856         is unmanaged if it is a pointer.
8857
8858         * expression.cs (SizeOf.Resolve): Add location information.
8859
8860         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
8861         a managed type is declared.
8862
8863         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
8864         parameter modifiers as well.  Fixes bug 38606
8865
8866         * class.cs: Very sad.  Am backing out the speed up changes
8867         introduced by the ArrayList -> Array in the TypeContainer, as they
8868         were not actually that much faster, and introduced a bug (no error
8869         reports on duplicated methods).
8870
8871         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
8872         source first, this will guarantee that we have a valid expression
8873         before calling in lower levels functions that will require a
8874         resolved object.  Then use this original_source in the
8875         target.ResolveLValue instead of the original source that was
8876         passed to us.
8877
8878         Another change.  Use target.Resolve instead of LValueResolve.
8879         Although we are resolving for LValues, we will let the Assign code
8880         take care of that (it will be called again from Resolve).  This
8881         basically allows code like this:
8882
8883         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
8884         class Y { void A (X x) { x [0] += o; }
8885
8886         The problem was that the indexer was trying to resolve for
8887         set_Item (idx, object o) and never finding one.  The real set_Item
8888         was set_Item (idx, X).  By delaying the process we get the right
8889         semantics. 
8890
8891         Fixes bug 36505
8892
8893 2003-02-23  Martin Baulig  <martin@ximian.com>
8894
8895         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
8896         while calling DoEmit ().
8897
8898         * codegen.cs (EmitContext.Mark): Don't mark locations in other
8899         source files; if you use the #line directive inside a method, the
8900         compiler stops emitting line numbers for the debugger until it
8901         reaches the end of the method or another #line directive which
8902         restores the original file.
8903
8904 2003-02-23  Martin Baulig  <martin@ximian.com>
8905
8906         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
8907
8908 2003-02-23  Martin Baulig  <martin@ximian.com>
8909
8910         * statement.cs (Block.AddChildVariableNames): We need to call this
8911         recursively, not just for our immediate children.
8912
8913 2003-02-23  Martin Baulig  <martin@ximian.com>
8914
8915         * class.cs (Event.Define): Always make the field private, like csc does.
8916
8917         * typemanager.cs (TypeManager.RealMemberLookup): Make events
8918         actually work, fixes bug #37521.
8919
8920 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
8921
8922         * delegate.cs: When creating the various temporary "Parameters"
8923         classes, make sure that we call the ComputeAndDefineParameterTypes
8924         on those new parameters (just like we do with the formal ones), to
8925         allow them to be resolved in the context of the DeclSpace.
8926
8927         This fixes the bug that Dick observed in Bugzilla #38530.
8928
8929 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
8930
8931         * expression.cs (ResolveMemberAccess): When resolving a constant,
8932         do not attempt to pull a constant if the value was not able to
8933         generate a valid constant.
8934
8935         * const.cs (LookupConstantValue): Do not report more errors than required.
8936
8937 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8938
8939         * expression.cs: fixes bug #38328.
8940
8941 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
8942
8943         * class.cs: Changed all the various members that can be part of a
8944         class from being an ArrayList to be an Array of the right type.
8945         During the DefineType type_list, interface_list, delegate_list and
8946         enum_list are turned into types, interfaces, delegates and enums
8947         arrays.  
8948
8949         And during the member population, indexer_list, event_list,
8950         constant_list, field_list, instance_constructor_list, method_list,
8951         operator_list and property_list are turned into their real arrays.
8952
8953         Although we could probably perform this operation earlier, for
8954         good error reporting we need to keep the lists and remove the
8955         lists for longer than required.
8956
8957         This optimization was triggered by Paolo profiling the compiler
8958         speed on the output of `gen-sample-program.pl' perl script. 
8959
8960         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
8961         not crash in methods like MemberLookupFailed that use this field.  
8962
8963         This problem arises when the compiler fails to resolve a type
8964         during interface type definition for example.
8965
8966 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
8967
8968         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
8969         inherit from System.Object, so we have to stop at null, not only
8970         when reaching System.Object.
8971
8972 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
8973
8974         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
8975         DeclaredOnly because the parent indexer might have had a different
8976         name, but did not loop until the top of the hierarchy was reached.
8977
8978         The problem this one fixes is 35492: when a class implemented an
8979         indexer from an interface, we were getting the interface method
8980         (which was abstract) and we were flagging an error (can not invoke
8981         abstract method).
8982
8983         This also keeps bug 33089 functioning, and test-148 functioning.
8984
8985         * typemanager.cs (IsSpecialMethod): The correct way of figuring
8986         out if a method is special is to see if it is declared in a
8987         property or event, or whether it is one of the predefined operator
8988         names.   This should fix correctly #36804.
8989
8990 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
8991
8992         The goal here is to remove the dependency on EmptyCast.Peel ().
8993         Killing it completely.
8994
8995         The problem is that currently in a number of places where
8996         constants are expected, we have to "probe" for an EmptyCast, and
8997         Peel, which is not the correct thing to do, as this will be
8998         repetitive and will likely lead to errors. 
8999
9000         The idea is to remove any EmptyCasts that are used in casts that
9001         can be reduced to constants, so we only have to cope with
9002         constants. 
9003
9004         This bug hunt was triggered by Bug 37363 and the desire to remove
9005         the duplicate pattern where we were "peeling" emptycasts to check
9006         whether they were constants.  Now constants will always be
9007         constants.
9008
9009         * ecore.cs: Use an enumconstant here instead of wrapping with
9010         EmptyCast.  
9011
9012         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
9013         throwing me off.  By handling this we can get rid of a few hacks.
9014
9015         * statement.cs (Switch): Removed Peel() code.
9016
9017 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
9018
9019         * class.cs: Location information for error 508
9020
9021         * expression.cs (New.DoResolve): Add a guard against double
9022         resolution of an expression.  
9023
9024         The New DoResolve might be called twice when initializing field
9025         expressions (see EmitFieldInitializers, the call to
9026         GetInitializerExpression will perform a resolve on the expression,
9027         and later the assign will trigger another resolution
9028
9029         This leads to bugs (#37014)
9030
9031         * delegate.cs: The signature for EndInvoke should contain any ref
9032         or out parameters as well.  We were not doing this in the past. 
9033
9034         * class.cs (Field.Define): Do not overwrite the type definition
9035         inside the `volatile' group.  Turns out that volatile enumerations
9036         were changing the type here to perform a validity test, which
9037         broke conversions. 
9038
9039 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
9040
9041         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
9042         and structs, we do not want to load the instance variable
9043
9044         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
9045         enum_type has to be handled like an object reference (implicit
9046         conversions exists from this to object), but the regular IsClass
9047         and IsValueType tests will never return true for this one.
9048
9049         Also we use TypeManager.IsValueType instead of type.IsValueType,
9050         just for consistency with the rest of the code (this is only
9051         needed if we ever use the construct exposed by test-180.cs inside
9052         corlib, which we dont today).
9053
9054 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
9055
9056         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
9057         just InternalCall.
9058
9059 2003-02-09  Martin Baulig  <martin@ximian.com>
9060
9061         * namespace.cs (Namespace..ctor): Added SourceFile argument.
9062         (Namespace.DefineNamespaces): New static public method; this is
9063         called when we're compiling with debugging to add all namespaces
9064         to the symbol file.
9065
9066         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
9067         pass it to the Namespace's .ctor.
9068
9069         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
9070         and MethodBase arguments; pass the namespace ID to the symwriter;
9071         pass the MethodBase instead of the token to the symwriter.
9072         (SymbolWriter.DefineNamespace): New method to add a namespace to
9073         the symbol file.
9074
9075 2003-02-09  Martin Baulig  <martin@ximian.com>
9076
9077         * symbolwriter.cs: New file.  This is a wrapper around
9078         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
9079         methods here in near future.
9080
9081 2003-02-09  Martin Baulig  <martin@ximian.com>
9082
9083         * codegen.cs (EmitContext.Mark): Just pass the arguments to
9084         ILGenerator.MarkSequencePoint() which are actually used by the
9085         symbol writer.
9086
9087 2003-02-09  Martin Baulig  <martin@ximian.com>
9088
9089         * location.cs (SourceFile): New public sealed class.  This
9090         contains the name and an index which is used in the location's token.
9091         (Location): Reserve an appropriate number of bits in the token for
9092         the source file instead of walking over that list, this gives us a
9093         really huge performance improvement when compiling with debugging.
9094
9095         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
9096         `SourceFile' argument instead of a string.
9097         (Driver.ProcessFile): Add all the files via Location.AddFile(),
9098         but don't parse/tokenize here, we need to generate the list of all
9099         source files before we do that.
9100         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
9101         the files.
9102
9103         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
9104         instead of a string.
9105
9106         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
9107         of a string.
9108
9109 2003-02-09  Martin Baulig  <martin@ximian.com>
9110
9111         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
9112         filename on `#line default'.
9113
9114 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
9115
9116         * statement.cs: don't clear the pinned var when the fixed statement
9117         returns from the method (fixes bug#37752).
9118
9119 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
9120
9121         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
9122         to IsValueType.
9123
9124 2003-02-07  Martin Baulig  <martin@ximian.com>
9125
9126         * driver.cs: Removed the `--debug-args' command line argument.
9127
9128         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
9129         automatically by the AsssemblyBuilder.
9130         (CodeGen.InitializeSymbolWriter): We don't need to call any
9131         initialization function on the symbol writer anymore.  This method
9132         doesn't take any arguments.
9133
9134 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
9135
9136         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
9137         from referenced assemblies as well.
9138
9139 2003-02-02  Martin Baulig  <martin@ximian.com>
9140
9141         * class.cs (MethodData.Emit): Generate debugging info for external methods.
9142
9143 2003-02-02  Martin Baulig  <martin@ximian.com>
9144
9145         * class.cs (Constructor.Emit): Open the symbol writer before
9146         emitting the constructor initializer.
9147         (ConstructorInitializer.Emit): Call ec.Mark() to allow
9148         single-stepping through constructor initializers.
9149
9150 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
9151
9152         * class.cs: Handle error 549: do not allow virtual methods in
9153         sealed classes. 
9154
9155 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
9156
9157         * decl.cs: Check access levels when resolving types
9158
9159 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
9160
9161         * statement.cs: Add parameters and locals set in catch blocks that might 
9162         return to set vector
9163
9164 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
9165
9166         * class.cs (Operator): Set the SpecialName flags for operators.
9167
9168         * expression.cs (Invocation.DoResolve): Only block calls to
9169         accessors and operators on SpecialName methods.
9170
9171         (Cast.TryReduce): Handle conversions from char constants.
9172
9173
9174 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
9175
9176         * statement.cs: small memory and time optimization in FlowBranching.
9177
9178 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
9179
9180         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
9181         problem that the last fix but in the other sid (Set).
9182
9183         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
9184         access when there is no indexer in the hierarchy.
9185
9186 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
9187
9188         * class.cs: Combine some if statements.
9189
9190 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9191
9192         * driver.cs: fixed bug #37187.
9193
9194 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
9195
9196         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
9197         any indexer, it's needed to build a list with all the indexers in the
9198         hierarchy (AllGetters), else we have problems. Fixes #35653.
9199
9200 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
9201
9202         * class.cs (MethodData.Define): It is wrong for an interface
9203         implementation to be static in both cases: explicit and implicit.
9204         We were only handling this in one case.
9205
9206         Improve the if situation there to not have negations.
9207
9208         * class.cs (Field.Define): Turns out that we do not need to check
9209         the unsafe bit on field definition, only on usage.  Remove the test.
9210
9211 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9212
9213         * driver.cs: use assembly.Location instead of Codebase (the latest
9214         patch made mcs fail when using MS assemblies).
9215
9216 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
9217
9218         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
9219         get the path to *corlib.dll.
9220
9221 2003-01-21  Nick Drochak <ndrochak@gol.com>
9222
9223         * cs-tokenizer.cs:
9224         * pending.cs:
9225         * typemanager.cs: Remove compiler warnings
9226
9227 2003-01-20  Duncan Mak  <duncan@ximian.com>
9228
9229         * AssemblyInfo.cs: Bump the version number to 0.19.
9230
9231 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9232
9233         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
9234
9235 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
9236
9237         * class.cs (Constructor::Emit): Emit debugging info for constructors.
9238
9239 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
9240
9241         * cs-parser.jay: Small fix: we were not comparing the constructor
9242         name correctly.   Thanks to Zoltan for the initial pointer.
9243
9244 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
9245
9246         * cs-tokenizer.cs: Set file name when specified with #line
9247
9248 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
9249
9250         * cs-parser.jay: Only perform the constructor checks here if we
9251         are named like the class;  This will help provider a better
9252         error.  The constructor path is taken when a type definition is
9253         not found, but most likely the user forgot to add the type, so
9254         report that rather than the constructor error.
9255
9256 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
9257
9258         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
9259         allocations.
9260
9261 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
9262
9263         * cs-parser.jay: Add cleanup call.
9264
9265 2003-01-13  Duncan Mak  <duncan@ximian.com>
9266
9267         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
9268         consistent with other methods.
9269
9270 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
9271
9272         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
9273
9274 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
9275
9276         * attribute.cs: only set GuidAttr to true when we have a
9277         GuidAttribute.
9278
9279 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9280
9281         * ecore.cs:
9282         * expression.cs:
9283         * typemanager.cs: fixes to allow mcs compile corlib with the new
9284         Type.IsSubclassOf fix.
9285
9286 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
9287
9288         * expression.cs (LocalVariableReference.DoResolve): Classify a
9289         constant as a value, not as a variable.   Also, set the type for
9290         the variable.
9291
9292         * cs-parser.jay (fixed_statement): take a type instead of a
9293         pointer_type, so we can produce a better error message later.
9294
9295         * statement.cs (Fixed.Resolve): Flag types that are not pointers
9296         as an error.  
9297
9298         (For.DoEmit): Make inifinite loops have a
9299         non-conditional branch back.
9300
9301         (Fixed.DoEmit): First populate the pinned variables, then emit the
9302         statement, then clear the variables.  Before I was emitting the
9303         code once for each fixed piece.
9304
9305
9306 2003-01-08  Martin Baulig  <martin@ximian.com>
9307
9308         * statement.cs (FlowBranching.MergeChild): A break in a
9309         SWITCH_SECTION does not leave a loop.  Fixes #36155.
9310
9311 2003-01-08  Martin Baulig  <martin@ximian.com>
9312
9313         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
9314         lives in the same number space than `param_map'.  Fixes #36154.
9315
9316 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
9317
9318         * cs-parser.jay (constructor_declaration): Set the
9319         Constructor.ModFlags before probing for it.  This makes the
9320         compiler report 514, 515 and 132 (the code was there, but got
9321         broken). 
9322
9323         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
9324         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
9325         (GotoCase.Resolve): Set `Returns' to ALWAYS.
9326
9327 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
9328
9329         * enum.cs: create the enum static fields using the enum type.
9330
9331 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
9332
9333         * class.cs: don't try to create the ParamBuilder for the return
9334         type if it's not needed (and handle it breaking for the ms runtime
9335         anyway).
9336
9337 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
9338
9339         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
9340
9341 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
9342
9343         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
9344         the command.   This showed up while compiling the JANET source
9345         code, which used \r as its only newline separator.
9346
9347 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
9348
9349         * class.cs (Method.Define): If we are an operator (because it
9350         reuses our code), then set the SpecialName and HideBySig.  #36128
9351
9352 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
9353
9354         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
9355         exception, report error 120 `object reference required'.
9356
9357         * driver.cs: Add --pause option, used during to measure the size
9358         of the process as it goes with --timestamp.
9359
9360         * expression.cs (Invocation.DoResolve): Do not allow methods with
9361         SpecialName to be invoked.
9362
9363 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
9364
9365         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
9366         number before adding it.
9367
9368 2002-12-21  Ravi Pratap  <ravi@ximian.com>
9369
9370         * ecore.cs (StandardImplicitConversion): When in an unsafe
9371         context, we allow conversion between void * to any other pointer
9372         type. This fixes bug #35973.
9373
9374 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
9375
9376         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
9377         is not thrown when extensionless outputs are used 
9378
9379 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9380
9381         * rootcontext.cs: fixed compilation of corlib.
9382
9383 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
9384
9385         * attribute.cs (Attributes.Contains): Add new method.
9386
9387         * class.cs (MethodCore.LabelParameters): if the parameter is an
9388         `out' parameter, check that no attribute `[In]' has been passed.
9389
9390         * enum.cs: Handle the `value__' name in an enumeration.
9391
9392 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
9393
9394         * decl.cs: Added special case to allow overrides on "protected
9395         internal" methods
9396
9397 2002-12-18  Ravi Pratap  <ravi@ximian.com>
9398
9399         * attribute.cs (Attributes.AddAttributeSection): Rename to this
9400         since it makes much more sense.
9401
9402         (Attributes.ctor): Don't require a Location parameter.
9403
9404         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
9405
9406         * attribute.cs (ApplyAttributes): Remove extra Location parameters
9407         since we already have that information per attribute.
9408
9409         * everywhere : make appropriate changes.
9410
9411         * class.cs (LabelParameters): Write the code which actually
9412         applies attributes to the return type. We can't do this on the MS
9413         .NET runtime so we flag a warning in the case an exception is
9414         thrown.
9415
9416 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
9417
9418         * const.cs: Handle implicit null conversions here too.
9419
9420 2002-12-17  Ravi Pratap  <ravi@ximian.com>
9421
9422         * class.cs (MethodCore.LabelParameters): Remove the extra
9423         Type [] parameter since it is completely unnecessary. Instead
9424         pass in the method's attributes so that we can extract
9425         the "return" attribute.
9426
9427 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
9428
9429         * cs-parser.jay (parse): Use Report.Error to flag errors instead
9430         of ignoring it and letting the compile continue.
9431
9432         * typemanager.cs (ChangeType): use an extra argument to return an
9433         error condition instead of throwing an exception.
9434
9435 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
9436
9437         * expression.cs (Unary.TryReduce): mimic the code for the regular
9438         code path.  Perform an implicit cast in the cases where we can
9439         implicitly convert to one of the integral types, and then reduce
9440         based on that constant.   This fixes bug #35483.
9441
9442 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9443
9444         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
9445
9446 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9447
9448         * namespace.cs: fixed bug #35489.
9449
9450 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
9451
9452         * class.cs: Remove some dead code.
9453
9454         * cs-parser.jay: Estimate the number of methods needed
9455         (RootContext.MethodCount);
9456
9457         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
9458         numbers instead of StringBuilders.
9459
9460         * support.cs (PtrHashtable): Add constructor with initial size;
9461         We can now reduce reallocations of the method table.
9462
9463 2002-12-10  Ravi Pratap  <ravi@ximian.com>
9464
9465         * attribute.cs (ApplyAttributes): Keep track of the emitted
9466         attributes on a per-target basis. This fixes bug #35413.
9467
9468 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
9469
9470         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
9471         default to the Windows 1252 encoding.
9472
9473         (UnixParseOption): Support version, thanks to Alp for the missing
9474         pointer. 
9475
9476         * AssemblyInfo.cs: Add nice assembly information.
9477
9478         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
9479         (bug 35169).
9480
9481         * cs-parser.jay: Allow a trailing comma before the close bracked
9482         in the attribute_section production.
9483
9484         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
9485         address of the instance was being taken, I will take this out,
9486         because we take the address of the object immediately here.
9487
9488 2002-12-09  Ravi Pratap  <ravi@ximian.com>
9489
9490         * typemanager.cs (AreMultipleAllowed): Take care of the most
9491         obvious case where attribute type is not in the current assembly -
9492         stupid me ;-)
9493
9494 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
9495
9496         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
9497         definitions, instead of doing that afterwards.  
9498
9499         Also we use a nice little hack, depending on the constructor, we
9500         know if we are a "composed" name or a simple name.  Hence, we
9501         avoid the IndexOf test, and we avoid 
9502
9503         * codegen.cs: Add code to assist in a bug reporter to track down
9504         the source of a compiler crash. 
9505
9506 2002-12-07  Ravi Pratap  <ravi@ximian.com>
9507
9508         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
9509         types have been emitted for a given element and flag an error
9510         if something which does not have AllowMultiple set is used more
9511         than once.
9512
9513         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
9514         attribute types and their corresponding AllowMultiple properties
9515
9516         (AreMultipleAllowed): Check the property for a given type.
9517
9518         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
9519         property in the case we have a TypeContainer.
9520
9521         (Attributes.AddAttribute): Detect duplicates and just skip on
9522         adding them. This trivial fix catches a pretty gross error in our
9523         attribute emission - global attributes were being emitted twice!
9524
9525         Bugzilla bug #33187 is now fixed.
9526
9527 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
9528
9529         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
9530         instead of pp_and).
9531
9532         * expression.cs (Binary.ResolveOperator): I can only use the
9533         Concat (string, string, string) and Concat (string, string,
9534         string, string) if the child is actually a concatenation of
9535         strings. 
9536
9537 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
9538
9539         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
9540         context where we need a 2-character lookahead.
9541
9542         * pending.cs (PendingImplementation): Rework so we can keep track
9543         of interface types all the time, and flag those which were
9544         implemented by parents as optional.
9545
9546 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
9547
9548         * expression.cs (Binary.ResolveOperator): Use
9549         String.Concat(string,string,string) or
9550         String.Concat(string,string,string,string) when possible. 
9551
9552         * typemanager: More helper methods.
9553
9554
9555 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
9556
9557         * pending.cs: remove the bogus return from GetMissingInterfaces()
9558         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
9559
9560 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9561
9562         * namespace.cs: avoid duplicated 'using xxx' being added to
9563         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
9564         when we get more than one 'using' statement for the same namespace.
9565         Report a CS0105 warning for it.
9566
9567 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
9568
9569         * cs-tokenizer.cs (consume_identifier): use read directly, instead
9570         of calling getChar/putback, uses internal knowledge of it.    
9571
9572         (xtoken): Reorder tokenizer so most common patterns are checked
9573         first.  This reduces the compilation time in another 5% (from 8.11s
9574         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
9575
9576         The parsing time is 22% of the compilation in mcs, and from that
9577         64% is spent on the tokenization process.  
9578
9579         I tried using a binary search for keywords, but this is slower
9580         than the hashtable.  Another option would be to do a couple of
9581         things:
9582
9583                 * Not use a StringBuilder, instead use an array of chars,
9584                   with a set value.  Notice that this way we could catch
9585                   the 645 error without having to do it *afterwards*.
9586
9587                 * We could write a hand-parser to avoid the hashtable
9588                   compares altogether.
9589
9590         The identifier consumption process takes 37% of the tokenization
9591         time.  Another 15% is spent on is_number.  56% of the time spent
9592         on is_number is spent on Int64.Parse:
9593
9594                 * We could probably choose based on the string length to
9595                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
9596                   computations. 
9597
9598         Another 3% is spend on wrapping `xtoken' in the `token' function.
9599
9600         Handle 0xa0 as whitespace (#34752)
9601
9602 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
9603
9604         * typemanager.cs (IsCLRType): New routine to tell whether a type
9605         is one of the builtin types.  
9606
9607         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
9608         typecode in more places instead of doing pointer comparissions.
9609         We could leverage some knowledge about the way the typecodes are
9610         laid out.
9611
9612         New code to cache namespaces in assemblies, it is currently not
9613         invoked, to be used soon.
9614
9615         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
9616
9617         * expression.cs (Binary.ResolveOperator): specially handle
9618         strings, and do not perform user-defined operator overloading for
9619         built-in types.
9620
9621 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
9622
9623         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
9624         internalcall as it is a pretty simple operation;  Avoid whenever
9625         possible to call Char.IsLetter.
9626
9627         (consume_identifier): Cut by half the number of
9628         hashtable calls by merging the is_keyword and GetKeyword behavior.
9629
9630         Do not short-circuit, because if we do, we
9631         report errors (ie, #if false && true would produce an invalid
9632         directive error);
9633
9634
9635 2002-11-24  Martin Baulig  <martin@ximian.com>
9636
9637         * expression.cs (Cast.TryReduce): If we're in checked syntax,
9638         check constant ranges and report a CS0221.  Fixes #33186.
9639
9640 2002-11-24  Martin Baulig  <martin@ximian.com>
9641
9642         * cs-parser.jay: Make this work for uninitialized variable
9643         declarations in the `for' initializer.  Fixes #32416.
9644
9645 2002-11-24  Martin Baulig  <martin@ximian.com>
9646
9647         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
9648         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
9649
9650 2002-11-24  Martin Baulig  <martin@ximian.com>
9651
9652         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
9653         argument; if true, we also check for user-defined conversions.
9654         This is only needed if both arguments are of a user-defined type.
9655         Fixes #30443, added test-175.cs.
9656         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
9657
9658         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
9659
9660 2002-11-24  Martin Baulig  <martin@ximian.com>
9661
9662         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
9663         function to get the store opcode.
9664         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
9665         only emit the Ldelema if the store opcode is Stobj.  You must run
9666         both test-34 and test-167 to test this.  Fixes #34529.
9667
9668 2002-11-23  Martin Baulig  <martin@ximian.com>
9669
9670         * ecore.cs (Expression.MemberLookup): Added additional
9671         `qualifier_type' argument which is used when we're being called
9672         from MemberAccess.DoResolve() and null if we're called from a
9673         SimpleName lookup.
9674         (Expression.MemberLookupFailed): New method to report errors; this
9675         does the CS1540 check and reports the correct error message.
9676
9677         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
9678         argument for the CS1540 check and redone the way how we're dealing
9679         with private members.  See the comment in the source code for details.
9680         (FilterWithClosure): Reverted this back to revision 1.197; renamed
9681         `closure_start_type' to `closure_qualifier_type' and check whether
9682         it's not null.  It was not this filter being broken, it was just
9683         being called with the wrong arguments.
9684
9685         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
9686         and pass it the correct `qualifier_type'; this also does the error
9687         handling for us.
9688
9689 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
9690
9691         * expression.cs (Invocation.EmitParams): If the we are dealing
9692         with a non-built-in value type, load its address as well.
9693
9694         (ArrayCreation): Use a a pretty constant instead
9695         of the hardcoded value 2.   Use 6 instead of 2 for the number of
9696         static initializers.  
9697
9698         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
9699         because they are not really value types, just glorified integers. 
9700
9701         * driver.cs: Do not append .exe, the CSC compiler does not do it.
9702
9703         * ecore.cs: Remove redundant code for enumerations, make them use
9704         the same code path as everything else, fixes the casting issue
9705         with enumerations in Windows.Forms.
9706
9707         * attribute.cs: Do only cast to string if it is a string, the
9708         validation happens later.
9709
9710         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
9711         people upgrade their corlibs.
9712
9713         * ecore.cs: Oops, enumerations were not following the entire code path
9714
9715 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
9716
9717         * typemanager.cs (FilterWithClosure): Commented out the test for
9718         1540 in typemanager.cs, as it has problems when accessing
9719         protected methods from a parent class (see test-174.cs). 
9720
9721         * attribute.cs (Attribute.ValidateGuid): new method.
9722         (Attribute.Resolve): Use above.
9723
9724 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
9725
9726         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
9727
9728         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
9729         handling for enumerations, as we only needed the TypeContainer
9730         functionality to begin with (this is required for the fix below to
9731         work for enums that reference constants in a container class for
9732         example). 
9733
9734         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
9735
9736         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
9737         a valid TypeBuilder to perform lookups on.o
9738
9739         * class.cs (InheritableMemberSignatureCompare): Use true in the
9740         call to GetGetMethod and GetSetMethod, because we are comparing
9741         the signature, and we need to get the methods *even* if they are
9742         private. 
9743
9744         (PropertyBase.CheckBase): ditto.
9745
9746         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
9747         GotoCase.Resolve): Use Peel on EmpytCasts.
9748
9749         * ecore.cs (EmptyCast): drop child, add Peel method.
9750
9751 2002-11-17  Martin Baulig  <martin@ximian.com>
9752
9753         * ecore.cs (EmptyCast.Child): New public property.
9754
9755         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
9756         label resolved to an EmptyCast.  Fixes #34162.
9757         (GotoCase.Resolve): Likewise.
9758         (Block.EmitMeta): Likewise.
9759
9760 2002-11-17  Martin Baulig  <martin@ximian.com>
9761
9762         * expression.cs (Invocation.BetterConversion): Prefer int over
9763         uint; short over ushort; long over ulong for integer literals.
9764         Use ImplicitConversionExists instead of StandardConversionExists
9765         since we also need to check for user-defined implicit conversions.
9766         Fixes #34165.  Added test-173.cs.
9767
9768 2002-11-16  Martin Baulig  <martin@ximian.com>
9769
9770         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
9771         with the `true' and `false' literals.  Fixes #33151.
9772
9773 2002-11-16  Martin Baulig  <martin@ximian.com>
9774
9775         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
9776         October 22nd; don't do the cs1540 check for static members.
9777
9778         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
9779         now using our own filter here and doing the cs1540 check again.
9780
9781 2002-11-16  Martin Baulig  <martin@ximian.com>
9782
9783         * support.cs (InternalParameters): Don't crash if we don't have
9784         any fixed parameters.  Fixes #33532.
9785
9786 2002-11-16  Martin Baulig  <martin@ximian.com>
9787
9788         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
9789         when looking up static methods to make this work on Windows.
9790         Fixes #33773.
9791
9792 2002-11-16  Martin Baulig  <martin@ximian.com>
9793
9794         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
9795         a setter rather than using PropertyInfo.CanWrite.
9796
9797 2002-11-15  Nick Drochak  <ndrochak@gol.com>
9798
9799         * class.cs: Allow acces to block member by subclasses. Fixes build
9800         breaker.
9801
9802 2002-11-14  Martin Baulig  <martin@ximian.com>
9803
9804         * class.cs (Constructor.Emit): Added the extern/block check.
9805         Fixes bug #33678.
9806
9807 2002-11-14  Martin Baulig  <martin@ximian.com>
9808
9809         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
9810         iteration while looking for indexers, this is needed because the
9811         indexer may have a different name in our base classes.  Fixed the
9812         error reporting (no indexers at all, not get accessor, no
9813         overloaded match).  Fixes bug #33089.
9814         (IndexerAccess.DoResolveLValue): Likewise.
9815
9816 2002-11-14  Martin Baulig  <martin@ximian.com>
9817
9818         * class.cs (PropertyBase.CheckBase): Make this work for multiple
9819         indexers.  Fixes the first part of bug #33089.
9820         (MethodSignature.InheritableMemberSignatureCompare): Added support
9821         for properties.
9822
9823 2002-11-13  Ravi Pratap  <ravi@ximian.com>
9824
9825         * attribute.cs (Attribute.Resolve): Catch the
9826         NullReferenceException and report it since it isn't supposed to
9827         happen. 
9828
9829 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
9830
9831         * expression.cs (Binary.EmitBranchable): Also handle the cases for
9832         LogicalOr and LogicalAnd that can benefit from recursively
9833         handling EmitBranchable.  The code now should be nice for Paolo.
9834
9835 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
9836
9837         * typemanager.cs (LookupType): Added a negative-hit hashtable for
9838         the Type lookups, as we perform quite a number of lookups on
9839         non-Types.  This can be removed once we can deterministically tell
9840         whether we have a type or a namespace in advance.
9841
9842         But this might require special hacks from our corlib.
9843
9844         * TODO: updated.
9845
9846         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
9847         and double which avoids a conversion from an integer to a double.
9848
9849         * expression.cs: tiny optimization, avoid calling IsConstant,
9850         because it effectively performs the lookup twice.
9851
9852 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
9853
9854         But a bogus return here to keep the semantics of the old code
9855         until the Mono runtime is fixed.
9856
9857         * pending.cs (GetMissingInterfaces): New method used to remove all
9858         the interfaces that are already implemented by our parent
9859         classes from the list of pending methods. 
9860
9861         * interface.cs: Add checks for calls after ResolveTypeExpr.
9862
9863 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
9864
9865         * class.cs (Class.Emit): Report warning 67: event not used if the
9866         warning level is beyond 3.
9867
9868         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
9869         being a NullLiteral.
9870
9871         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
9872         specifiers. 
9873
9874         * class.cs (TypeContainer.GetClassBases): Cover a missing code
9875         path that might fail if a type can not be resolved.
9876
9877         * expression.cs (Binary.Emit): Emit unsigned versions of the
9878         operators. 
9879
9880         * driver.cs: use error 5.
9881
9882 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
9883
9884         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
9885
9886 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
9887
9888         * cs-parser.jay (switch_section): A beautiful patch from Martin
9889         Baulig that fixed 33094.
9890
9891 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
9892
9893         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
9894         Check whether the base is abstract and report an error if so.
9895
9896         * expression.cs (IndexerAccess.DoResolveLValue,
9897         IndexerAccess.DoResolve): ditto. 
9898
9899         (Invocation.DoResolve): ditto.
9900
9901         (Invocation.FullMethodDesc): Improve the report string.
9902
9903         * statement.cs (Block): Eliminate IsVariableDefined as it is
9904         basically just a wrapper for GetVariableInfo.
9905
9906         * ecore.cs (SimpleName): Use new 
9907
9908         * support.cs (ReflectionParamter.ParameterType): We unwrap the
9909         type, as we return the actual parameter ref/unref state on a
9910         different call.
9911
9912 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
9913
9914         * support.cs: Return proper flags REF/OUT fixing the previous
9915         commit.  
9916
9917         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
9918         not used to mean `ref' but `ref or out' in ParameterReference
9919
9920         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
9921         full type signature instead of calling TypeManger.CSharpName
9922         ourselves. 
9923
9924         * support.cs (InternalParameters.ParameterDesc): Do not compare
9925         directly to the modflags, because REF/OUT will actually be bitsets
9926         if set. 
9927
9928         * delegate.cs (VerifyMethod): Check also the modifiers.
9929
9930         * cs-tokenizer.cs: Fix bug where floating point values with an
9931         exponent where a sign was missing was ignored.
9932
9933         * driver.cs: Allow multiple assemblies to be specified in a single
9934         /r: argument
9935
9936 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
9937
9938         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
9939         because identifiers after a parenthesis would end up in this kind
9940         of production, and we needed to desamiguate it for having casts
9941         like:
9942
9943                 (UserDefinedType *) xxx
9944
9945 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
9946
9947         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
9948         we should set on the Bindingflags.NonPublic, but not turn on
9949         private_ok.  private_ok controls whether a Private member is
9950         returned (this is chekced on the filter routine), while the
9951         BindingFlags.NonPublic just controls whether private/protected
9952         will be allowed.   This fixes the problem part of the problem of
9953         private properties being allowed to be used in derived classes.
9954
9955         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
9956         so we can call the children DoResolveLValue method (this will
9957         properly signal errors on lvalue assignments to base properties)
9958
9959         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
9960         getter are null, and we have a property info, we know that this
9961         happened because the lookup failed, so we report an error 122 for
9962         protection level violation.
9963
9964         We also silently return if setter and getter are null in the
9965         resolve functions, this condition only happens if we have flagged
9966         the error before.  This is the other half of the problem. 
9967
9968         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
9969         not have accessibility information, that is why we were returning
9970         true in the filter function in typemanager.cs.
9971
9972         To properly report 122 (property is inaccessible because of its
9973         protection level) correctly, we report this error in ResolveAccess
9974         by failing if both the setter and the getter are lacking (ie, the
9975         lookup failed). 
9976
9977         DoResolve and DoLResolve have been modified to check for both
9978         setter/getter being null and returning silently, the reason being
9979         that I did not want to put the knowledge about this error in upper
9980         layers, like:
9981
9982         int old = Report.Errors;
9983         x = new PropertyExpr (...);
9984         if (old != Report.Errors)
9985                 return null;
9986         else
9987                 return x;
9988
9989         So the property expr is returned, but it is invalid, so the error
9990         will be flagged during the resolve process. 
9991
9992         * class.cs: Remove InheritablePropertySignatureCompare from the
9993         class, as we no longer depend on the property signature to compute
9994         whether it is possible to implement a method or not.
9995
9996         The reason is that calling PropertyInfo.GetGetMethod will return
9997         null (in .NET, in Mono it works, and we should change this), in
9998         cases where the Get Method does not exist in that particular
9999         class.
10000
10001         So this code:
10002
10003         class X { public virtual int A { get { return 1; } } }
10004         class Y : X { }
10005         class Z : Y { public override int A { get { return 2; } } }
10006
10007         Would fail in Z because the parent (Y) would not have the property
10008         defined.  So we avoid this completely now (because the alternative
10009         fix was ugly and slow), and we now depend exclusively on the
10010         method names.
10011
10012         (PropertyBase.CheckBase): Use a method-base mechanism to find our
10013         reference method, instead of using the property.
10014
10015         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
10016         routines are gone now.
10017
10018         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
10019         names, they were incorrectly named.
10020
10021         * cs-tokenizer.cs: Return are more gentle token on failure. 
10022
10023         * pending.cs (PendingImplementation.InterfaceMethod): This routine
10024         had an out-of-sync index variable, which caused it to remove from
10025         the list of pending methods the wrong method sometimes.
10026
10027 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
10028
10029         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
10030         CanWrite, because those refer to this particular instance of the
10031         property, and do not take into account the fact that we can
10032         override single members of a property.
10033
10034         Constructor requires an EmitContext.  The resolution process does
10035         not happen here, but we need to compute the accessors before,
10036         because the resolution does not always happen for properties.
10037
10038         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
10039         subclass, before we did not update this flag, but we did update
10040         bindingflags. 
10041
10042         (GetAccessors): Drop this routine, as it did not work in the
10043         presence of partially overwritten set/get methods. 
10044
10045         Notice that this broke the cs1540 detection, but that will require
10046         more thinking. 
10047
10048 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10049
10050         * class.cs:
10051         * codegen.cs:
10052         * driver.cs: issue a warning instead of an error if we don't support
10053         debugging for the platform. Also ignore a couple of errors that may
10054         arise when trying to write the symbols. Undo my previous patch.
10055
10056 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10057
10058         * driver.cs: ignore /debug switch except for Unix platforms.
10059
10060 2002-10-23  Nick Drochak  <ndrochak@gol.com>
10061
10062         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
10063
10064 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
10065
10066         * driver.cs: Do not make mcs-debug conditional, so we do not break
10067         builds that use it.
10068
10069         * statement.cs (UsageVector.MergeChildren): I would like Martin to
10070         review this patch.  But basically after all the children variables
10071         have been merged, the value of "Breaks" was not being set to
10072         new_breaks for Switch blocks.  I think that it should be set after
10073         it has executed.  Currently I set this to the value of new_breaks,
10074         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
10075         conservative, but I do not understand this code very well.
10076
10077         I did not break anything in the build, so that is good ;-)
10078
10079         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
10080
10081 2002-10-20  Mark Crichton  <crichton@gimp.org>
10082
10083         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
10084
10085 2002-10-20  Nick Drochak  <ndrochak@gol.com>
10086
10087         * cfold.cs: Fixed compile blocker.
10088
10089 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
10090
10091         * driver.cs: I was chekcing the key, not the file.
10092
10093 2002-10-19  Ravi Pratap  <ravi@ximian.com>
10094
10095         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
10096         message that we were generating - we just need to silently return
10097         a null.
10098
10099 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
10100
10101         * class.cs (Event.Define): Change my previous commit, as this
10102         breaks the debugger.  This is a temporary hack, as it seems like
10103         the compiler is generating events incorrectly to begin with.
10104
10105         * expression.cs (Binary.ResolveOperator): Added support for 
10106         "U operator - (E x, E y)"
10107
10108         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
10109         y)".
10110
10111         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
10112         init-only variables, but this path did not take into account that
10113         there might be also instance readonly variables.  Correct this
10114         problem. 
10115
10116         This fixes bug 32253
10117
10118         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
10119         delegates as well.
10120
10121         * driver.cs: Change the extension for modules to `netmodule'
10122
10123         * cs-parser.jay: Improved slightly the location tracking for
10124         the debugger symbols.
10125
10126         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
10127         modifiers that were specified instead of the hardcoded value
10128         (FamAndAssem).  This was basically ignoring the static modifier,
10129         and others.  Fixes 32429.
10130
10131         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
10132         fixed a bug in the process (32476)
10133
10134         * expression.cs (ArrayAccess.EmitAssign): Patch from
10135         hwang_rob@yahoo.ca that fixes bug 31834.3
10136
10137 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
10138
10139         * driver.cs: Make the module extension .netmodule.
10140
10141 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
10142
10143         * driver.cs: Report an error if the resource file is not found
10144         instead of crashing.
10145
10146         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
10147         false, like Emit does.
10148
10149 2002-10-16  Nick Drochak  <ndrochak@gol.com>
10150
10151         * typemanager.cs: Remove unused private member.  Also reported mcs
10152         bug to report this as a warning like csc.
10153
10154 2002-10-15  Martin Baulig  <martin@gnome.org>
10155
10156         * statement.cs (Statement.Emit): Made this a virtual method; emits
10157         the line number info and calls DoEmit().
10158         (Statement.DoEmit): New protected abstract method, formerly knows
10159         as Statement.Emit().
10160
10161         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
10162
10163 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
10164
10165         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
10166         have fixed a remaining problem: not every AddXXXX was adding a
10167         fully qualified name.  
10168
10169         Now everyone registers a fully qualified name in the DeclSpace as
10170         being defined instead of the partial name.  
10171
10172         Downsides: we are slower than we need to be due to the excess
10173         copies and the names being registered this way.  
10174
10175         The reason for this is that we currently depend (on the corlib
10176         bootstrap for instance) that types are fully qualified, because
10177         we dump all the types in the namespace, and we should really have
10178         types inserted into the proper namespace, so we can only store the
10179         basenames in the defined_names array.
10180
10181 2002-10-10  Martin Baulig  <martin@gnome.org>
10182
10183         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
10184         from bug #31834, see the bug report for a testcase which is
10185         miscompiled.
10186
10187 2002-10-10  Martin Baulig  <martin@gnome.org>
10188
10189         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
10190         flow analysis code for this.
10191
10192         * statement.cs (Do, While, For): Tell the flow analysis code about
10193         infinite loops.
10194         (FlowBranching.UsageVector): Added support for infinite loops.
10195         (Block.Resolve): Moved the dead code elimination here and use flow
10196         analysis to do it.
10197
10198 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
10199
10200         * class.cs (Field.Define): Catch cycles on struct type
10201         definitions. 
10202
10203         * typemanager.cs (IsUnmanagedtype): Do not recursively check
10204         fields if the fields are static.  We only need to check instance
10205         fields. 
10206
10207         * expression.cs (As.DoResolve): Test for reference type.
10208
10209         * statement.cs (Using.ResolveExpression): Use
10210         ConvertImplicitRequired, not ConvertImplicit which reports an
10211         error on failture
10212         (Using.ResolveLocalVariableDecls): ditto.
10213
10214         * expression.cs (Binary.ResolveOperator): Report errors in a few
10215         places where we had to.
10216
10217         * typemanager.cs (IsUnmanagedtype): Finish implementation.
10218
10219 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
10220
10221         * expression.cs: Use StoreFromPtr instead of extracting the type
10222         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
10223
10224         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
10225         an enumeration value to a System.Enum, but System.Enum is not a
10226         value type, but an class type, so we need to box.
10227
10228         (Expression.ConvertExplicit): One codepath could return
10229         errors but not flag them.  Fix this.  Fixes #31853
10230
10231         * parameter.cs (Resolve): Do not allow void as a parameter type.
10232
10233 2002-10-06  Martin Baulig  <martin@gnome.org>
10234
10235         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
10236         if it's a class type and not a struct.  Fixes #31815.
10237
10238 2002-10-06  Martin Baulig  <martin@gnome.org>
10239
10240         * statement.cs: Reworked the flow analysis code a bit to make it
10241         usable for dead code elimination.
10242
10243 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10244
10245         * cs-parser.jay: allow empty source files. Fixes bug #31781.
10246
10247 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
10248
10249         * expression.cs (ComposedCast.DoResolveType): A quick workaround
10250         to fix the test 165, will investigate deeper.
10251
10252 2002-10-04  Martin Baulig  <martin@gnome.org>
10253
10254         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
10255         finally blocks actually work.
10256         (Try.Resolve): We don't need to create a sibling for `finally' if
10257         there is no finally block.
10258
10259 2002-10-04  Martin Baulig  <martin@gnome.org>
10260
10261         * class.cs (Constructor.Define): The default accessibility for a
10262         non-default constructor is private, not public.
10263
10264 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
10265
10266         * class.cs (Constructor): Make AllowedModifiers public, add
10267         EXTERN.
10268
10269         * cs-parser.jay: Perform the modifiers test here, as the
10270         constructor for the Constructor class usually receives a zero
10271         because of the way we create it (first we create, later we
10272         customize, and we were never checking the modifiers).
10273
10274         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
10275         is a version of LookupTypeReflection that includes the type-name
10276         cache.  This can be used as a fast path for functions that know
10277         the fully qualified name and are only calling into *.GetType() to
10278         obtain a composed type.
10279
10280         This is also used by TypeManager.LookupType during its type
10281         composition.
10282
10283         (LookupType): We now also track the real type name, as sometimes
10284         we can get a quey for the real type name from things like
10285         ComposedCast.  This fixes bug 31422.
10286
10287         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
10288         complete type fullname, it does not have to go through the type
10289         resolution system to obtain the composed version of the type (for
10290         obtaining arrays or pointers).
10291
10292         (Conditional.Emit): Use the EmitBoolExpression to
10293         generate nicer code, as requested by Paolo.
10294
10295         (ArrayCreation.CheckIndices): Use the patch from
10296         hwang_rob@yahoo.ca to validate the array initializers. 
10297
10298 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
10299
10300         * class.cs (ConstructorInitializer.Emit): simplify code by using
10301         Invocation.EmitCall, and at the same time, fix the bugs in calling
10302         parent constructors that took variable arguments. 
10303
10304         * ecore.cs (Expression.ConvertNumericExplicit,
10305         Expression.ImplicitNumericConversion): Remove the code that
10306         manually wrapped decimal (InternalTypeConstructor call is now gone
10307         as well).
10308
10309         * expression.cs (Cast.TryReduce): Also handle decimal types when
10310         trying to perform a constant fold on the type.
10311
10312         * typemanager.cs (IsUnmanagedtype): Partially implemented.
10313
10314         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
10315         that only turned off an error report, and did nothing else. 
10316
10317 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
10318
10319         * driver.cs: Handle and ignore /fullpaths
10320
10321 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
10322
10323         * expression.cs (Binary.ResolveOperator): Catch the case where
10324         DoNumericPromotions returns true, 
10325
10326         (Binary.DoNumericPromotions): Simplify the code, and the tests.
10327
10328 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
10329
10330         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
10331         report error 70.
10332
10333 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
10334
10335         * ecore.cs (ConvertNumericExplicit): It is not enough that the
10336         conversion exists, but it is also required that the conversion be
10337         performed.  This manifested in "(Type64Enum) 2".  
10338
10339         * class.cs (TypeManager.AddMethod): The fix is not to change
10340         AddEnum, because that one was using a fully qualified name (every
10341         DeclSpace derivative does), but to change the AddMethod routine
10342         that was using an un-namespaced name.  This now correctly reports
10343         the duplicated name.
10344
10345         Revert patch until I can properly fix it.  The issue
10346         is that we have a shared Type space across all namespaces
10347         currently, which is wrong.
10348
10349         Options include making the Namespace a DeclSpace, and merge
10350         current_namespace/current_container in the parser.
10351
10352 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
10353
10354         * cs-parser.jay: Improve error reporting when we get a different
10355         kind of expression in local_variable_type and
10356         local_variable_pointer_type. 
10357
10358         Propagate this to avoid missleading errors being reported.
10359
10360         * ecore.cs (ImplicitReferenceConversion): treat
10361         TypeManager.value_type as a target just like object_type.   As
10362         code like this:
10363
10364         ValueType v = 1;
10365
10366         Is valid, and needs to result in the int 1 being boxed before it
10367         is assigned to the value type v.
10368
10369         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
10370         to validate the enumeration name.
10371
10372         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
10373         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
10374         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
10375
10376         * ecore.cs (TryImplicitIntConversion): When doing an
10377         implicit-enumeration-conversion, check if the type is 64-bits and
10378         perform a conversion before passing to EnumConstant.
10379
10380 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
10381
10382         * decl.cs (Error_AmbiguousTypeReference); New routine used to
10383         report ambiguous type references.  Unlike the MS version, we
10384         report what the ambiguity is.   Innovation at work ;-)
10385
10386         (DeclSpace.FindType): Require a location argument to
10387         display when we display an ambiguous error.
10388
10389         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
10390
10391         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
10392
10393         * expression.cs (EmitDynamicInitializers): Apply patch from
10394         hwang_rob@yahoo.ca that fixes the order in which we emit our
10395         initializers. 
10396
10397 2002-09-21  Martin Baulig  <martin@gnome.org>
10398
10399         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
10400         delegate takes no arguments.
10401
10402 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
10403
10404         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
10405         from integers.
10406
10407         * expression.cs: Extract the underlying type.
10408
10409         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
10410
10411         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
10412
10413 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
10414
10415         * class.cs (TypeContainer.DefineType): We can not use the nice
10416         PackingSize with the size set to 1 DefineType method, because it
10417         will not allow us to define the interfaces that the struct
10418         implements.
10419
10420         This completes the fixing of bug 27287
10421
10422         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
10423         means also structs.  This fixes part of the problem. 
10424         (Expresion.ImplicitReferenceConversionExists): ditto.
10425
10426         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
10427         error if there were no errors reported during the type lookup
10428         process, to avoid duplicates or redundant errors.  Without this
10429         you would get an ambiguous errors plus a type not found.  We have
10430         beaten the user enough with the first error.  
10431
10432         (DeclSparce.FindType): Emit a warning if we have an ambiguous
10433         reference. 
10434
10435         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
10436         during the resolution process, stop the lookup, this avoids
10437         repeated error reports (same error twice).
10438
10439         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
10440
10441         * typemanager.cs (LookupType): Redo the type lookup code to match
10442         the needs of System.Reflection.  
10443
10444         The issue is that System.Reflection requires references to nested
10445         types to begin with a "+" sign instead of a dot.  So toplevel
10446         types look like: "NameSpace.TopLevelClass", and nested ones look
10447         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
10448         levels. 
10449
10450 2002-09-19  Martin Baulig  <martin@gnome.org>
10451
10452         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
10453         says that a method always returns or always throws an exception,
10454         don't report the CS0161.
10455
10456         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
10457         set `Returns = new_returns'.
10458
10459 2002-09-19  Martin Baulig  <martin@gnome.org>
10460
10461         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
10462         to an enum constant, check for a CS0176.
10463
10464 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
10465
10466         * class.cs (TypeContainer.CheckPairedOperators): Now we check
10467         for operators that must be in pairs and report errors.
10468
10469         * ecore.cs (SimpleName.DoResolveType): During the initial type
10470         resolution process, when we define types recursively, we must
10471         check first for types in our current scope before we perform
10472         lookups in the enclosing scopes.
10473
10474         * expression.cs (MakeByteBlob): Handle Decimal blobs.
10475
10476         (Invocation.VerifyArgumentsCompat): Call
10477         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
10478         I thought we were supposed to always call this, but there are a
10479         few places in the code where we dont do it.
10480
10481 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
10482
10483         * driver.cs: Add support in -linkres and -resource to specify the
10484         name of the identifier.
10485
10486 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
10487
10488         * ecore.cs (StandardConversionExists): Sync with the conversion
10489         code: allow anything-* to void* conversions.
10490
10491         (FindMostSpecificSource): Use an Expression argument
10492         instead of a Type, because we might be handed over a Literal which
10493         gets a few more implicit conversions that plain types do not.  So
10494         this information was being lost.
10495
10496         Also, we drop the temporary type-holder expression when not
10497         required.
10498
10499 2002-09-17  Martin Baulig  <martin@gnome.org>
10500
10501         * class.cs (PropertyBase.CheckBase): Don't check the base class if
10502         this is an explicit interface implementation.
10503
10504 2002-09-17  Martin Baulig  <martin@gnome.org>
10505
10506         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
10507         different `IndexerName' attributes.
10508
10509         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
10510         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
10511         virtual CommonResolve().
10512
10513 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
10514
10515         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
10516         and convert that to the UnderlyingType.
10517
10518         * statement.cs (Foreach.Resolve): Indexers are just like variables
10519         or PropertyAccesses.
10520
10521         * cs-tokenizer.cs (consume_string): Track line numbers and columns
10522         inside quoted strings, we were not doing this before.
10523
10524 2002-09-16  Martin Baulig  <martin@gnome.org>
10525
10526         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
10527         resolve it.  This is needed for the definite assignment check of the
10528         instance expression, fixes bug #29846.
10529         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
10530
10531 2002-09-16  Nick Drochak  <ndrochak@gol.com>
10532
10533         * parameter.cs: Fix compile error.  Cannot reference static member
10534         from an instance object.  Is this an mcs bug?
10535
10536 2002-09-14  Martin Baulig  <martin@gnome.org>
10537
10538         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
10539         multiple times.  Fixes bug #30295, added test-166.cs.
10540
10541 2002-09-14  Martin Baulig  <martin@gnome.org>
10542
10543         * statement.cs (Block.Emit): Don't emit unreachable code.
10544         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
10545         `break' statements.
10546         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
10547
10548 2002-09-14  Martin Baulig  <martin@gnome.org>
10549
10550         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
10551         is set.
10552
10553 2002-09-14  Martin Baulig  <martin@gnome.org>
10554
10555         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
10556         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
10557         be false on the ms runtime.
10558
10559 2002-09-13  Martin Baulig  <martin@gnome.org>
10560
10561         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
10562         the CS0038 error message.
10563
10564 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
10565
10566         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
10567         constant inside, return it.
10568
10569 2002-09-12  Martin Baulig  <martin@gnome.org>
10570
10571         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
10572         implicit conversion can be done between enum types.
10573
10574         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
10575         check whether an implicit conversion to the current enum's UnderlyingType
10576         exists and report an error if not.
10577
10578         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
10579         without debugging support.
10580
10581         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
10582         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
10583
10584 2002-09-12  Martin Baulig  <martin@gnome.org>
10585
10586         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
10587
10588         * ecore.cs (IMemberExpr.DeclaringType): New property.
10589         (SimpleName.SimpleNameResolve): Check whether we're accessing a
10590         nonstatic member of an outer type (CS0038).
10591
10592 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
10593
10594         * driver.cs: Activate the using-error detector at warning level
10595         4 (at least for MS-compatible APIs).
10596
10597         * namespace.cs (VerifyUsing): Small buglett fix.
10598
10599         * pending.cs (PendingImplementation): pass the container pointer. 
10600
10601         * interface.cs (GetMethods): Allow for recursive definition.  Long
10602         term, I would like to move every type to support recursive
10603         definitions, not the current ordering mechanism that we have right
10604         now.
10605
10606         The situation is this: Attributes are handled before interfaces,
10607         so we can apply attributes to interfaces.  But some attributes
10608         implement interfaces, we will now handle the simple cases
10609         (recursive definitions will just get an error).  
10610
10611         * parameter.cs: Only invalidate types at the end if we fail to
10612         lookup all types.  
10613
10614 2002-09-09  Martin Baulig  <martin@gnome.org>
10615
10616         * ecore.cs (PropertyExpr.Emit): Also check for
10617         TypeManager.system_int_array_get_length so this'll also work when
10618         compiling corlib.  Fixes #30003.
10619
10620 2002-09-09  Martin Baulig  <martin@gnome.org>
10621
10622         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
10623         and throw an exception if we can't get the type's size.  Fixed #30040,
10624         added test-165.cs.
10625
10626 2002-09-09  Martin Baulig  <martin@gnome.org>
10627
10628         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
10629
10630         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
10631         context.  Fixes bug #30027.
10632
10633         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
10634         virtual functions.  Fixes bug #30043, added test-164.cs.
10635
10636 2002-09-08  Ravi Pratap  <ravi@ximian.com>
10637
10638         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
10639
10640 2002-09-08  Nick Drochak  <ndrochak@gol.com>
10641
10642         * driver.cs: Use an object to get the windows codepage since it's not a
10643         static property.
10644
10645 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
10646
10647         * statement.cs (For.Emit): for infinite loops (test == null)
10648         return whether there is a break inside, not always "true".
10649
10650         * namespace.cs (UsingEntry): New struct to hold the name of the
10651         using definition, the location where it is defined, and whether it
10652         has been used in a successful type lookup.
10653
10654         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
10655         strings.
10656
10657         * decl.cs: ditto.
10658
10659 2002-09-06  Ravi Pratap  <ravi@ximian.com>
10660
10661         * attribute.cs : Fix incorrect code which relied on catching
10662         a NullReferenceException to detect a null being passed in
10663         where an object was expected.
10664
10665 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
10666
10667         * statement.cs (Try): flag the catch variable as assigned
10668
10669         * expression.cs (Cast): Simplified by using ResolveType instead of
10670         manually resolving.
10671
10672         * statement.cs (Catch): Fix bug by using ResolveType.
10673
10674 2002-09-06  Ravi Pratap  <ravi@ximian.com>
10675
10676         * expression.cs (BetterConversion): Special case for when we have
10677         a NullLiteral as the argument and we have to choose between string
10678         and object types - we choose string the way csc does.
10679
10680         * attribute.cs (Attribute.Resolve): Catch the
10681         NullReferenceException and report error #182 since the Mono
10682         runtime no more has the bug and having this exception raised means
10683         we tried to select a constructor which takes an object and is
10684         passed a null.
10685
10686 2002-09-05  Ravi Pratap  <ravi@ximian.com>
10687
10688         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
10689         message (1502, 1503) when we can't locate a method after overload
10690         resolution. This is much more informative and closes the bug
10691         Miguel reported.
10692
10693         * interface.cs (PopulateMethod): Return if there are no argument
10694         types. Fixes a NullReferenceException bug.
10695
10696         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
10697         expressions too. Previously we were checking only in one place for
10698         positional arguments leaving out named arguments.
10699
10700         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
10701         type to the enum type is not allowed. Remove code corresponding to
10702         that.
10703
10704         (ConvertNumericExplicit): Allow explicit conversions from
10705         the underlying type to enum type. This precisely follows the spec
10706         and closes a bug filed by Gonzalo.
10707
10708 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10709
10710         * compiler.csproj:
10711         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
10712
10713 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
10714
10715         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
10716         it was important that we stored the right value after the
10717         reduction in `converted'.
10718
10719 2002-09-04  Martin Baulig  <martin@gnome.org>
10720
10721         * location.cs (Location.SymbolDocument): Use full pathnames for the
10722         source files.
10723
10724 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
10725
10726         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
10727         of the expression resolve mechanism, because that will catch the
10728         SimpleName error failures.
10729
10730         (Conditional): If we can not resolve the
10731         expression, return, do not crash.
10732
10733 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10734
10735         * cs-tokenizer.cs:
10736         (location): display token name instead of its number.
10737
10738 2002-08-28  Martin Baulig  <martin@gnome.org>
10739
10740         * expression.cs (Binary.ResolveOperator): Don't silently return
10741         but return an error if an operator cannot be applied between two
10742         enum types.
10743
10744 2002-08-28  Martin Baulig  <martin@gnome.org>
10745
10746         * class.cs (Constructor.Define): Set the permission attributes
10747         correctly instead of making all constructors public.
10748
10749 2002-08-28  Martin Baulig  <martin@gnome.org>
10750
10751         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
10752         for private members before reporting a CS0103; if we find anything,
10753         it's a CS0122.
10754
10755 2002-08-28  Martin Baulig  <martin@gnome.org>
10756
10757         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
10758         to check whether `closure_start_type == closure_invocation_type',
10759         we also need to check whether `m.DeclaringType == closure_invocation_type'
10760         before bypassing the permission checks.  We might be accessing
10761         protected/private members from the base class.
10762         (TypeManager.RealMemberLookup): Only set private_ok if private
10763         members were requested via BindingFlags.NonPublic.
10764
10765         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
10766
10767         * expression.cs (MemberAccess.ResolveMemberAccess): Set
10768         MethodGroupExpr.IsExplicitImpl if appropriate.
10769         (Invocation.DoResolve): Don't report the CS0120 for explicit
10770         interface implementations.
10771
10772 2002-08-27  Martin Baulig  <martin@gnome.org>
10773
10774         * expression.cs (Invocation.DoResolve): If this is a static
10775         method and we don't have an InstanceExpression, we must report
10776         a CS0120.
10777
10778 2002-08-25  Martin Baulig  <martin@gnome.org>
10779
10780         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
10781         `==' between a valuetype and an object.
10782
10783 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
10784
10785         * ecore.cs (TypeExpr): Provide a ToString method.
10786
10787 2002-08-24  Martin Baulig  <martin@gnome.org>
10788
10789         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
10790         now called proggie.dbg and it's a binary file.
10791
10792 2002-08-23  Martin Baulig  <martin@gnome.org>
10793
10794         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
10795
10796 2002-08-23  Martin Baulig  <martin@gnome.org>
10797
10798         * struct.cs (MyStructInfo.ctor): Make this work with empty
10799         structs; it's not allowed to use foreach() on null.
10800
10801 2002-08-23  Martin Baulig  <martin@gnome.org>
10802
10803         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
10804         writer the full pathname of the generated assembly.
10805
10806 2002-08-23  Martin Baulig  <martin@gnome.org>
10807
10808         * statements.cs (FlowBranching.UsageVector.MergeChildren):
10809         A `finally' block never returns or breaks; improved handling of
10810         unreachable code.
10811
10812 2002-08-23  Martin Baulig  <martin@gnome.org>
10813
10814         * statement.cs (Throw.Resolve): Allow `throw null'.
10815
10816 2002-08-23  Martin Baulig  <martin@gnome.org>
10817
10818         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
10819         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
10820         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
10821         MemberLookup would return a wrong event if this is an explicit
10822         interface implementation and the class has an event with the same
10823         name.
10824
10825 2002-08-23  Martin Baulig  <martin@gnome.org>
10826
10827         * statement.cs (Block.AddChildVariableNames): New public method.
10828         (Block.AddChildVariableName): Likewise.
10829         (Block.IsVariableNameUsedInChildBlock): Likewise.
10830         (Block.AddVariable): Check whether a variable name has already
10831         been used in a child block.
10832
10833         * cs-parser.jay (declare_local_variables): Mark all variable names
10834         from the current block as being used in a child block in the
10835         implicit block.
10836
10837 2002-08-23  Martin Baulig  <martin@gnome.org>
10838
10839         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
10840         find the symbol writer.
10841
10842         * driver.cs: csc also allows the arguments to /define being
10843         separated by commas, not only by semicolons.
10844
10845 2002-08-23  Martin Baulig  <martin@gnome.org>
10846
10847         * interface.cs (Interface.GetMembers): Added static check for events.
10848
10849 2002-08-15  Martin Baulig  <martin@gnome.org>
10850
10851         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
10852         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
10853
10854         * ecore.cs (Expression.MemberLookup): Added documentation and explained
10855         why the MethodData.EmitDestructor() change was necessary.
10856
10857 2002-08-20  Martin Baulig  <martin@gnome.org>
10858
10859         * class.cs (TypeContainer.FindMembers): Added static check for events.
10860
10861         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
10862
10863         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
10864         use Type.GetEvents(), not Type.FindMembers().
10865
10866 2002-08-20  Martin Baulig  <martin@gnome.org>
10867
10868         * decl.cs (MemberCache): Added a special method cache which will
10869         be used for method-only searched.  This ensures that a method
10870         search will return a MethodInfo with the correct ReflectedType for
10871         inherited methods.      
10872
10873 2002-08-20  Martin Baulig  <martin@gnome.org>
10874
10875         * decl.cs (DeclSpace.FindMembers): Made this public.
10876
10877 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10878
10879         * delegate.cs: fixed build on windows.
10880         [FIXME:  Filed as bug #29150: MCS must report these errors.]
10881
10882 2002-08-19  Ravi Pratap  <ravi@ximian.com>
10883
10884         * ecore.cs (StandardConversionExists): Return a false
10885         if we are trying to convert the void type to anything else
10886         since that is not allowed.
10887
10888         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
10889         we flag error 70 in the event an event is trying to be accessed
10890         directly from outside the declaring type.
10891
10892 2002-08-20  Martin Baulig  <martin@gnome.org>
10893
10894         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
10895         MemberCache from typemanager.cs to decl.cs.
10896
10897 2002-08-19  Martin Baulig  <martin@gnome.org>
10898
10899         * class.cs (TypeContainer): Implement IMemberContainer.
10900         (TypeContainer.DefineMembers): Create the MemberCache.
10901         (TypeContainer.FindMembers): Do better BindingFlags checking; only
10902         return public members if BindingFlags.Public was given, check
10903         whether members are static.
10904
10905 2002-08-16  Martin Baulig  <martin@gnome.org>
10906
10907         * decl.cs (DeclSpace.Define): Splitted this in Define and
10908         DefineMembers.  DefineMembers is called first and initializes the
10909         MemberCache.
10910
10911         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
10912         DefineMembers() on all our DeclSpaces.
10913
10914         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
10915         but call DefineMembers() on all nested interfaces.  We call their
10916         Define() in our new Define() function.
10917
10918         * interface.cs (Interface): Implement IMemberContainer.
10919         (Interface.Define): Moved all code except the attribute stuf to
10920         DefineMembers().
10921         (Interface.DefineMembers): Initialize the member cache.
10922
10923         * typemanager.cs (IMemberFinder): Removed this interface, we don't
10924         need this anymore since we can use MemberCache.FindMembers directly.
10925
10926 2002-08-19  Martin Baulig  <martin@gnome.org>
10927
10928         * typemanager.cs (MemberCache): When creating the cache for an
10929         interface type, add all inherited members.
10930         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
10931         to `out bool used_cache' and documented it.
10932         (TypeManager.MemberLookup): If we already used the cache in the first
10933         iteration, we don't need to do the interfaces check.
10934
10935 2002-08-19  Martin Baulig  <martin@gnome.org>
10936
10937         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
10938         here from IMemberFinder and don't implement this interface anymore.
10939         (DeclSpace.MemberCache): Moved here from IMemberFinder.
10940
10941         * typemanager.cs (IMemberFinder): This interface is now only used by
10942         classes which actually support the member cache.
10943         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
10944         since we only put DeclSpaces into this Hashtable.
10945         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
10946         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
10947
10948 2002-08-16  Martin Baulig  <martin@gnome.org>
10949
10950         * typemanager.cs (ICachingMemberFinder): Removed.
10951         (IMemberFinder.MemberCache): New property.
10952         (TypeManager.FindMembers): Merged this with RealFindMembers().
10953         This function will never be called from TypeManager.MemberLookup()
10954         so we can't use the cache here, just the IMemberFinder.
10955         (TypeManager.MemberLookup_FindMembers): Check whether the
10956         IMemberFinder has a MemberCache and call the cache's FindMembers
10957         function.
10958         (MemberCache): Rewrote larger parts of this yet another time and
10959         cleaned it up a bit.
10960
10961 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
10962
10963         * driver.cs (LoadArgs): Support quoting.
10964
10965         (Usage): Show the CSC-like command line arguments.
10966
10967         Improved a few error messages.
10968
10969 2002-08-15  Martin Baulig  <martin@gnome.org>
10970
10971         * typemanager.cs (IMemberContainer.Type): New property.
10972         (IMemberContainer.IsInterface): New property.
10973
10974         The following changes are conditional to BROKEN_RUNTIME, which is
10975         defined at the top of the file.
10976
10977         * typemanager.cs (MemberCache.MemberCache): Don't add the base
10978         class'es members, but add all members from TypeHandle.ObjectType
10979         if we're an interface.
10980         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
10981         is the current type.
10982         (MemberCache.CacheEntry.Container): Removed this field.
10983         (TypeHandle.GetMembers): Include inherited members.
10984
10985 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10986
10987         * typemanager.cs: fixed compilation and added a comment on a field that
10988         is never used.
10989
10990 2002-08-15  Martin Baulig  <martin@gnome.org>
10991
10992         * class.cs (ConstructorInitializer.Resolve): In the
10993         Expression.MemberLookup call, use the queried_type as
10994         invocation_type.
10995
10996         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
10997         declared' attribute, it's always true.
10998         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
10999         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
11000         temporary wrapper for FindMembers which tells MemberLookup whether
11001         members from the base classes are included in the return value.
11002         This will go away soon.
11003         (TypeManager.MemberLookup): Use this temporary hack here; once the
11004         new MemberCache is completed, we don't need to do the DeclaredOnly
11005         looping here anymore since the MemberCache will take care of this.
11006         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
11007         (MemberCache): When creating the MemberCache for a class, get
11008         members from the current class and all its base classes.
11009         (MemberCache.CacheEntry.Container): New field.  This is a
11010         temporary hack until the Mono runtime is fixed to distinguish
11011         between ReflectedType and DeclaringType.  It allows us to use MCS
11012         with both the MS runtime and the unfixed Mono runtime without
11013         problems and without accecting performance.
11014         (MemberCache.SearchMembers): The DeclaredOnly looping from
11015         TypeManager.MemberLookup is now done here.      
11016
11017 2002-08-14  Martin Baulig  <martin@gnome.org>
11018
11019         * statement.cs (MyStructInfo.MyStructInfo): Don't call
11020         Type.GetFields on dynamic types but get the fields from the
11021         corresponding TypeContainer.
11022         (MyStructInfo.GetStructInfo): Added check for enum types.
11023
11024         * typemanager.cs (MemberList.IsSynchronized): Implemented.
11025         (MemberList.SyncRoot): Implemented.
11026         (TypeManager.FilterWithClosure): No need to check permissions if
11027         closure_start_type == closure_invocation_type, don't crash if
11028         closure_invocation_type is null.
11029
11030 2002-08-13  Martin Baulig  <martin@gnome.org>
11031
11032         Rewrote TypeContainer.FindMembers to use a member cache.  This
11033         gives us a speed increase of about 35% for the self-hosting MCS
11034         build and of about 15-20% for the class libs (both on GNU/Linux).
11035
11036         * report.cs (Timer): New class to get enhanced profiling.  This
11037         whole class is "TIMER" conditional since it remarkably slows down
11038         compilation speed.
11039
11040         * class.cs (MemberList): New class.  This is an IList wrapper
11041         which we're now using instead of passing MemberInfo[]'s around to
11042         avoid copying this array unnecessarily.
11043         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
11044         (ICachingMemberFinder, IMemberContainer): New interface.
11045         (TypeManager.FilterWithClosure): If `criteria' is null, the name
11046         has already been checked, otherwise use it for the name comparision.
11047         (TypeManager.FindMembers): Renamed to RealMemberFinder and
11048         provided wrapper which tries to use ICachingMemberFinder.FindMembers
11049         if possible.  Returns a MemberList, not a MemberInfo [].
11050         (TypeHandle): New class, implements IMemberContainer.  We create
11051         one instance of this class per type, it contains a MemberCache
11052         which is used to do the member lookups.
11053         (MemberCache): New class.  Each instance of this class contains
11054         all members of a type and a name-based hash table.
11055         (MemberCache.FindMembers): This is our new member lookup
11056         function.  First, it looks up all members of the requested name in
11057         the hash table.  Then, it walks this list and sorts out all
11058         applicable members and returns them.
11059
11060 2002-08-13  Martin Baulig  <martin@gnome.org>
11061
11062         In addition to a nice code cleanup, this gives us a performance
11063         increase of about 1.4% on GNU/Linux - not much, but it's already
11064         half a second for the self-hosting MCS compilation.
11065
11066         * typemanager.cs (IMemberFinder): New interface.  It is used by
11067         TypeManager.FindMembers to call FindMembers on a TypeContainer,
11068         Enum, Delegate or Interface.
11069         (TypeManager.finder_to_member_finder): New PtrHashtable.
11070         (TypeManager.finder_to_container): Removed.
11071         (TypeManager.finder_to_delegate): Removed.
11072         (TypeManager.finder_to_interface): Removed.
11073         (TypeManager.finder_to_enum): Removed.
11074
11075         * interface.cs (Interface): Implement IMemberFinder.
11076
11077         * delegate.cs (Delegate): Implement IMemberFinder.
11078
11079         * enum.cs (Enum): Implement IMemberFinder.
11080
11081         * class.cs (TypeContainer): Implement IMemberFinder.
11082
11083 2002-08-12  Martin Baulig  <martin@gnome.org>
11084
11085         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
11086
11087 2002-08-12  Martin Baulig  <martin@gnome.org>
11088
11089         * ecore.cs (ITypeExpression): New interface for expressions which
11090         resolve to a type.
11091         (TypeExpression): Renamed to TypeLookupExpression.
11092         (Expression.DoResolve): If we're doing a types-only lookup, the
11093         expression must implement the ITypeExpression interface and we
11094         call DoResolveType() on it.
11095         (SimpleName): Implement the new ITypeExpression interface.
11096         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
11097         hack, the situation that we're only looking up types can't happen
11098         anymore when this method is called.  Moved the type lookup code to
11099         DoResolveType() and call it.
11100         (SimpleName.DoResolveType): This ITypeExpression interface method
11101         is now doing the types-only lookup.
11102         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
11103         (ResolveFlags): Added MaskExprClass.
11104
11105         * expression.cs (MemberAccess): Implement the ITypeExpression
11106         interface.
11107         (MemberAccess.DoResolve): Added support for a types-only lookup
11108         when we're called via ITypeExpression.DoResolveType().
11109         (ComposedCast): Implement the ITypeExpression interface.
11110
11111         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
11112         Expression.Resolve() with ResolveFlags.Type instead.
11113
11114 2002-08-12  Martin Baulig  <martin@gnome.org>
11115
11116         * interface.cs (Interface.Define): Apply attributes.
11117
11118         * attribute.cs (Attribute.ApplyAttributes): Added support for
11119         interface attributes.
11120
11121 2002-08-11  Martin Baulig  <martin@gnome.org>
11122
11123         * statement.cs (Block.Emit): Only check the "this" variable if we
11124         do not always throw an exception.
11125
11126         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
11127         whether the property has a set accessor.
11128
11129 2002-08-11  Martin Baulig  <martin@gnome.org>
11130
11131         Added control flow analysis support for structs.
11132
11133         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
11134         with control flow analysis turned off.
11135         (IVariable): New interface.
11136         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
11137         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
11138         (FieldExpr.DoResolve): Resolve the instance expression with flow
11139         analysis turned off and do the definite assignment check after the
11140         resolving when we know what the expression will resolve to.
11141
11142         * expression.cs (LocalVariableReference, ParameterReference):
11143         Implement the new IVariable interface, only call the flow analysis
11144         code if ec.DoFlowAnalysis is true.
11145         (This): Added constructor which takes a Block argument.  Implement
11146         the new IVariable interface.
11147         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
11148         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
11149         This does the definite assignment checks for struct members.
11150
11151         * class.cs (Constructor.Emit): If this is a non-static `struct'
11152         constructor which doesn't have any initializer, call
11153         Block.AddThisVariable() to tell the flow analysis code that all
11154         struct elements must be initialized before control returns from
11155         the constructor.
11156
11157         * statement.cs (MyStructInfo): New public class.
11158         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
11159         argument to this indexer.  If non-zero, check an individual struct
11160         member, not the whole struct.
11161         (FlowBranching.CheckOutParameters): Check struct members.
11162         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
11163         overloaded versions of these methods which take an additional
11164         `int field_idx' argument to check struct members.
11165         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
11166         overloaded versions of these methods which take an additional
11167         `string field_name' argument to check struct member.s
11168         (VariableInfo): Implement the IVariable interface.
11169         (VariableInfo.StructInfo): New public property.  Returns the
11170         MyStructInfo instance of the variable if it's a struct or null.
11171         (Block.AddThisVariable): New public method.  This is called from
11172         Constructor.Emit() for non-static `struct' constructor which do
11173         not have any initializer.  It creates a special variable for the
11174         "this" instance variable which will be checked by the flow
11175         analysis code to ensure that all of the struct's fields are
11176         initialized before control returns from the constructor.
11177         (UsageVector): Added support for struct members.  If a
11178         variable/parameter is a struct with N members, we reserve a slot
11179         in the usage vector for each member.  A struct is considered fully
11180         initialized if either the struct itself (slot 0) or all its
11181         members are initialized.
11182
11183 2002-08-08  Martin Baulig  <martin@gnome.org>
11184
11185         * driver.cs (Driver.MainDriver): Only report an error CS5001
11186         if there were no compilation errors.
11187
11188         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
11189         `UnsafeContext' property to determine whether the parent is in
11190         unsafe context rather than checking the parent's ModFlags:
11191         classes nested in an unsafe class are unsafe as well.
11192
11193 2002-08-08  Martin Baulig  <martin@gnome.org>
11194
11195         * statement.cs (UsageVector.MergeChildren): Distinguish between
11196         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
11197         we return.  Added test17() and test18() to test-154.cs.
11198
11199 2002-08-08  Martin Baulig  <martin@gnome.org>
11200
11201         * typemanager.cs (TypeManager.FilterWithClosure): If we have
11202         Family access, make sure the invoking type isn't a subclass of the
11203         queried type (that'd be a CS1540).
11204
11205         * ecore.cs (Expression.MemberLookup): Added overloaded version of
11206         this method which takes an additional `Type invocation_type'.
11207
11208         * expression.cs (BaseAccess.DoResolve): Use the base type as
11209         invocation and query type.
11210         (MemberAccess.DoResolve): If the lookup failed and we're about to
11211         report a CS0122, try a lookup with the ec.ContainerType - if this
11212         succeeds, we must report a CS1540.
11213
11214 2002-08-08  Martin Baulig  <martin@gnome.org>
11215
11216         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
11217         (MethodGroupExpr): Implement the IMemberExpr interface.
11218
11219         * expression (MemberAccess.ResolveMemberAccess): No need to have
11220         any special code for MethodGroupExprs anymore, they're now
11221         IMemberExprs.   
11222
11223 2002-08-08  Martin Baulig  <martin@gnome.org>
11224
11225         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
11226         Family, FamANDAssem and FamORAssem permissions.
11227         (TypeManager.IsSubclassOrNestedChildOf): New public method.
11228
11229 2002-08-08  Martin Baulig  <martin@gnome.org>
11230
11231         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
11232         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
11233         or loop block.
11234
11235 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
11236
11237         * driver.cs: implemented /resource option to embed managed resources.
11238
11239 2002-08-07  Martin Baulig  <martin@gnome.org>
11240
11241         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
11242         (FieldBase.HasFieldInitializer): New public property.
11243         (FieldBase.GetInitializerExpression): New public method.  Resolves and
11244         returns the field initializer and makes sure it is only resolved once.
11245         (TypeContainer.EmitFieldInitializers): Call
11246         FieldBase.GetInitializerExpression to get the initializer, this ensures
11247         that it isn't resolved multiple times.
11248
11249         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
11250         the resolving process (SimpleName/MemberLookup) that we're currently
11251         emitting a field initializer (which must not access any instance members,
11252         this is an error CS0236).
11253
11254         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
11255         argument, if the `IsFieldInitializer' flag is set, we must report and
11256         error CS0236 and not an error CS0120.   
11257
11258 2002-08-07  Martin Baulig  <martin@gnome.org>
11259
11260         * ecore.cs (IMemberExpr): New public interface.
11261         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
11262         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
11263         if the expression is an IMemberExpr.
11264
11265         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
11266         to be null, implicitly default to `this' if we're non-static in
11267         this case.  Simplified the code a lot by using the new IMemberExpr
11268         interface.  Also fixed bug #28176 here.
11269
11270 2002-08-06  Martin Baulig  <martin@gnome.org>
11271
11272         * cs-parser.jay (SimpleLookup): Removed.  We need to create
11273         ParameterReferences during semantic analysis so that we can do a
11274         type-only search when resolving Cast, TypeOf and SizeOf.
11275         (block): Pass the `current_local_parameters' to the Block's
11276         constructor.
11277
11278         * class.cs (ConstructorInitializer): Added `Parameters parameters'
11279         argument to the constructor.
11280         (ConstructorInitializer.Resolve): Create a temporary implicit
11281         block with the parameters.
11282
11283         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
11284         references here if we aren't doing a type-only search.
11285
11286         * statement.cs (Block): Added constructor which takes a
11287         `Parameters parameters' argument.
11288         (Block.Parameters): New public property.
11289
11290         * support.cs (InternalParameters.Parameters): Renamed `parameters'
11291         to `Parameters' and made it public readonly.
11292
11293 2002-08-06  Martin Baulig  <martin@gnome.org>
11294
11295         * ecore.cs (Expression.Warning): Made this public as well.
11296
11297         * report.cs (Report.Debug): Print the contents of collections.
11298
11299 2002-08-06  Martin Baulig  <martin@gnome.org>
11300
11301         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
11302         used to tell Resolve() which kinds of expressions it may return.
11303         (Expression.Resolve): Added overloaded version of this method which
11304         takes a `ResolveFlags flags' argument.  This can be used to tell
11305         Resolve() which kinds of expressions it may return.  Reports a
11306         CS0118 on error.
11307         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
11308         ResolveFlags.SimpleName.
11309         (Expression.Error118): Added overloaded version of this method which
11310         takes a `ResolveFlags flags' argument.  It uses the flags to determine
11311         which kinds of expressions are allowed.
11312
11313         * expression.cs (Argument.ResolveMethodGroup): New public method.
11314         Resolves an argument, but allows a MethodGroup to be returned.
11315         This is used when invoking a delegate.
11316
11317         * TODO: Updated a bit.
11318
11319 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11320
11321         Fixed compilation with csc.
11322
11323         * ecore.cs: Expression.Error made public. Is this correct? Should
11324         Warning be made public too?
11325
11326         * expression.cs: use ea.Location instead of ea.loc.
11327         [FIXME:  Filed as bug #28607: MCS must report these errors.]
11328
11329 2002-08-06  Martin Baulig  <martin@gnome.org>
11330
11331         * ecore.cs (Expression.loc): Moved the location here instead of
11332         duplicating it in all derived classes.
11333         (Expression.Location): New public property.
11334         (Expression.Error, Expression.Warning): Made them non-static and
11335         removed the location argument.
11336         (Expression.Warning): Added overloaded version which takes an
11337         `int level' argument.
11338         (Expression.Error118): Make this non-static and removed the
11339         expression and location arguments.
11340         (TypeExpr): Added location argument to the constructor.
11341
11342         * expression.cs (StaticCallExpr): Added location argument to
11343         the constructor.
11344         (Indirection, PointerArithmetic): Likewise.
11345         (CheckedExpr, UnCheckedExpr): Likewise.
11346         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
11347         (StringPtr): Likewise.
11348
11349
11350 2002-08-05  Martin Baulig  <martin@gnome.org>
11351
11352         * expression.cs (BaseAccess.DoResolve): Actually report errors.
11353
11354         * assign.cs (Assign.DoResolve): Check whether the source
11355         expression is a value or variable.
11356
11357         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
11358         while resolving the corresponding blocks.
11359
11360         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
11361         an error, don't silently return null.
11362
11363         * statement.cs (Block.AddVariable): Do the error reporting here
11364         and distinguish between CS0128 and CS0136.
11365         (Block.DoResolve): Report all unused labels (warning CS0164).
11366         (LabeledStatement): Pass the location to the constructor.
11367         (LabeledStatement.HasBeenReferenced): New property.
11368         (LabeledStatement.Resolve): Set it to true here.
11369
11370         * statement.cs (Return.Emit): Return success even after reporting
11371         a type mismatch error (CS0126 or CS0127), this is what csc does and
11372         it avoids confusing the users with any consecutive errors.
11373
11374 2002-08-05  Martin Baulig  <martin@gnome.org>
11375
11376         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
11377
11378         * const.cs (Const.LookupConstantValue): Catch circular definitions.
11379
11380         * expression.cs (MemberAccess.DoResolve): Silently return if an
11381         error has already been reported.
11382
11383         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
11384         error has already been reported.
11385
11386 2002-08-05  Martin Baulig  <martin@gnome.org>
11387
11388         * statement.cs (UsageVector): Only initialize the `parameters'
11389         vector if we actually have any "out" parameters.
11390
11391 2002-08-05  Martin Baulig  <martin@gnome.org>
11392
11393         * expression.cs (Binary.ResolveOperator): When combining delegates,
11394         they must have the same type.
11395
11396 2002-08-05  Martin Baulig  <martin@gnome.org>
11397
11398         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
11399         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
11400         work with the ms runtime and we also don't need it: if we're a
11401         PropertyBuilder and not in the `indexer_arguments' hash, then we
11402         are a property and not an indexer.
11403
11404         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
11405         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
11406         since the latter one doesn't work with the ms runtime.
11407
11408 2002-08-03  Martin Baulig  <martin@gnome.org>
11409
11410         Fixed bugs #27998 and #22735.
11411
11412         * class.cs (Method.IsOperator): New public field.
11413         (Method.CheckBase): Report CS0111 if there's already a method
11414         with the same parameters in the current class.  Report CS0508 when
11415         attempting to change the return type of an inherited method.
11416         (MethodData.Emit): Report CS0179 if a method doesn't have a body
11417         and it's not marked abstract or extern.
11418         (PropertyBase): New abstract base class for Property and Indexer.
11419         (PropertyBase.CheckBase): Moved here from Property and made it work
11420         for indexers.
11421         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
11422         the same so we can reuse it there.
11423         (Property, Indexer): Derive from PropertyBase.
11424         (MethodSignature.inheritable_property_signature_filter): New delegate
11425         to find properties and indexers.
11426
11427         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
11428         argument and improved error reporting.
11429
11430         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
11431         EmptyReadOnlyParameters and made it a property.
11432
11433         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
11434         version of this method which takes a `PropertyInfo indexer'.
11435         (TypeManager.RegisterIndexer): New method.
11436
11437         * class.cs: Added myself as author of this file :-)
11438
11439 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11440
11441         * class.cs: fixed compilation on windoze.
11442
11443 2002-08-03  Martin Baulig  <martin@gnome.org>
11444
11445         * interface.cs (Interface.GetInterfaceBases): Check whether all
11446         base interfaces are at least as accessible than the current one.
11447
11448         * class.cs (TypeContainer.GetClassBases): Check whether base types
11449         are at least as accessible than the current type.
11450         (TypeContainer.AsAccessible): Implemented and made non-static.
11451         (MemberBase.CheckParameters): Report errors if the accessibility
11452         checks fail.
11453
11454         * delegate.cs (Delegate.Delegate): The default visibility is
11455         internal for top-level types and private for nested types.
11456         (Delegate.Define): Report errors if the accessibility checks fail.
11457
11458         * enum.cs (Enum.Enum): The default visibility is internal for
11459         top-level types and private for nested types.
11460         (Enum.DefineType): Compute the correct visibility.
11461
11462         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
11463         function which takes a `bool is_toplevel' instead of a TypeContainer.
11464
11465         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
11466         builtin type.
11467
11468 2002-08-02  Martin Baulig  <martin@gnome.org>
11469
11470         * expression.cs (LocalVariableReferenc): Added constructor which
11471         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
11472         (LocalVariableReference.IsReadOnly): New property.
11473         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
11474         variable is readonly, use our own readonly flag to do this; you can
11475         use the new constructor to get a writable reference to a read-only
11476         variable.
11477
11478         * cs-parser.jay (foreach_statement, using_statement): Get a writable
11479         reference to the local variable.
11480
11481 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
11482
11483         * rootcontext.cs (ResolveCore): Also include System.Exception
11484
11485         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
11486         we reach an EmptyStatement.
11487
11488         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
11489         is also fine.
11490
11491         * expression.cs (Binary.ResolveOperator): Check error result in
11492         two places.
11493
11494         use brtrue/brfalse directly and avoid compares to null.
11495
11496 2002-08-02  Martin Baulig  <martin@gnome.org>
11497
11498         * class.cs (TypeContainer.Define): Define all nested interfaces here.
11499         Fixes bug #28407, added test-155.cs.
11500
11501 2002-08-01  Martin Baulig  <martin@gnome.org>
11502
11503         * class.cs (Event.EmitDefaultMethod): Make this work with static
11504         events.  Fixes #28311, added verify-3.cs.
11505
11506 2002-08-01  Martin Baulig  <martin@gnome.org>
11507
11508         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
11509         `is_disposable' fields.
11510         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
11511         `hm.is_disposable' if we're using the collection pattern.
11512         (Foreach.EmitCollectionForeach): Use the correct type for the
11513         enumerator's local variable, only emit the try/finally block if
11514         necessary (fixes #27713).
11515
11516 2002-08-01  Martin Baulig  <martin@gnome.org>
11517
11518         * ecore.cs (Expression.report118): Renamed to Error118 and made
11519         it public static.
11520
11521         * statement.cs (Throw.Resolve): Check whether the expression is of
11522         the correct type (CS0118) and whether the type derives from
11523         System.Exception (CS0155).
11524         (Catch.Resolve): New method.  Do the type lookup here and check
11525         whether it derives from System.Exception (CS0155).
11526         (Catch.CatchType, Catch.IsGeneral): New public properties.
11527
11528         * typemanager.cs (TypeManager.exception_type): Added.
11529
11530 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
11531
11532         * driver.cs: Updated About function.
11533
11534 2002-07-31  Martin Baulig  <martin@gnome.org>
11535
11536         Implemented Control Flow Analysis.
11537
11538         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
11539         (EmitContext.CurrentBranching): Added.
11540         (EmitContext.StartFlowBranching): Added.
11541         (EmitContext.EndFlowBranching): Added.
11542         (EmitContext.KillFlowBranching): Added.
11543         (EmitContext.IsVariableAssigned): Added.
11544         (EmitContext.SetVariableAssigned): Added.
11545         (EmitContext.IsParameterAssigned): Added.
11546         (EmitContext.SetParameterAssigned): Added.
11547         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
11548         Added control flow analysis stuff here.
11549
11550         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
11551         resolve the expression as lvalue.
11552         (LocalVariableReference.DoResolve): Check whether the variable has
11553         already been assigned.
11554         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
11555         the parameter as assigned here.
11556         (ParameterReference.DoResolve): Check whether the parameter has already
11557         been assigned.
11558         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
11559         expression as lvalue.
11560
11561         * statement.cs (FlowBranching): New class for the flow analysis code.
11562         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
11563         (LabeledStatement.IsDefined): New public property.
11564         (LabeledStatement.AddUsageVector): New public method to tell flow
11565         analyis that the label may be reached via a forward jump.
11566         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
11567         flow analysis.
11568         (VariableInfo.Number): New public field.  This is used by flow analysis
11569         to number all locals of a block.
11570         (Block.CountVariables): New public property.  This is the number of
11571         local variables in this block (including the locals from all parent
11572         blocks).
11573         (Block.EmitMeta): Number all the variables.
11574
11575         * statement.cs: Added flow analysis support to all classes.
11576
11577 2002-07-31  Martin Baulig  <martin@gnome.org>
11578
11579         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
11580         To get debugging messages, compile mcs with /define:MCS_DEBUG and
11581         then use this argument.
11582
11583         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
11584
11585         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
11586         use this to specify /define options.
11587
11588 2002-07-29  Martin Baulig  <martin@gnome.org>
11589
11590         * statement.cs (Fixed): Moved all code that does variable lookups
11591         and resolvings from Emit to Resolve.
11592
11593         * statement.cs (For): Moved all code that does variable lookups
11594         and resolvings from Emit to Resolve.
11595
11596         * statement.cs (Using): Moved all code that does variable lookups
11597         and resolvings from Emit to Resolve.
11598
11599 2002-07-29  Martin Baulig  <martin@gnome.org>
11600
11601         * attribute.cs (Attribute.Resolve): Explicitly catch a
11602         System.NullReferenceException when creating the
11603         CustromAttributeBuilder and report a different warning message.
11604
11605 2002-07-29  Martin Baulig  <martin@gnome.org>
11606
11607         * support.cs (ParameterData.ParameterName): Added method to
11608         get the name of a parameter.
11609
11610         * typemanager.cs (TypeManager.IsValueType): New public method.
11611
11612 2002-07-29  Martin Baulig  <martin@gnome.org>
11613
11614         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
11615         is a flag which specifies that it's either ref or out.
11616         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
11617         the out parameter to `out Parameter.Modifier mod', also set the
11618         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
11619
11620         * support.cs (InternalParameters.ParameterModifier): Distinguish
11621         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
11622         Parameter.Modifier.ISBYREF flag if it's either ref or out.
11623
11624         * expression.cs (Argument.GetParameterModifier): Distinguish
11625         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
11626         Parameter.Modifier.ISBYREF flag if it's either ref or out.
11627
11628 2002-07-29  Martin Baulig  <martin@gnome.org>
11629
11630         * expression.cs (ParameterReference.ParameterReference): Added
11631         `Location loc' argument to the constructor.
11632
11633         * cs-parser.jay: Pass location to ParameterReference.
11634
11635 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
11636
11637         * statement.cs (Try): Initialize the location.
11638
11639         * cs-parser.jay: pass location to Try.
11640
11641         * expression.cs (Unary.Reduce): Change the prototype to return
11642         whether a constant fold could be performed or not.  The result is
11643         returned in an out parameters.  In the case of Indirection and
11644         AddressOf, we want to perform the full tests.
11645
11646 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
11647
11648         * statement.cs (Statement.Emit): Flag dead code.
11649
11650 2002-07-27  Andrew Birkett  <andy@nobugs.org>
11651
11652         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
11653
11654 2002-07-27  Martin Baulig  <martin@gnome.org>
11655
11656         * class.cs (MethodData.Define): Put back call to
11657         TypeManager.AddMethod(), accidentally commented this out.
11658
11659         * report.cs (Debug): New public method to print debugging information,
11660         this is `[Conditional ("DEBUG")]'.
11661
11662 2002-07-26  Martin Baulig  <martin@gnome.org>
11663
11664         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
11665         (switch_statement): Push the current_block to the switch_stack and
11666         pop it again when we're done with the switch.
11667         (switch_section): The new block is a child of the current_block.
11668         Fixes bug #24007, added test-152.cs.
11669
11670 2002-07-27  Martin Baulig  <martin@gnome.org>
11671
11672         * expression.cs (Invocation.EmitArguments): When calling a varargs
11673         function with only its fixed arguments, we need to pass an empty
11674         array.
11675
11676 2002-07-27  Martin Baulig  <martin@gnome.org>
11677
11678         Mono 0.13 has been released.
11679
11680 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
11681
11682         * driver.cs: Rename --resource to --linkres, because that is what
11683         we do currently, we dont support --resource yet.
11684
11685         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
11686
11687 2002-07-25  Martin Baulig  <martin@gnome.org>
11688
11689         * class.cs (MethodData): New public class.  This is a `method builder'
11690         class for a method or one accessor of a Property/Indexer/Event.
11691         (MethodData.GetMethodFlags): Moved here from MemberBase.
11692         (MethodData.ApplyAttributes): Likewise.
11693         (MethodData.ApplyObsoleteAttribute): Likewise.
11694         (MethodData.ApplyConditionalAttribute): Likewise.
11695         (MethodData.ApplyDllImportAttribute): Likewise.
11696         (MethodData.CheckAbstractAndExternal): Likewise.
11697         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
11698         (MethodData.Emit): Formerly known as Method.Emit().
11699         (MemberBase): Moved everything which was specific to a single
11700         accessor/method to MethodData.
11701         (Method): Create a new MethodData and call Define() and Emit() on it.
11702         (Property, Indexer, Event): Create a new MethodData objects for each
11703         accessor and call Define() and Emit() on them.
11704
11705 2002-07-25  Martin Baulig  <martin@gnome.org>
11706
11707         Made MethodCore derive from MemberBase to reuse the code from there.
11708         MemberBase now also checks for attributes.
11709
11710         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
11711         (MemberBase.GetMethodFlags): Moved here from class Method and marked
11712         as virtual.
11713         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
11714         `CallingConventions cc' and `Attributes opt_attrs' arguments.
11715         (MemberBase.ApplyAttributes): New virtual method; applies the
11716         attributes to a method or accessor.
11717         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
11718         (MemberBase.ApplyConditionalAttribute): Likewise.
11719         (MemberBase.ApplyDllImportAttribute): Likewise.
11720         (MemberBase.CheckAbstractAndExternal): Likewise.
11721         (MethodCore.ParameterTypes): This is now a property instead of a
11722         method, it's initialized from DoDefineParameters().
11723         (MethodCore.ParameterInfo): Removed the set accessor.
11724         (MethodCore.DoDefineParameters): New protected virtual method to
11725         initialize ParameterTypes and ParameterInfo.
11726         (Method.GetReturnType): We can now simply return the MemberType.
11727         (Method.GetMethodFlags): Override the MemberBase version and add
11728         the conditional flags.
11729         (Method.CheckBase): Moved some code from Define() here, call
11730         DoDefineParameters() here.
11731         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
11732         here to avoid some larger code duplication.
11733         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
11734         ensure that abstract and external accessors don't declare a body.
11735
11736         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
11737         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
11738         lookup in the attribute's parent classes, so we need to abort as soon
11739         as we found the first match.
11740         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
11741         the attribute has no arguments.
11742
11743         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
11744         of a Method.
11745
11746 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11747
11748         * cs-parser.jay: reverted previous patch.
11749
11750 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11751
11752         * cs-parser.jay: fixed bug #22119.
11753
11754 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11755
11756         * attribute.cs: fixed compilation. The error was:
11757         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
11758         be assigned to before control leaves the current method."
11759         [FIXME:  Filed as bug #28186: MCS must report this error.]
11760
11761 2002-07-25  Martin Baulig  <martin@gnome.org>
11762
11763         * attribute.cs (Attribute.Conditional_GetConditionName): New static
11764         method to pull the condition name ouf of a Conditional attribute.
11765         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
11766         the obsolete message and error flag out of an Obsolete attribute.
11767
11768         * class.cs (Method.GetMethodFlags): New public method to get the
11769         TypeManager.MethodFlags for this method.
11770         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
11771         private methods.
11772         (Method.Define): Get and apply the Obsolete and Conditional attributes;
11773         if we're overriding a virtual function, set the new private variable
11774         `parent_method'; call the new TypeManager.AddMethod().
11775
11776         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
11777         the MethodBuilder and the Method in a PtrHashtable.
11778         (TypeManager.builder_to_method): Added for this purpose.
11779         (TypeManager.MethodFlags): Added IsObsoleteError.
11780         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
11781         Obsolete and Conditional arguments in MethodBuilders.  If we discover
11782         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
11783         the message from the attribute.
11784
11785 2002-07-24  Martin Baulig  <martin@gnome.org>
11786
11787         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
11788         preprocessor directives, ensure that the argument to #define/#undef is
11789         exactly one identifier and that it's actually an identifier.
11790
11791         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
11792         did not work ....
11793
11794 2002-07-24  Martin Baulig  <martin@gnome.org>
11795
11796         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
11797         initialize it to TypeManager.object_type in the constructor.
11798         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
11799         of the `hm.get_current' method if we're using the collection pattern.
11800         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
11801         for the explicit conversion to make it work when we're using the collection
11802         pattern and the `Current' property has a different return type than `object'.
11803         Fixes #27713.
11804
11805 2002-07-24  Martin Baulig  <martin@gnome.org>
11806
11807         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
11808         does not match, but don't report any errors.  This method is called in
11809         order for all methods in a MethodGroupExpr until a matching method is
11810         found, so we don't want to bail out if the first method doesn't match.
11811         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
11812         matches, report the 123.  Fixes #28070.
11813
11814 2002-07-24  Martin Baulig  <martin@gnome.org>
11815
11816         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
11817         TypeManager.TypeToCoreType() to the top of the method so the
11818         following equality checks will work.  Fixes #28107.
11819
11820 2002-07-24  Martin Baulig  <martin@gnome.org>
11821
11822         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
11823         operand is of type uint, and the other operand is of type sbyte,
11824         short or int, the operands are converted to type long." -
11825         Actually do what this comment already told us.  Fixes bug #28106,
11826         added test-150.cs.
11827
11828 2002-07-24  Martin Baulig  <martin@gnome.org>
11829
11830         * class.cs (MethodBase): New abstract class.  This is now a base
11831         class for Property, Indexer and Event to avoid some code duplication
11832         in their Define() and DefineMethods() methods.
11833         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
11834         generic methods for Define() and DefineMethods().
11835         (FieldBase): Derive from MemberBase, not MemberCore.
11836         (Property): Derive from MemberBase, not MemberCore.
11837         (Property.DefineMethod): Moved all the code from this method to the
11838         new MethodBase.DefineAccessor(), just call it with appropriate
11839         argumetnts.
11840         (Property.Define): Call the new Property.DoDefine(), this does some
11841         sanity checks and we don't need to duplicate the code everywhere.
11842         (Event): Derive from MemberBase, not MemberCore.
11843         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
11844         accessors, this will also make them work with interface events.
11845         (Indexer): Derive from MemberBase, not MemberCore.
11846         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
11847         (Indexer.Define): Use the new MethodBase functions.
11848
11849         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
11850         argument to the constructor.
11851         (Interface.FindMembers): Added support for interface events.
11852         (Interface.PopluateEvent): Implemented.
11853
11854         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
11855
11856 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
11857
11858         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
11859         but this is required to check for a method name being the same as
11860         the containing class.  
11861
11862         Handle this now.
11863
11864 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11865
11866         * interface.cs: initialize variable.
11867
11868 2002-07-23  Martin Baulig  <martin@gnome.org>
11869
11870         Implemented the IndexerName attribute in interfaces.
11871
11872         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
11873         name if this is an explicit interface implementation.
11874         (Indexer.InterfaceIndexerName): New public variable.  If we're
11875         implementing an interface indexer, this is the IndexerName in that
11876         interface.  Otherwise, it's the IndexerName.
11877         (Indexer.DefineMethod): If we're implementing interface indexer,
11878         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
11879         and Pending.ImplementIndexer methods.
11880         (Indexer.Define): Also define the PropertyBuilder if we're
11881         implementing an interface indexer and this is neither an explicit
11882         interface implementation nor do the IndexerName match the one in
11883         the interface.
11884
11885         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
11886         If a method is defined here, then we always need to create a proxy
11887         for it.  This is used when implementing interface indexers.
11888         (Pending.IsInterfaceIndexer): New public method.
11889         (Pending.ImplementIndexer): New public method.
11890         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
11891         This is used when implementing interface indexers to define a proxy
11892         if necessary.
11893         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
11894         define a proxy if necessary.
11895
11896         * interface.cs (Interface.IndexerName): New public variable.
11897         (Interface.PopulateIndexer): Set the IndexerName.
11898         (Interface.DefineIndexers): New private method.  Populate all the
11899         indexers and make sure their IndexerNames match.
11900
11901         * typemanager.cs (IndexerPropertyName): Added support for interface
11902         indexers.
11903
11904 2002-07-22  Martin Baulig  <martin@gnome.org>
11905
11906         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
11907         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
11908         ret if HasReturnLabel.
11909         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
11910         variables.
11911
11912         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
11913         and set the ec.LoopBeginTryCatchLevel.
11914         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
11915         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
11916         the current ec.TryCatchLevel, the branch goes out of an exception
11917         block.  In this case, we need to use Leave and not Br.
11918
11919 2002-07-22  Martin Baulig  <martin@gnome.org>
11920
11921         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
11922         block unless the block does not always return or it is contained in
11923         another try { ... } catch { ... } block.  Fixes bug #26506.
11924         Added verify-1.cs to the test suite.
11925
11926 2002-07-22  Martin Baulig  <martin@gnome.org>
11927
11928         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
11929         then we do not always return.  Fixes bug #24985.
11930
11931 2002-07-22  Martin Baulig  <martin@gnome.org>
11932
11933         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
11934         lookup on a per-class level; ie. walk up the class hierarchy until we
11935         found at least one applicable method, then choose the best among them.
11936         Fixes bug #24463 and test-29.cs.
11937
11938 2002-07-22  Martin Baulig  <martin@gnome.org>
11939
11940         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
11941         return types of the methods.  The return type is not part of the
11942         signature and we must not check it to make the `new' modifier work.
11943         Fixes bug #27999, also added test-147.cs.
11944         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
11945
11946         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
11947         on the method's return type.
11948
11949 2002-07-21  Martin Baulig  <martin@gnome.org>
11950
11951         * assign.cs: Make this work if the rightmost source is a constant and
11952         we need to do an implicit type conversion.  Also adding a few more tests
11953         to test-38.cs which should have caught this.
11954
11955         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
11956         target in the makefile for this.  The makefile.gnu is primarily intended
11957         for end-users who don't want to debug the compiler.
11958
11959 2002-07-21  Martin Baulig  <martin@gnome.org>
11960
11961         * assign.cs: Improved the Assign class so it can now handle embedded
11962         assignments (X = Y = Z = something).  As a side-effect this'll now also
11963         consume less local variables.  test-38.cs now passes with MCS, added
11964         a few new test cases to that test.
11965
11966 2002-07-20  Martin Baulig  <martin@gnome.org>
11967
11968         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
11969         instructions.  Fixes bug #27977, also added test-146.cs.
11970
11971 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11972
11973         * cs-tokenizer.cs: fixed getHex ().
11974
11975 2002-07-19  Martin Baulig  <martin@gnome.org>
11976
11977         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
11978         not Type.GetType() to lookup the array type.  This is needed when
11979         we're constructing an array of a user-defined type.
11980         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
11981         single-dimensional arrays, but also for single-dimensial arrays of
11982         type decimal.
11983
11984 2002-07-19  Martin Baulig  <martin@gnome.org>
11985
11986         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
11987         this function is called, it's not allowed to share LocalBuilders
11988         among ILGenerators.
11989
11990 2002-07-19  Martin Baulig  <martin@gnome.org>
11991
11992         * expression.cs (Argument.Resolve): Report an error 118 when trying
11993         to pass a type as argument.
11994
11995 2002-07-18  Martin Baulig  <martin@gnome.org>
11996
11997         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
11998         Conv_R_Un for the signed `long' type.
11999
12000 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
12001
12002         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
12003         `expr' for the temporary result, as that will fail if we do
12004         multiple resolves on the same expression.
12005
12006 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
12007
12008         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
12009         ec.TypeContainer for looking up aliases. 
12010
12011         * class.cs (TypeContainer): Remove LookupAlias from here.
12012
12013         * decl.cs (DeclSpace); Move here.
12014
12015 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
12016
12017         * class.cs (FindMembers): Only call filter if the constructor
12018         bulider is not null.
12019
12020         Also handle delegates in `NestedTypes' now.  Now we will perform
12021         type lookups using the standard resolution process.  This also
12022         fixes a bug.
12023
12024         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
12025         This uses Expressions (the limited kind that can be parsed by the
12026         tree) instead of strings.
12027
12028         * expression.cs (ComposedCast.ToString): Implement, used to flag
12029         errors since now we have to render expressions.
12030
12031         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
12032         FormArrayType. 
12033
12034         * ecore.cs (SimpleName.ToString): ditto.
12035
12036         * cs-parser.jay: Instead of using strings to assemble types, use
12037         Expressions to assemble the type (using SimpleName, ComposedCast,
12038         MemberAccess).  This should fix the type lookups in declarations,
12039         because we were using a different code path for this.
12040
12041         * statement.cs (Block.Resolve): Continue processing statements
12042         even when there is an error.
12043
12044 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
12045
12046         * class.cs (Event.Define): Also remove the `remove' method from
12047         the list of pending items.
12048
12049         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
12050         generate more compact code. 
12051
12052 2002-07-17  Martin Baulig  <martin@gnome.org>
12053
12054         * const.cs (Const.LookupConstantValue): Add support for constant
12055         `unchecked' and `checked' expressions.
12056         Also adding test case test-140.cs for this.
12057
12058 2002-07-17  Martin Baulig  <martin@gnome.org>
12059
12060         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
12061         check whether mi.ReturnType implements the IEnumerator interface; the
12062         `==' and the IsAssignableFrom() will fail in this situation.
12063
12064 2002-07-16  Ravi Pratap  <ravi@ximian.com>
12065
12066         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
12067         here too.
12068
12069 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12070
12071         * expression.cs: fixed bug #27811.
12072
12073 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
12074
12075         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
12076         Molaro: when we are a ref, the value already contains a pointer
12077         value, do not take the address of it.
12078
12079 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
12080         * removed mb-parser.jay and mb-tokenizer.cs
12081
12082 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
12083
12084         * expression.cs: check against the building corlib void type.
12085
12086 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
12087
12088         * ecore.cs: fix for valuetype static readonly fields: when 
12089         initializing them, we need their address, not the address of a copy.
12090
12091 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
12092
12093         * typemanager.cs: register also enum_type in corlib.
12094
12095 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
12096
12097         * class.cs: allow calling this (but not base) initializers in structs.
12098
12099 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
12100
12101         * ecore.cs: make sure we compare against the building base types
12102         in GetTypeSize ().
12103
12104 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
12105
12106         * typemanager.cs: fix TypeToCoreType() to handle void and object
12107         (corlib gets no more typerefs after this change).
12108
12109 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
12110
12111         * expression.cs (ArrayCreation.EmitArrayArguments): use
12112         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
12113
12114         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
12115         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
12116         array indexes, the runtime actually forbids them.
12117
12118         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
12119         for array arguments here.
12120
12121         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
12122         instead of the default for ValueTypes.
12123
12124         (New.DoEmit): Use IsValueType instead of
12125         IsSubclassOf (value_type)
12126         (New.DoResolve): ditto.
12127         (Invocation.EmitCall): ditto.
12128
12129         * assign.cs (Assign): ditto.
12130
12131         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
12132         Statements *are* currently doing part of their resolution during
12133         Emit.  
12134
12135         Expressions do always resolve during resolve, but statements are
12136         only required to propagate resolution to their children.
12137
12138 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
12139
12140         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
12141
12142         (LoadAssembly): Do not add the dll if it is already specified
12143
12144         (MainDriver): Add the System directory to the link path at the end,
12145         after all the other -L arguments. 
12146
12147         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
12148         wrong opcode for loading bytes and bools (ldelem.i1 instead of
12149         ldelem.u1) and using the opposite for sbytes.
12150
12151         This fixes Digger, and we can finally run it.
12152
12153         * driver.cs (UnixParseOption): Move the option parsing here.  
12154         (CSCParseOption): Implement CSC-like parsing of options.
12155
12156         We now support both modes of operation, the old Unix way, and the
12157         new CSC-like way.  This should help those who wanted to make cross
12158         platform makefiles.
12159
12160         The only thing broken is that /r:, /reference: and /lib: are not
12161         implemented, because I want to make those have the same semantics
12162         as the CSC compiler has, and kill once and for all the confussion
12163         around this.   Will be doing this tomorrow.
12164
12165         * statement.cs (Unsafe.Resolve): The state is checked during
12166         resolve, not emit, so we have to set the flags for IsUnsfe here.
12167
12168 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
12169
12170         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
12171         not catch the Error_ObjectRefRequired in SimpleName (as it is
12172         possible to have a class/instance variable name that later gets
12173         deambiguated), we have to check this here.      
12174
12175 2002-07-10  Ravi Pratap  <ravi@ximian.com>
12176
12177         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
12178         make static and put into Expression.
12179
12180         (Event.Define): Register the private field of the event with the 
12181         TypeManager so that GetFieldFromEvent can get at it.
12182
12183         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
12184         keep track of the private field associated with an event which
12185         has no accessors.
12186
12187         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
12188         private field.
12189
12190         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
12191
12192 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
12193
12194         * expression.cs (Binary.EmitBranchable): this routine emits the
12195         Binary expression in a branchable context.  This basically means:
12196         we need to branch somewhere, not just get the value on the stack.
12197
12198         This works together with Statement.EmitBoolExpression.
12199
12200         * statement.cs (Statement.EmitBoolExpression): Use
12201         EmitBranchable. 
12202
12203 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
12204
12205         * statement.cs (For): Reduce the number of jumps in loops.
12206
12207         (For): Implement loop inversion for the For statement.
12208
12209         (Break): We can be breaking out of a Try/Catch controlled section
12210         (foreach might have an implicit try/catch clause), so we need to
12211         use Leave instead of Br.
12212
12213         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
12214         now).  If the instace expression supports IMemoryLocation, we use
12215         the AddressOf method from the IMemoryLocation to extract the
12216         address instead of emitting the instance.
12217
12218         This showed up with `This', as we were emitting the instance
12219         always (Emit) instead of the Address of This.  Particularly
12220         interesting when This is a value type, as we dont want the Emit
12221         effect (which was to load the object).
12222
12223 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
12224
12225         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
12226
12227         * statement.cs (Checked): Set the CheckedState during the resolve
12228         process too, as the ConvCast operations track the checked state on
12229         the resolve process, and not emit.
12230
12231         * cs-parser.jay (namespace_member_declaration): Flag that we have
12232         found a declaration when we do.  This is used to flag error 1529
12233
12234         * driver.cs: Report ok when we display the help only.
12235
12236 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
12237
12238         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
12239
12240 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
12241
12242         * cs-tokenizer.cs (define): We also have to track locally the
12243         defines.  AllDefines is just used for the Conditional Attribute,
12244         but we also need the local defines for the current source code. 
12245
12246 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
12247
12248         * statement.cs (While, For, Do): These loops can exit through a
12249         Break statement, use this information to tell whether the
12250         statement is the last piece of code.
12251
12252         (Break): Flag that we break.
12253
12254         * codegen.cs (EmitContexts): New `Breaks' state variable.
12255
12256 2002-07-03  Martin Baulig  <martin@gnome.org>
12257
12258         * class.cs (TypeContainer.MethodModifiersValid): Allow override
12259         modifiers in method declarations in structs.  Otherwise, you won't
12260         be able to override things like Object.Equals().
12261
12262 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
12263
12264         * class.cs (Method, Property, Indexer): Do not allow the public
12265         modifier to be used in explicit interface implementations.
12266
12267         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
12268         override modifiers in method declarations in structs
12269
12270 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
12271
12272         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
12273         integer or real overflow, report an error
12274
12275 2002-07-02  Martin Baulig  <martin@gnome.org>
12276
12277         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
12278         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
12279         to tell the runtime about our newly created System.Object and
12280         System.ValueType types.
12281
12282 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
12283
12284         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
12285         struct instead of Ldarg/Starg.
12286
12287 2002-07-02  Martin Baulig  <martin@gnome.org>
12288
12289         * expression.cs (Indirection.Indirection): Call
12290         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
12291
12292 2002-07-02  Martin Baulig  <martin@gnome.org>
12293
12294         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
12295         ValueType, call TypeManager.TypeToCoreType() on it.
12296         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
12297         the OpCodes.Newarr argument.
12298
12299 2002-07-02  Martin Baulig  <martin@gnome.org>
12300
12301         * expression.cs (Invocation.EmitCall): When compiling corlib,
12302         replace all calls to the system's System.Array type to calls to
12303         the newly created one.
12304
12305         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
12306         System.Array methods.
12307         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
12308         from the system's System.Array type which must be replaced.
12309
12310 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
12311
12312         * typemanager.cs: load unverifiable_code_ctor so we can build
12313         corlib using the correct type. Avoid using GetTypeCode() with
12314         TypeBuilders.
12315         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
12316         TypeManager.object_type to allow building corlib.
12317
12318 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
12319
12320         * ecore.cs: handle System.Enum separately in LoadFromPtr().
12321
12322 2002-07-01  Martin Baulig  <martin@gnome.org>
12323
12324         * class.cs: Make the last change actually work, we need to check
12325         whether `ifaces != null' to avoid a crash.
12326
12327 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
12328
12329         * class.cs: when we build structs without fields that implement
12330         interfaces, we need to add the interfaces separately, since there is
12331         no API to both set the size and add the interfaces at type creation
12332         time.
12333
12334 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
12335
12336         * expression.cs: the dimension arguments to the array constructors
12337         need to be converted if they are a long.
12338
12339 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
12340
12341         * class.cs: don't emit ldarg.0 if there is no parent constructor
12342         (fixes showstopper for corlib).
12343
12344 2002-06-29  Martin Baulig  <martin@gnome.org>
12345
12346         MCS now compiles corlib on GNU/Linux :-)
12347
12348         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
12349         ie. check for MethodImplOptions.InternalCall.
12350
12351         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
12352         and TypeManager.attribute_type are null, so we must explicitly check
12353         whether parent is not null to find out whether it's an attribute type.
12354         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
12355         and SetBuilder, not only if the property is neither abstract nor external.
12356         This is necessary to set the MethodImplOptions on the accessor methods.
12357         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
12358         SetBuilder, see Property.Emit().
12359
12360         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
12361         populate "System.Object", "System.ValueType" and "System.Attribute" since
12362         they've already been populated from BootCorlib_PopulateCoreTypes().
12363
12364 2002-06-29  Martin Baulig  <martin@gnome.org>
12365
12366         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
12367         is the NullLiteral, we also need to make sure that target_type is not
12368         an enum type.   
12369
12370 2002-06-29  Martin Baulig  <martin@gnome.org>
12371
12372         * rootcontext.cs (RootContext.ResolveCore): We must initialize
12373         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
12374         before calling BootstrapCorlib_ResolveDelegate ().
12375
12376 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12377
12378         * statement.cs: fixed build-breaker. All tests passed ok.
12379
12380 2002-06-27  Martin Baulig  <martin@gnome.org>
12381
12382         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
12383         for System.Decimal when compiling corlib.
12384
12385 2002-06-27  Martin Baulig  <martin@gnome.org>
12386
12387         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
12388         switch blocks which contain nothing but a default clause.
12389
12390 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
12391
12392        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
12393
12394 2002-06-27  Martin Baulig  <martin@gnome.org>
12395
12396         * ecore.cs (PropertyExpr.PropertyExpr): Call
12397         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
12398
12399         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
12400         is already a TypeBuilder.
12401
12402 2002-06-27  Martin Baulig  <martin@gnome.org>
12403
12404         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
12405         `target_type == TypeManager.array_type', not IsAssignableFrom() in
12406         the "from an array-type to System.Array" case.  This makes it work
12407         when compiling corlib.
12408
12409 2002-06-27  Martin Baulig  <martin@gnome.org>
12410
12411         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
12412         non-static PropertyExpr, set its InstanceExpression.  This makes
12413         the `ICollection.Count' property work in System/Array.cs.
12414
12415 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
12416
12417         * driver.cs: Made error handling more consistent.  Errors now
12418         tracked by Report class, so many methods which used to return int
12419         now return void.  Main() now prints success/failure and 
12420         errors/warnings message.
12421
12422         Renamed '--probe' compiler argument to '--expect-error'.  Removed
12423         the magic number return values (123 and 124).  Now, if the
12424         expected error occurs, the compiler exits with success (exit value
12425         0).  If the compilation completes without seeing that particular
12426         error, the compiler exits with failure (exit value 1).  The
12427         makefile in mcs/errors has been changed to handle the new behaviour.
12428
12429         * report.cs: Made 'expected error' number a property and renamed
12430         it from 'Probe' to 'ExpectedError'.
12431
12432         * genericparser.cs: Removed error handling support, since it is
12433         now all done by Report class.
12434
12435         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
12436         class, so parse() no longer returns an int.
12437
12438         * namespace.cs: Use Report.Error instead of GenericParser.error
12439
12440 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
12441
12442         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
12443         TypeContainer.AddOperator): At the front of the list put the
12444         explicit implementations, so they get resolved/defined first. 
12445
12446 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
12447
12448         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
12449         interface type is implemented by this TypeContainer.  Used during
12450         explicit interface implementation.
12451
12452         (Property.Define, Indexer.Define, Method.Define): Validate that
12453         the given interface in the explicit implementation is one of the
12454         base classes for the containing type.
12455
12456         Also if we are explicitly implementing an interface, but there is
12457         no match in the pending implementation table, report an error.
12458
12459         (Property.Define): Only define the property if we are
12460         not explicitly implementing a property from an interface.  Use the
12461         correct name also for those properties (the same CSC uses,
12462         although that is really not needed).
12463
12464         (Property.Emit): Do not emit attributes for explicitly implemented
12465         properties, as there is no TypeBuilder.
12466
12467         (Indexer.Emit): ditto.
12468
12469         Hiding then means that we do not really *implement* a pending
12470         implementation, which makes code fail.
12471
12472 2002-06-22  Martin Baulig  <martin@gnome.org>
12473
12474         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
12475         the return value of Object.GetType().  [FIXME: we need to do this whenever
12476         we get a type back from the reflection library].
12477
12478 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
12479
12480         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
12481
12482 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
12483
12484         * attribute.cs: Return null if we can not look up the type.
12485
12486         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
12487         the interface types found.
12488
12489         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
12490         interface types found.
12491
12492         * typemanager.cs (GetInterfaces): Make this routine returns alll
12493         the interfaces and work around the lame differences between
12494         System.Type and System.Reflection.Emit.TypeBuilder in the results
12495         result for GetInterfaces.
12496
12497         (ExpandInterfaces): Given an array of interface types, expand and
12498         eliminate repeated ocurrences of an interface.  This expands in
12499         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
12500         be IA, IB, IC.
12501
12502 2002-06-21  Martin Baulig  <martin@gnome.org>
12503
12504         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
12505         on System.Enum.
12506
12507 2002-06-21  Martin Baulig  <martin@gnome.org>
12508
12509         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
12510         and called with one of the core types, return the corresponding typebuilder for
12511         that type.
12512
12513         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
12514         element type.
12515
12516 2002-06-21  Martin Baulig  <martin@gnome.org>
12517
12518         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
12519         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
12520         (Expression.ConvertReferenceExplicit): Likewise.
12521
12522         * expression.cs (ElementAccess.DoResolve): Likewise.
12523         (ElementAccess.DoResolveLValue): Likewise.
12524
12525 2002-06-10  Martin Baulig  <martin@gnome.org>
12526
12527         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
12528         add the "value" parameter to the parameter list.
12529
12530         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
12531         to our caller.
12532
12533 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
12534
12535         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
12536         the argument to an int, uint, long or ulong, per the spec.  Also
12537         catch negative constants in array creation.
12538
12539 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
12540
12541         * class.cs: do not allow the same interface to appear twice in
12542         the definition list.
12543
12544 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
12545
12546         * ecore.cs: don't use ldlen with System.Array.
12547
12548 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
12549
12550         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
12551
12552 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
12553
12554         * modifiers.cs: produce correct field attributes for protected
12555         internal. Easy fix so miguel can work on ther harder stuff:-)
12556
12557 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
12558
12559         * pending.cs: New file.  Move the code from class.cs here.
12560         Support clearning the pending flag for all methods (when not doing
12561         explicit interface implementation).
12562
12563 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
12564
12565         * rootcontext.cs: added a couple more types needed to bootstrap.
12566
12567 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
12568
12569         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
12570         constructor in the type, instead of any constructor in the type
12571         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
12572         a bug in the Mono runtime when applying the params attribute). 
12573
12574 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
12575         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
12576
12577 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
12578
12579         * expression.cs (Unary.ResolveOperator): Use TypeManager
12580         to resolve the type.
12581
12582 2002-06-13  Ravi Pratap  <ravi@ximian.com>
12583
12584         * cs-parser.jay (enum_member_declaration): Pass in the attributes
12585         attached.
12586
12587         * enum.cs (AddEnumMember): Add support to store the attributes associated 
12588         with each member too.
12589
12590         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
12591         field builders too - this takes care of the enum member case.
12592
12593 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
12594
12595         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
12596         address-of operator on both value types and pointers.
12597
12598 2002-06-10  Martin Baulig  <martin@gnome.org>
12599
12600         * interface.cs (Interface.PopulateIndexer): Add the indexer's
12601         PropertyBuilder to the `property_builders' list.
12602
12603         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
12604         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
12605         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
12606         find any indexers which are inherited from an interface.
12607
12608 2002-06-09  Martin Baulig  <martin@gnome.org>
12609
12610         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
12611         the same type as the constant if necessary.  There's also a test-130.cs
12612         for this.
12613
12614         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
12615
12616         * typemanager.cs (TypeManager.ChangeType): Previously known as
12617         Enum.ChangeEnumType().
12618
12619 2002-06-09  Martin Baulig  <martin@gnome.org>
12620
12621         * expression.cs (Cast.TryReduce): Added support for consts.
12622
12623 2002-06-08  Ravi Pratap  <ravi@ximian.com>
12624
12625         * class.cs (Accessor): Hold attributes information so we can pass
12626         it along.
12627
12628         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
12629         Modify to pass in attributes attached to the methods.
12630
12631         (add_accessor_declaration, remove_accessor_declaration): Ditto.
12632
12633         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
12634         to handle the Accessor kind :-)
12635
12636         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
12637
12638 2002-06-08  Martin Baulig  <martin@gnome.org>
12639
12640         * expression.cs (Unary.TryReduceNegative): Added support for
12641         ULongConstants.
12642
12643 2002-06-08  Martin Baulig  <martin@gnome.org>
12644
12645         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
12646         name can't be found in the `defined_names' - the caller will do a
12647         MemberLookup in this case and thus find methods in System.Enum
12648         such as Enum.IsDefined().
12649
12650 2002-06-08  Martin Baulig  <martin@gnome.org>
12651
12652         * enum.cs (Enum.ChangeEnumType): This is a custom version of
12653         Convert.ChangeType() which works with TypeBuilder created types.
12654         (Enum.LookupEnumValue, Enum.Define): Use it here.
12655
12656         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
12657         `TypeBuilder.BaseType != null' check.
12658         (TypeContainer.FindMembers): Only lookup parent members if we
12659         actually have a parent.
12660         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
12661         (ConstructorInitializer.Resolve): Likewise.
12662
12663         * interface.cs (Interface.FindMembers): Added
12664         `TypeBuilder.BaseType != null' check.
12665
12666         * rootcontext.cs (RootContext.ResolveCore): Added
12667         "System.Runtime.CompilerServices.IndexerNameAttribute" to
12668         classes_second_stage.
12669
12670         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
12671         debug_type and trace_type when compiling with --nostdlib.       
12672
12673 2002-06-07  Martin Baulig  <martin@gnome.org>
12674
12675         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
12676         (AddField): Set it to true when adding a non-static field.
12677         (DefineType): Use `have_nonstatic_fields' to find out whether we
12678         have non-static fields, not `Fields != null'.
12679
12680 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
12681
12682         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
12683         dereferencing a null on the static-field code path)
12684
12685 2002-05-30  Martin Baulig  <martin@gnome.org>
12686
12687         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
12688         to take command line arguments.  Use reflection to call the new
12689         custom `Initialize' function on the symbol writer and pass it the
12690         command line arguments.
12691
12692         * driver.cs (--debug-args): New command line argument to pass command
12693         line arguments to the symbol writer.
12694
12695 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
12696
12697         * assign.cs (DoResolve): Forgot to do the implicit conversion to
12698         the target type for indexers and properties.  Thanks to Joe for
12699         catching this.
12700
12701 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
12702
12703         * typemanager.cs (MethodFlags): returns the method flags
12704         (Obsolete/ShouldIgnore) that control warning emission and whether
12705         the invocation should be made, or ignored. 
12706
12707         * expression.cs (Invocation.Emit): Remove previous hack, we should
12708         not do this on matching a base type, we should do this based on an attribute
12709
12710         Only emit calls to System.Diagnostics.Debug and
12711         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
12712         on the command line.
12713
12714         * rootcontext.cs: Global settings for tracing and debugging.
12715
12716         * cs-tokenizer.cs (define): New utility function to track
12717         defines.   Set the global settings for TRACE and DEBUG if found.
12718
12719 2002-05-25  Ravi Pratap  <ravi@ximian.com>
12720
12721         * interface.cs (Populate*): Pass in the TypeContainer as well as
12722         the DeclSpace as parameters so that we can create EmitContexts and
12723         then use that to apply attributes etc.
12724
12725         (PopulateMethod, PopulateEvent, PopulateProperty)
12726         (PopulateIndexer): Apply attributes everywhere.
12727
12728         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
12729         etc.
12730
12731         (ApplyAttributes): Update accordingly.
12732
12733         We now apply interface attributes for all members too.
12734
12735 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
12736
12737         * class.cs (Indexer.Define); Correctly check if we are explicit
12738         implementation (instead of checking the Name for a ".", we
12739         directly look up if the InterfaceType was specified).
12740
12741         Delay the creation of the PropertyBuilder.
12742
12743         Only create the PropertyBuilder if we are not an explicit
12744         interface implementation.   This means that explicit interface
12745         implementation members do not participate in regular function
12746         lookups, and hence fixes another major ambiguity problem in
12747         overload resolution (that was the visible effect).
12748
12749         (DefineMethod): Return whether we are doing an interface
12750         implementation. 
12751
12752         * typemanager.cs: Temporary hack until we get attributes in
12753         interfaces (Ravi is working on that) and we get IndexerName
12754         support in interfaces.
12755
12756         * interface.cs: Register the indexers as properties.
12757
12758         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
12759         warning, I have verified that this is a bug in the .NET runtime
12760         (JavaScript suffers of the same problem).
12761
12762         * typemanager.cs (MemberLookup): When looking up members for
12763         interfaces, the parent of an interface is the implicit
12764         System.Object (so we succeed in searches of Object methods in an
12765         interface method invocation.  Example:  IEnumerable x;  x.ToString
12766         ()) 
12767
12768 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
12769
12770         * class.cs (Event): Events should also register if they do
12771         implement the methods that an interface requires.
12772
12773         * typemanager.cs (MemberLookup); use the new GetInterfaces
12774         method. 
12775
12776         (GetInterfaces): The code used to lookup interfaces for a type is
12777         used in more than one place, factor it here. 
12778
12779         * driver.cs: Track the errors at the bottom of the file, we kept
12780         on going.
12781
12782         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
12783         instance if the method we are calling is static!
12784
12785 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
12786
12787         * attribute.cs (ApplyAttributes): Make this function filter out
12788         the IndexerName attribute (as that attribute in reality is never
12789         applied) and return the string constant for the IndexerName
12790         attribute. 
12791
12792         * class.cs (TypeContainer.Emit): Validate that all the indexers
12793         have the same IndexerName attribute, and if so, set the
12794         DefaultName attribute on the class. 
12795
12796         * typemanager.cs: The return value might contain other stuff (not
12797         only methods).  For instance, consider a method with an "Item"
12798         property and an Item method.
12799
12800         * class.cs: If there is a problem with the parameter types,
12801         return. 
12802
12803 2002-05-24  Ravi Pratap  <ravi@ximian.com>
12804
12805         * ecore.cs (ImplicitConversionExists): Wrapper function which also
12806         looks at user defined conversion after making a call to 
12807         StandardConversionExists - we need this for overload resolution.
12808
12809         * expression.cs : Update accordingly the various method calls.
12810
12811         This fixes 2 bugs filed against implicit user defined conversions 
12812
12813 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
12814
12815         * statement.cs: Track the result of the assignment.
12816
12817 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
12818
12819         * expression.cs (MemberAccess): Improved error reporting for
12820         inaccessible members.
12821
12822 2002-05-22  Martin Baulig  <martin@gnome.org>
12823
12824         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
12825         itself with debugging support.
12826
12827 2002-05-22  Martin Baulig  <martin@gnome.org>
12828
12829         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
12830         Removed, this isn't needed anymore.
12831
12832 2002-05-20  Martin Baulig  <martin@gnome.org>
12833
12834         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
12835         be underlying type for an enum.
12836
12837 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
12838
12839         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
12840         that splits out the loading of just the core types.
12841
12842         * rootcontext.cs (ResolveCore): Split the struct resolution in
12843         two, so we can load the enumeration underlying types before any
12844         enums are used.
12845
12846         * expression.cs (Is): Bandaid until we fix properly Switch (see
12847         bug #24985 for details).
12848
12849         * typemanager.cs (ImplementsInterface): The hashtable will contain
12850         a null if there are no interfaces implemented.
12851
12852 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
12853
12854         * cs-parser.jay (indexer_declarator): It is fine to have array
12855         parameters
12856
12857 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
12858
12859         * typemanager.cs: (RegisterBuilder): New function used to register
12860         TypeBuilders that implement interfaces.  Since
12861         TypeBuilder.GetInterfaces (as usual) does not work with lame
12862         Reflection.Emit. 
12863         (AddUserType): register interfaces.
12864
12865         (ImplementsInterface): Use the builder_to_ifaces hash if we are
12866         dealing with TypeBuilder.  Also, arrays are showing up as
12867         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
12868         methods can not be invoked on them!
12869
12870         * ecore.cs (ExplicitReferenceConversionExists): Made public.
12871         (ImplicitReferenceConversionExists): Split out from
12872         StandardConversionExists. 
12873
12874         * expression.cs (As): We were only implementing one of the three
12875         cases for the as operator.  We now implement them all.
12876         (Is): Implement the various other cases for Is as well.
12877
12878         * typemanager.cs (CACHE): New define used to control if we want or
12879         not the FindMembers cache.  Seems to have a negative impact on
12880         performance currently
12881
12882         (MemberLookup): Nested types have full acess to
12883         enclosing type members
12884
12885         Remove code that coped with instance/static returns for events, we
12886         now catch this in RealFindMembers.
12887
12888         (RealFindMembers): only perform static lookup if the instance
12889         lookup did not return a type or an event.  
12890
12891 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
12892
12893         * assign.cs (CompoundAssign): We pass more semantic information
12894         now to Compound Assignments than we did before: now we have all
12895         the information at hand, and now we resolve the target *before* we
12896         do the expression expansion, which allows the "CacheValue" method
12897         to have the effect we intended (before, a [x] += 1 would generate
12898         two differen ArrayAccess expressions from the ElementAccess,
12899         during the resolution process).
12900
12901         (CompoundAssign.DoResolve): Resolve target and original_source here.
12902
12903 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
12904
12905         * expression.cs (ArrayAccess): dropped debugging information. 
12906
12907         * typemanager.cs: Small bug fix: I was always returning i_members,
12908         instead of one of i_members or s_members (depending on which had
12909         the content).
12910
12911         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
12912         method is invoked before any code generation takes place, and it
12913         is a mechanism to inform that the expression will be invoked more
12914         than once, and that the method should use temporary values to
12915         avoid having side effects
12916
12917         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
12918
12919         * ecore.cs (Expression.CacheTemporaries): Provide empty default
12920         implementation.
12921
12922         * expression.cs (Indirection, ArrayAccess): Add support for
12923         CacheTemporaries in these two bad boys. 
12924
12925         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
12926         ldobj or ldind_ref.  
12927         (StoreFromPtr): Handle stobj as well.
12928
12929         * expression.cs (UnaryMutator): Share more code.
12930
12931         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
12932         down: I was not tracking the Filter function as well, which
12933         was affecting the results of the cache.
12934
12935 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
12936
12937         * attribute.cs: Remove the hack to handle the CharSet property on
12938         StructLayouts. 
12939
12940 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
12941
12942         * attribute.cs (DoResolve): More uglyness, we now only try to
12943         resolve the attribute partially, to extract the CharSet
12944         information (only if we are a StructLayout attribute).  Otherwise 
12945
12946         (GetExtraTypeInfo): Add some code to conditionally kill in the
12947         future this.   I am more and more convinced that the .NET
12948         framework has special code to handle the attribute setting on
12949         certain elements.
12950
12951         * expression.cs (IsParamsMethodApplicable): Revert my previous
12952         foreach change here, it was wrong.
12953
12954 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
12955
12956         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
12957         (pp_expr): do not abort on unknown input, just return.
12958         (eval): abort if there are pending chars.
12959
12960         * attribute.cs (Attribute.Resolve): Positional parameters are
12961         optional.  Deal with that case.
12962
12963         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
12964         the Ansi/Unicode/Auto information for the type.
12965
12966         (TypeContainer.DefineType): instantiate the EmitContext here, as
12967         we will be using it during the type definition (to resolve
12968         attributes) and during the emit phase.
12969
12970         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
12971         to pull type information out of the attributes
12972
12973         (Attribute.Resolve): track the constructor builder, and allow for
12974         multiple invocations (structs and classes will use this).
12975
12976         * ecore.cs (MemberLookupFinal): new version with all the
12977         parameters customizable.
12978
12979         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
12980         constructors.  Return if the result value is null (as the error
12981         would have been flagged already by MemberLookupFinal)
12982
12983         Do not allow instances of abstract classes or interfaces to be
12984         created.
12985
12986         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
12987         We have to compare the assembly property here when dealing with
12988         FamANDAssem and Assembly access modifiers, because we might be
12989         creating an assembly from *modules* (that means that we are not
12990         getting TypeBuilders for types defined in other modules that are
12991         part of this assembly).
12992
12993         (Method.Emit): If the method is marked abstract and has a body,
12994         emit an error. 
12995
12996         (TypeContainer.DefineMembers): If both the defined member and the
12997         parent name match are methods, then do not emit any warnings: let
12998         the Method.Define routine take care of flagging warnings.  But if
12999         there is a mismatch (method overrides something else, or method is
13000         overriwritten by something, then emit warning).
13001
13002         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
13003         set to null, this means `do not check for the return type on the
13004         signature'. 
13005
13006         (Method.Define): set the return type for the method signature to
13007         null, so that we get methods with the same name and parameters and
13008         different return types.  This is used to flag warning 114 (you are
13009         hiding a method, and you probably want to use the new/override
13010         keywords instead).
13011
13012         * typemanager.cs (MemberLookup): Implemented proper access
13013         control, closing a long standing set of bug reports.  The problem
13014         was that the Framework only has two bits: Public and NonPublic,
13015         and NonPublic includes private and protected methods, but we need
13016         to enforce the FamANDAssem, FamOrAssem and Family. 
13017
13018 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
13019
13020         * statement.cs (GotoCase): Return true: Ammounts to giving up
13021         knowledge on whether we return or not, and letting the other case
13022         be responsible for it.
13023
13024 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
13025
13026         * driver.cs: Do not load directories for each file processed, only
13027         do it if there is a pattern.
13028
13029         * ecore.cs: Report readonly assigns here as well, as we might have
13030         been resolved only by MemberAccess.
13031
13032         (SimpleName.SimpleNameResolve): Also be useful for LValue
13033         resolution.   We need this to propagate assign to local readonly variables
13034
13035         * typemanager.cs: Use a ptrhashtable for the criteria, because we
13036         do not want to reuse potential criteria memory.
13037
13038         * class.cs (MyEventBuilder): Set reflected_type;
13039
13040         * ecore.cs (Constantify): Added support for constifying bools.
13041
13042         (RootContext.LookupType): Added a cache for values looked up in
13043         the declaration space.
13044
13045         * typemanager.cs (FindMembers): Now is a front-end to
13046         RealFindMembers, and provides a two-level hashtable-based cache to
13047         the request.  
13048
13049         15% performance improvement: from 22.5 to 19.2 seconds.
13050
13051         * expression.cs (IsParamsMethodApplicable): use foreach.
13052         (Invocation.DoResolve): ditto.
13053         (New.DoResolve): ditto.
13054         (ArrayCreation.DoResolve): ditto.
13055
13056         * ecore.cs (FindMostEncompassingType): use foreach.
13057
13058         * delegate.cs (NewDelegate.DoResolve): Use foreach
13059
13060         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
13061         (RemoveMethods): use foreach.
13062
13063         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
13064         nested foreach statements instead of for, and also break out of
13065         the inner loop once a match is found.
13066
13067         (Invocation.OverloadResolve): Use foreach, simplify the code. 
13068
13069 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
13070
13071         * cfold.cs (BinaryFold): During an enumeration evaluation context,
13072         we actually unwrap the expression to allow for extra information
13073         to be extracted. 
13074
13075         * expression.cs: Use Shr_Un on unsigned operations. 
13076
13077 2002-05-08  Ravi Pratap  <ravi@ximian.com>
13078
13079         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
13080         applicable operators was not being considered correctly. This closes
13081         the bug Miguel reported.
13082
13083 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
13084
13085         * attribute.cs: check that the type derives from System.Attribute
13086         and report the correct error in that case (moved the duplicate code to
13087         its own method, too).
13088
13089 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
13090
13091         * attribute.cs: lookup attribute type name as the spec says: first the
13092         bare attribute name and then name + "Attribute" (nant compiles with
13093         mcs after this fix).
13094
13095 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
13096
13097         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
13098         Because of the way we parse things, we should try to see if a
13099         UIntConstant can fit in an integer.
13100
13101 2002-05-07  Ravi Pratap  <ravi@ximian.com>
13102
13103         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
13104         when we are in an explicit context.
13105
13106         (ConvertReferenceExplicit): When converting from Iface type S to Class
13107         T make sure the rules are implemented as an OR.
13108
13109         * parameter.cs (ParameterType): Make it a property for now although the
13110         purpose really isn't anything immediate.
13111
13112         * expression.cs (Is*Applicable): Do better checking on the parameter type
13113         of a ref/out parameter. The ones from the system assemblies are already 
13114         marked with the correct type so we don't need to do any correction.
13115
13116         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
13117         the object type is standard too so include that.
13118
13119 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13120
13121         * ecore.cs (StandardConversionExists): Augment with missing code:
13122         deal with IntConstant, LongConstants and Enumerations.
13123
13124         * assign.cs: Report the error, instead of failing silently
13125
13126         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
13127         typecontainer that they are declared, because the
13128         typecontainer/namespace will have the list of using clauses that
13129         need to be applied.
13130
13131         Assembly Attributes were escaping the normal registration
13132         mechanism. 
13133
13134         (EmitCode): Apply attributes within an EmitContext that represents
13135         the container they were declared on.
13136
13137         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
13138
13139 2002-05-06  Ravi Pratap  <ravi@ximian.com>
13140
13141         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
13142         Revamp completely - make much cleaner as we now operate only
13143         on a set of Types.
13144
13145         (FindMostSpecificSource, FindMostSpecificTarget): New methods
13146         to implement the logic detailed in the spec more correctly.
13147
13148         (UserDefinedConversion): Update accordingly.
13149
13150 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13151
13152         * statement.cs: Return flow analysis information up.
13153
13154         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
13155         and the default.
13156
13157         (token): Do not consume an extra character before calling
13158         decimal_digits.
13159
13160 2002-05-06  Piers Haken <piersh@friskit.com>
13161
13162         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
13163
13164 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13165
13166         * class.cs (Constructor.Emit): Set the IsStatic flag in the
13167         EmitContext during the instance constructor initializer
13168         resolution, to stop access to instance variables.
13169
13170         This is mandated by the spec, last paragraph of the `constructor
13171         initializers' section. 
13172
13173 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
13174
13175         * cs-parser.jay, class.cs (Accessor): new class used to represent
13176         an accessor (get or set).  In the past we used `null' to represent
13177         a missing accessor.  But this is ambiguous because there was no
13178         way to tell in abstract indexers/properties if one of them was
13179         specified.
13180
13181         Now there is a way of addressing that.
13182
13183         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
13184         instead of FindMembers.
13185
13186         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
13187         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
13188
13189         * attribute.cs: Treat indexers and properties as the same in terms
13190         of applying attributes
13191
13192         * ecore.cs (FindMostEncompassedType): Use statically initialized
13193         EmptyExpressions()s like we do elsewhere to avoid creating useless
13194         objects (and we take this out of the tight loop).
13195
13196         (GetConversionOperators): Move the code to extract the actual
13197         operators to a separate routine to clean things up.
13198
13199 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
13200
13201         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
13202         events are always registered FieldBuilders.
13203
13204         * class.cs (FieldBase): New class shared by Fields 
13205
13206         * delegate.cs: If we are a toplevel delegate, use our full name.
13207         If we are a nested delegate, then only use our tail name.
13208
13209 2002-05-02  Ravi Pratap  <ravi@ximian.com>
13210
13211         * expression.cs (IsApplicable): Ensure that we add the "&" to
13212         ref/out types before comparing it with the type of the argument.
13213
13214         (IsParamsMethodApplicable): Ditto.
13215
13216         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
13217         silly me ;-)
13218
13219         * delegate.cs : Handle the case when we have more than one applicable
13220         method. Flag an error only when we finish checking all.
13221
13222 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
13223
13224         * expression.cs: Add support for boolean static initializers.
13225
13226 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
13227
13228         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
13229
13230         * parameter.cs (ComputeParameterTypes,
13231         ComputeAndDefineParameterTypes): Better error handling: now we
13232         clear the `types' cache if we fail during any of the type lookups.
13233         We also return the status code correctly to our caller
13234
13235         * delegate.cs: If we fail to define a delegate, abort the extra
13236         steps. 
13237
13238         * expression.cs (Binary.ResolveOperator): for
13239         operator==(object,object) and operator !=(object, object) we also
13240         have to verify that there is an implicit conversion from one to
13241         the other.
13242
13243         (ArrayAccess.DoResolve): Array Access can operate on
13244         non-variables. 
13245
13246 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
13247
13248         * assign.cs (CompoundAssign): A new class used as a "flag" that
13249         the assignment actually is happening as part of a compound
13250         assignment operator.
13251
13252         During compound assignment, a few new rules exist to enable things
13253         like:
13254
13255         byte b |= 1 + 2
13256
13257         From the spec:
13258
13259         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
13260         to the type of x) if y is implicitly convertible to the type of x,
13261         and the operator is a builtin operator and the return type of the
13262         operator is explicitly convertible to the type of x. 
13263
13264         * rootcontext.cs: Reset warning level to 2.  4 catches various
13265         "interesting" features in mcs, we must clean this up at some
13266         point, but currently am trying to kill other bugs ;-)
13267
13268         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
13269         in container classes as well.  
13270
13271         * expression.cs (Binary.ResolveOperator): Handle string case
13272         before anything else (as operator overloading does emit an error
13273         before doing anything else).
13274
13275         This code could go away when we move to a table driven model, but
13276         i could not come up with a good plan last night.
13277
13278 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
13279
13280         * typemanager.cs (CSharpName): reimplementation using regex.
13281         * class.cs: added null check for fields in Emit
13282         * rootcontext.cs: set warninglevel to 4
13283
13284 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
13285
13286         * typemanager.cs (CSharpName): reimplemented with Lupus
13287         suggestion.
13288
13289 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
13290
13291         * statement.cs (If): correclty implement Resolve, because we were
13292         not catching sem errors in there.  The same process is needed
13293         everywhere else. 
13294         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
13295
13296
13297         (Statement.Warning_DeadCodeFound): Factorize code.
13298         (While): Report dead code here too.
13299
13300         (Statement): Added Resolve virtual method to allow
13301         for resolution split from the emit code.
13302
13303 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
13304
13305         * statement.cs (EmitBoolExpression): No longer try to resolve the
13306         expression here.    
13307         (MakeBoolean): New utility function that resolve, implicitly
13308         converts to boolean and tags the expression. 
13309
13310
13311         (If, Do): Implement dead code elimination.
13312         (While): Implement loop inversion
13313
13314         (Do, While, For, If): Resolve the expression prior to calling our
13315         code generation.
13316
13317 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
13318
13319         * class.cs:
13320           - added method Report28 (warning: program has more than one entry point)
13321           - added method IsEntryPoint, implements paragraph 10.1 of the spec
13322           - modified method Method.Define, the part at the end of the method
13323
13324         * rootcontext.cs: added static public Location EntryPointLocation;
13325           
13326         * ../errors/cs0028.cs : Add test case for the above warning.              
13327
13328         * typemanager.cs:
13329           - modified method CSharpName to allow arrays of primitive type to
13330             be printed nicely (e.g. instead of System.Int32[][] it now prints
13331             int[][])
13332           - added method CSharpSignature: returns the signature of a method
13333             in string format to be used in reporting errors, warnings, etc.
13334
13335         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
13336         with String.Empty.
13337
13338 2002-04-26  Ravi Pratap  <ravi@ximian.com>
13339
13340         * delegate.cs (Define): Fix extremely silly bug where I was
13341         setting the type of the 'object' parameter of the BeginInvoke
13342         method to System.IAsyncResult instead of System.Object ;-)
13343
13344 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
13345
13346         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
13347         here. 
13348
13349         (Constructor.Emit): return if we fail to initialize the
13350         constructor.  Another door closed!  
13351
13352         * expression.cs (New.DoResolve): Improve error message (from -6 to
13353         1501).  Use DeclaredOnly lookup to find the exact constructor.
13354
13355         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
13356         loop.  This is useful.
13357
13358         * cs-parser.jay: Adjust the default parameters so that destructors
13359         have the proper signature.
13360
13361 2002-04-26  Martin Baulig  <martin@gnome.org>
13362
13363         * driver.cs (LoadAssembly): If `assembly' contains any characters
13364         which are only valid in path names and not in assembly names
13365         (currently slash, backslash and point), use Assembly.LoadFrom ()
13366         instead of Assembly.Load () on the `assembly' (before iteration
13367         over the link_paths).
13368
13369 2002-04-26  Martin Baulig  <martin@gnome.org>
13370
13371         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
13372
13373 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
13374
13375         * class.cs (Property): use the new typemanager.MemberLookup
13376
13377         (TypeContainer.MemberLookup): Implement using the
13378         TypeManager.MemberLookup now. 
13379
13380         * typemanager.cs: Make MemberLookup a function of the TypeManager,
13381         and return MemberInfos, so that these can be used without an
13382         EmitContext (what we had before).
13383
13384 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
13385
13386         * expression.cs: Fix the case where the argument to params if the
13387         type of the params.  I omitted handling this before.   Fixed
13388
13389 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
13390
13391         * driver.cs: Call BootCorlib_PopulateCoreType
13392
13393         * class.cs (Property.CheckBase): Check for properties only, not
13394         for all members. 
13395
13396         * interface.cs: Temporary hack: try/catch around the
13397         CustomAttributeBuilder, because I am getting an exception that I
13398         do not understand.
13399
13400         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
13401         types whose definitions are required to be there (attributes are
13402         defined before standard types).
13403
13404         Compute definitions as we boot the various types, as they are used
13405         immediately (value_type class will need object_type, but if we do
13406         not initialize object_type, we will pass a null, which will let
13407         the runtime pick the System.Object from the existing corlib, which
13408         is not what we want).
13409
13410 2002-04-22  Patrik Torstensson <totte@labs2.com>
13411
13412         * cs-tokenizer.cs: fixed a number of trim() issues.
13413
13414 2002-04-22  Ravi Pratap  <ravi@ximian.com>
13415
13416         * expression.cs (Argument.Type): Ensure that we return the correct
13417         type when we have out or ref parameters [in which case we 
13418         append a "&"].
13419
13420 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
13421
13422         * class.cs (Property, Indexer): Allow extern modifier in there. 
13423
13424         * typemanager.cs (InitBaseTypes): Initializes object_type and
13425         value_type, since those will be used early on during the bootstrap
13426         process to compile corlib.
13427
13428         (InitCoreTypes): Move code from here to InitBaseTypes.
13429
13430 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
13431
13432         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
13433         single-dimension arrays as using the ldlen opcode.  
13434
13435         Daniel Lewis discovered this optimization.  
13436
13437         * typemanager.cs: Add signature for System.Array::get_Length
13438
13439 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
13440
13441         * statement.cs: report the error when the foreach does not apply to an
13442         array nor a collection.
13443
13444 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
13445
13446         * expression.cs: Add implicit conversions to the operator ~.
13447
13448         * constant.cs (DecimalConstant.Emit): Emit decimal value.
13449
13450         * typemanager.cs: Locate the decimal constructor.
13451
13452 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
13453
13454         * attribute.cs: use the new property of TypeOf.
13455         * expression.cs: added 'get' property around typearg.
13456
13457         These changes fix a build breaker reported by NickD. Is this the
13458         correct way to fix?  If not, please, revert my changes and make it
13459         work :-).
13460
13461 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
13462
13463         * attribute.cs: Add support for typeof in attribute invocations.
13464         I am not sure that this is right though.
13465
13466 2002-04-14  Duncan Mak  <duncan@ximian.com>
13467
13468         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
13469         Binary.Operator.Division case.
13470
13471 2002-04-13  Ravi Pratap  <ravi@ximian.com>
13472
13473         * class.cs (DefineType): Ensure that we do a proper check on
13474         attribute types and also register it with the TypeManager.
13475
13476         (TypeContainer.Targets): The default for attribute types is
13477         AttributeTargets.All.
13478
13479         * attribute.cs (ApplyAttributes): Registering the attribute type
13480         is done elsewhere, not when we discover we have a Usage attribute.
13481
13482 2002-04-12  Ravi Pratap  <ravi@ximian.com>
13483
13484         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
13485         and get rid of is_delegate parameter.
13486
13487         * everywhere : update.
13488
13489 2002-04-12  Ravi Pratap  <ravi@ximian.com>
13490
13491         * cs-parser.jay (compilation_unit): Revamp completely to use
13492         some new ideas that I got from Rhys' grammar to solve the problems
13493         with assembly level attributes.
13494
13495         (outer_declaration): New grammar production.
13496
13497         (attribute_sections): Add.
13498
13499         (opt_attributes): Base on attribute_sections
13500
13501         (namespace_declaration): Allow opt_attributes to tackle the case
13502         when we have assembly level attributes - we are clever in this
13503         regard now ;-)
13504
13505         * attribute.cs (ApplyAttributes): Do not worry about assembly 
13506         attributes in the non-global context.
13507
13508         * rootcontext.cs (AddGlobalAttributes): Go back to using this
13509         instead of SetGlobalAttributes.
13510
13511         * class.cs, rootcontext.cs : Ensure we define and generate 
13512         attribute types before anything else.
13513
13514         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
13515         and flag the new error -20 for the case when the attribute type
13516         does not have valid targets specified. csc does not catch this.
13517
13518         * ../errors/errors.txt : update for error # -20
13519
13520 2002-04-11  Ravi Pratap  <ravi@ximian.com>
13521
13522         * support.cs (InternalParameters.ParameterModifier): Do some null
13523         checking and return sane values.
13524
13525         * class.cs (Method.Define): If we are a PInvoke method, ensure
13526         that we are static and extern. Report error # 601
13527
13528         * ../errors/cs0601.cs : Add test case for the above error.
13529
13530 2002-04-07  Ravi Pratap  <ravi@ximian.com>
13531
13532         * rootcontext.cs (attribute_types): We need to keep type of
13533         all attribute types separately and emit code for them first.
13534
13535         (RegisterAttribute) : Implement.
13536
13537         * class.cs (DefineType): Check if the current Type is a custom
13538         attribute type and register it accordingly.
13539
13540         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
13541         adding the first attribute twice and rename to
13542
13543         (SetGlobalAttributes): this.
13544
13545         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
13546         lookups.
13547
13548         * attribute.cs (ApplyAttributes): Take an additional argument telling us
13549         if we are processing global arguments. Hmm, I am unsure of this.
13550
13551 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
13552
13553         * expression.cs: added static array of strings to avoid calling
13554         Enum.ToString () for Operator in Binary. Significant recover of
13555         performance.
13556
13557 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
13558
13559         * class.cs (FindMembers): Allow the Builders of the various
13560         members to be null.  If they are skip them.  This only happens
13561         during the PInvoke declaration.
13562
13563 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
13564
13565         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
13566         failure, so we do not keep going afterwards.
13567
13568         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
13569         wanted to pass `false' as the `is_delegate' argument.  If this is
13570         the case, why not use delegate_type == null to mean `is_delegate =
13571         false' and anything else as is_delegate = true.
13572
13573 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
13574
13575         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
13576         code for the section, not the beginning of the tests.
13577
13578 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
13579
13580         * cfold.cs: Handle operator + (Enum x, Underlying x) 
13581
13582         * expression.cs (Binary): same.  Warn about errors where we have
13583         Enum/Enum in operator + as well.
13584
13585 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
13586
13587         * statement.cs:
13588                 - added support for switch(bool)
13589                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
13590                 - add TableSwitchEmit() to handle table-based switch statements
13591
13592 2002-04-05  Ravi Pratap  <ravi@ximian.com>
13593
13594         * expression.cs (Invocation.OverloadResolve): Factor out code which
13595         does parameter compatibility checking with arguments so that we can 
13596         re-use the code even from Delegate.VerifyApplicability
13597
13598         (VerifyArgumentsCompat): Move above code here.
13599
13600         * delegate.cs (VerifyApplicability): Get rid of duplicate code
13601         and instead make a call to the above method.
13602
13603 2002-03-31  Ravi Pratap  <ravi@ximian.com>
13604
13605         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
13606         We use it to keep track of classes which are attribute types.
13607
13608 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
13609
13610         * delegate.cs (Delegate.Define): Correctly define the types in the
13611         presence of fixed and array parameters.
13612
13613         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
13614         doing FindMembers.
13615
13616         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
13617         include NonPublic after the first iteration.
13618
13619         * class.cs (Indexer.CheckBase): Only check if both parents are
13620         non-null. 
13621
13622         * cs-parser.jay (accessor_body): If empty, set to null.
13623
13624         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
13625         same code path here to resolve constants names that we did have in
13626         MemberAccess.DoResolve.  There is too much code duplicated here.
13627
13628 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
13629
13630         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
13631
13632         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
13633         to MakeUnionSet.
13634
13635         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
13636         tokens, numbers and strings.
13637
13638         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
13639         parenthesis.
13640
13641         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
13642         asyncronous parameters and the regular parameters.  
13643
13644         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
13645         specify the target directory.
13646
13647         * expression.cs: (This.DoResolve): Simplify
13648         (As.Emit): Optimize, do not generate IsInst if the expression is
13649         always of the given type.
13650
13651         (Is.DoResolve): Bug fix, we were reporting both always/never for
13652         the is expression.
13653
13654         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
13655         creating too many unnecessary arrays.
13656
13657 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
13658
13659         * class.cs (EmitFieldInitializer): Use Assign expression to assign
13660         fields instead of rolling our own initializer.   Takes care of all
13661         implicit conversions, and drops unnecessary static checks/argument.
13662
13663 2002-03-31  Dick Porter  <dick@ximian.com>
13664
13665         * driver.cs: use the GetDirectories() return values properly, and
13666         use "/" as path separator.
13667
13668 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
13669
13670         * expression.cs (Unary): Optimize - - expr into expr.
13671         (Binary): Optimize a + (-b) into a -b.
13672
13673         * codegen.cs (CodeGen): Made all methods static.
13674
13675 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
13676
13677         * rootcontext.cs: 
13678
13679         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
13680         TypeBuilder property.
13681
13682         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
13683         instead. 
13684
13685         * tree.cs: Removed the various RecordXXXX, and replaced with a
13686         single RecordDecl.  Removed all the accessor methods, and just
13687         left a single access point Type 
13688
13689         * enum.cs: Rename DefineEnum to DefineType.
13690
13691         * decl.cs: New abstract method `DefineType' used to unify the
13692         Defines for Enumerations, Interfaces, TypeContainers and
13693         Delegates.
13694
13695         (FindType): Moved LookupInterfaceOrClass here.  Moved the
13696         LookupBaseClasses method that used to live in class.cs and
13697         interface.cs here, and renamed to FindType.
13698
13699         * delegate.cs: Implement DefineType.  Take advantage of the
13700         refactored pattern for locating the parent builder without taking
13701         the parent_builder argument (which we know does not work if we are
13702         nested, and triggering a toplevel definition).
13703
13704 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
13705
13706         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
13707         accessibility of a member has changed during override and report
13708         an error if so.
13709
13710         * class.cs (Method.Define, Property.Define): Only complain on
13711         overrides if the method is private, any other accessibility is
13712         fine (and since we just checked the permission is the same, we are
13713         good to go).
13714
13715         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
13716         and elif are processed always.  The other pre-processing
13717         directives are only processed if we are "taking" the path
13718
13719 2002-03-29  Martin Baulig  <martin@gnome.org>
13720
13721         * class.cs (Method.Emit): Only emit symbolic debugging info if the
13722         current location is not Null.
13723
13724         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
13725         a separate method so we can profile it.
13726
13727         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
13728         `span.Seconds' are just seconds, but no minutes or hours.
13729         (MainDriver): Profile the CodeGen.SaveSymbols calls.
13730
13731 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
13732
13733         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
13734         Remove the gratuitous set of Final:
13735
13736                                 // If an interface implementation, then we can set Final.
13737                                 if (((flags & MethodAttributes.Abstract) == 0) &&
13738                                     implementing.DeclaringType.IsInterface)
13739                                         flags |= MethodAttributes.Final;
13740
13741         I do not know what I was smoking when I used that.
13742
13743
13744         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
13745         step into fixing the name resolution issues for delegates and
13746         unifying the toplevel name resolution.
13747
13748 2002-03-28  Martin Baulig  <martin@gnome.org>
13749
13750         * class.cs (Method.Emit): If we have a symbol writer, call its
13751         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
13752         tell it about the current method.
13753
13754         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
13755         writer that we're going to emit the first byte of IL code for a new
13756         statement (a new source line).
13757         (EmitContext.EmitTopBlock): If we have a symbol writer, call
13758         EmitContext.Mark() before emitting any code.
13759
13760         * location.cs (SymbolDocument): Return null when we're Null.
13761
13762         * statement.cs (Statement): Moved the `Location loc' variable here.
13763         (Statement.EmitBoolExpression): If we have a symbol writer, call
13764         ec.Mark() before emitting any code to tell it that we're at the
13765         beginning of a new statement.
13766         (StatementExpression): Added `Location' argument to the constructor.
13767         (Block): Added public readonly variable `StartLocation' and public
13768         variable `EndLocation'.  The latter is to be set using SetEndLocation().
13769         (Block): Added constructor which takes a start and end location.
13770         (Block.SetEndLocation): New method. This sets the end location.
13771         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
13772         local variables we create.
13773         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
13774         each statement and do also mark the begin and end of the block.
13775
13776         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
13777         tell it the current lexer.Location, use Location.Null for the end of the
13778         block.
13779         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
13780         current block, set its end location using SetEndLocation().
13781         (statement_expression): StatementExpression constructor now takes the
13782         lexer.Location as additional argument.
13783         (for_statement, declare_local_variables): Likewise.
13784         (declare_local_variables): When creating a new implicit block, use the
13785         new Block constructor and pass it the lexer.Location.
13786
13787 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
13788
13789         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
13790         members also on the parent interfaces recursively.
13791
13792 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
13793
13794         * report.cs: Use new formats, since Gonzalo finished the missing
13795         bits. 
13796
13797         * expression.cs (Binary.ResolveOperator): added missing operator|
13798         operator& and operator^ for bool/bool.
13799
13800         * cs-parser.jay: CheckDef now takes a Location argument that is
13801         used to report errors more precisly (instead of reporting the end
13802         of a definition, we try to track something which is a lot closer
13803         to the source of the problem).
13804
13805         * cs-tokenizer.cs: Track global token use, so we can properly flag
13806         the use of #define/#undef after the first token has been seen.
13807
13808         Also, rename the reportXXXX to Error_DescriptiveName
13809
13810         * decl.cs (DeclSpace.IsTopLevel): Move property here from
13811         TypeContainer, so that Enum and Interface can use this too.
13812
13813         * class.cs (TypeContainer.LookupInterfaceOrClass,
13814         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
13815         `builder' argument.  Typically this was used to pass the parent
13816         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
13817         the definition).  
13818
13819         The problem is that a nested class could trigger the definition of
13820         a toplevel class, and the builder would be obviously wrong in that
13821         case. 
13822
13823         So we drop this argument, and we compute dynamically the
13824         TypeBuilder/ModuleBuilder (the correct information was available
13825         to us anyways from DeclSpace.Parent)
13826
13827         * interface.cs (Interface.DefineInterface): Drop builder
13828         parameter cleanup like class.cs
13829
13830         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
13831         like class.cs
13832
13833         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
13834         values. 
13835
13836         (Try.Emit): Propagate the returns value from the statement.
13837
13838         (Return.Emit): Even if we are leavning 
13839
13840         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
13841
13842         * modifiers.cs: Fix the computation of MethodAttributes flags.
13843
13844 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
13845
13846         * driver.cs: allow compilation of files that start with '/'.
13847         Add a default case when checking the argument of --target.
13848
13849 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
13850
13851         * interface.cs: Implement the same search algorithm for types in
13852         the interface code.
13853
13854         * delegate.cs: Do not allow multiple definition.
13855
13856         * Recovered ChangeLog that got accidentally amputated
13857
13858         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
13859
13860         * rootcontext.cs: Load manually enum to allow core classes to
13861         contain enumerations.
13862
13863         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
13864         Update to new static methods in TypeManager.
13865
13866         * typemanager.cs (GetMethod, GetConstructor): Use our
13867         implementation of FindMembers to find the members, since during
13868         corlib compilation, the types are TypeBuilders and GetMethod and
13869         GetConstructor do not work.
13870
13871         Make all methods in TypeManager static.
13872
13873         (InitCodeHelpers): Split the functionality from
13874         the InitCodeTypes function.
13875
13876         * driver.cs: Call InitCodeHelpers after we have populated the
13877         types. 
13878
13879         * cs-parser.jay (delegate_declaration): we did not used to compute
13880         the delegate name correctly for void delegates.
13881
13882 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
13883
13884         * rootcontext.cs (RootContext): Init the interface_resolve_order
13885         and type_container_resolve_order always.
13886
13887         (ResolveCore, BootstrapCorlib_ResolveClass,
13888         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
13889         compiler when compiling with --nostdlib
13890
13891         * class.cs (TypeContainer.DefineType): Check that our parent is
13892         not null.  This test is most important when we are bootstraping
13893         the core types.
13894
13895         * codegen.cs: Split out the symbol writing code.
13896
13897 2002-03-25  Martin Baulig  <martin@gnome.org>
13898
13899         * driver.cs (-g): Made -g an alias for --debug.
13900
13901 2002-03-24  Martin Baulig  <martin@gnome.org>
13902
13903         * codegen.cs (SymbolWriter): New public variable. Returns the
13904         current symbol writer.
13905         (CodeGen): Added `bool want_debugging_support' argument to the
13906          constructor. If true, tell the ModuleBuild that we want debugging
13907         support and ask it for the ISymbolWriter.
13908         (Save): If we have a symbol writer, call it's Close() method after
13909         saving the assembly.
13910
13911         * driver.c (--debug): New command line argument to create a
13912         debugger information file.
13913
13914         * location.cs (SymbolDocument): New public property. Returns an
13915         ISymbolDocumentWriter object for the current source file or null
13916         if we don't have a symbol writer.
13917
13918 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
13919
13920         * driver.cs (LoadAssembly): Correctly return when all the paths
13921         have been tried and not before.
13922
13923         * statement.cs (Switch.Emit): return the actual coverage for this
13924         statement (returns/not-returns)
13925
13926         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
13927         switch of the statement if we are the last switch section.  That
13928         kills two problems: try/catch problems (we used to emit an empty
13929         nop at the end) and switch statements where all branches would
13930         return. 
13931
13932 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
13933
13934         * driver.cs: Add default assemblies (the equivalent to the
13935         Microsoft CSC.RSP file)
13936
13937         * cs-tokenizer.cs: When updating `cols and setting it to zero,
13938         also update tokens_seen and set it to false.
13939
13940         * driver.cs: Implement --recurse for Mike.
13941
13942         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
13943         correctly splitting out the paths.
13944
13945 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
13946
13947         * interface.cs (Interface.PopulateProperty): Instead of using
13948         `parent' as the declaration space for the set parameters, use
13949         `this' 
13950
13951         * support.cs (InternalParameters): InternalParameters constructor
13952         takes a DeclSpace instead of a TypeContainer.
13953
13954         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
13955         types are being initialized, load the address of it before calling
13956         the function.  
13957
13958         (New): Provide a mechanism to disable the generation of local
13959         value type temporaries when the caller will be providing us with
13960         an address to store it.
13961
13962         (ArrayCreation.EmitDynamicInitializers): Use it.
13963
13964 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
13965
13966         * expression.cs (Invocation.EmitArguments): Only probe for array
13967         property if there is more than one argument.  Sorry about that.
13968
13969         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
13970         empty param arrays.
13971
13972         * class.cs (Method.LabelParameters): Fix incorrect code path that
13973         prevented the `ParamArrayAttribute' from being applied to the
13974         params attribute.
13975
13976 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
13977
13978         * support.cs (ReflectionParameters): Correctly compute whether the
13979         last argument is a params array.  Fixes the problem with
13980         string.Split ('a')
13981
13982         * typemanager.cs: Make the assemblies array always be non-null
13983         (empty, but non-null)
13984
13985         * tree.cs (RecordDecl): New function that abstracts the recording
13986         of names.  This reports error 101, and provides a pointer to the
13987         previous declaration.  Fixes a crash in the compiler.
13988
13989         * cs-parser.jay (constructor_declaration): Update to new grammar,
13990         and provide a constructor_body that can be empty.
13991
13992 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
13993
13994         * driver.cs: Add support for --resources.
13995
13996         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
13997         Make all types for the various array helper methods be integer.
13998
13999         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
14000         CheckState to ConvCast.
14001
14002         (ConvCast): Now it takes a `checked' state argument, to avoid
14003         depending on the emit context for the conversion, and just using
14004         the resolve time setting.
14005
14006         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
14007         instead of Invocation.EmitArguments.  We do not emit the original
14008         arguments, instead we emit those which have been converted to
14009         unsigned int expressions.
14010
14011         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
14012
14013         * codegen.cs: ditto.
14014
14015         * expression.cs (LocalVariableReference): Drop the use of the
14016         Store function that depended on the variable index.
14017
14018         * statement.cs (VariableInfo): Drop the `Idx' property from this
14019         class, as this is not taking into account the indexes for
14020         temporaries tat we generate during the execution, getting the
14021         indexes wrong.
14022
14023         * class.cs: First emit class initializers, then call the parent
14024         constructor. 
14025
14026         * expression.cs (Binary): Fix opcode emision.
14027         (UnaryMutator.EmitCode): Support checked code generation
14028
14029         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
14030         matches for events for both the Static and Instance scans,
14031         pointing to the same element.   Fix that.
14032
14033 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
14034
14035         * rootcontext.cs (ResolveTree): Always set the
14036         interface_resolve_order, because nested interfaces will be calling
14037         into us.
14038
14039         * class.cs (GetInterfaceOrClass): Track the same resolution
14040         process used by TypeManager.LookupType.  This fixes the nested
14041         type lookups in class declarations (separate path from
14042         LookupType). 
14043
14044         (TypeContainer.DefineType): Also define nested interfaces.
14045         (TypeContainer.RegisterOrder): New public function used to
14046         register the order in which child interfaces need to be closed.
14047
14048         Nested interfaces need to be closed after their parents have been
14049         created. 
14050
14051         * interface.cs (InterfaceAttr): Put all the logic for computing
14052         the interface attribute here. 
14053
14054         (DefineInterface): Register our interface order with the
14055         RootContext or with the TypeContainer depending on the case.
14056
14057 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
14058
14059         * cs-parser.jay: rework foreach statement to work with the new
14060         changes to the policy on SimpleNames.
14061
14062         * report.cs: support Stacktrace on warnings as well.
14063
14064         * makefile: drop --unsafe and /unsafe from the compile.
14065
14066 2002-03-13  Ravi Pratap  <ravi@ximian.com>
14067
14068         * ecore.cs (StandardConversionExists): Modify to take an Expression
14069         as the first parameter. Ensure we do null -> reference type conversion
14070         checking.
14071
14072         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
14073         temporary Expression objects.
14074
14075 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
14076
14077         * interface.cs: workaround bug in method overloading resolution
14078         (there is already a bugzilla bug for it).
14079
14080 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
14081
14082         We could also solve this problem by having a separate path for
14083         performing type lookups, instead of DoResolve, we could have a
14084         ResolveType entry point, and only participating pieces of the
14085         production (simplename, deref, array) would implement this. 
14086
14087         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
14088         signal SimpleName to only resolve type names and not attempt to
14089         resolve anything else.
14090
14091         * expression.cs (Cast): Set the flag.
14092
14093         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
14094
14095         * class.cs: Only report 108 if there is no `new' modifier.
14096
14097         * cs-parser.jay: rework foreach statement to work with the new
14098         changes to the policy on SimpleNames.
14099         
14100         * report.cs: support Stacktrace on warnings as well.
14101
14102         * makefile: drop --unsafe and /unsafe from the compile.
14103
14104 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
14105
14106         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
14107         lookups here, instead of doing that at parse time.  This means
14108         that our grammar will not introduce `LocalVariableReferences' as
14109         expressions at this point.  That solves the problem of code like
14110         this:
14111
14112         class X {
14113            static void Main ()
14114            { int X = 1;
14115             { X x = null }}}
14116
14117         This is only half the fix.  The full fix requires parameters to
14118         also be handled in this way.
14119
14120         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
14121         makes the use more obvious of the DeclSpace.  The
14122         ec.TypeContainer.TypeBuilder is now only used to pull the
14123         TypeBuilder for it.
14124
14125         My theory is that I can get rid of the TypeBuilder completely from
14126         the EmitContext, and have typecasts where it is used (from
14127         DeclSpace to where it matters).  
14128
14129         The only pending problem is that the code that implements Aliases
14130         is on TypeContainer, and probably should go in DeclSpace.
14131
14132         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
14133         lookups here, instead of doing that at parse time.  This means
14134         that our grammar will not introduce `LocalVariableReferences' as
14135         expressions at this point.  That solves the problem of code like
14136         this:
14137
14138         class X {
14139            static void Main ()
14140            { int X = 1;
14141             { X x = null }}}
14142
14143         This is only half the fix.  The full fix requires parameters to
14144         also be handled in this way.
14145
14146         * class.cs (Property.DefineMethod): When implementing an interface
14147         method, set newslot, when implementing an abstract method, do not
14148         set the flag (before we tried never setting it, or always setting
14149         it, which is the difference).
14150         (Indexer.DefineMethod): same.
14151         (Method.DefineMethod): same.
14152
14153         * ecore.cs: Only set the status used flag if we get back a Field.
14154
14155         * attribute.cs: Temporary hack, so Paolo can keep working.
14156
14157 2002-03-08  Ravi Pratap  <ravi@ximian.com>
14158
14159         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
14160         the unmanaged type in the case we have a MarshalAs attribute.
14161
14162         (Resolve): Handle the case when we are parsing the special MarshalAs
14163         attribute [we need to store the unmanaged type to use later]
14164
14165         * typemanager.cs (marshal_as_attr_type): Built in type for the 
14166         MarshalAs Attribute.
14167
14168         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
14169         on parameters and accordingly set the marshalling info.
14170
14171 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
14172
14173         * class.cs: Optimizing slightly by removing redundant code after
14174         we switched to the `NoTypes' return value.
14175         (Property.DefineMethod): use NoTypes here too.
14176
14177         This fixes the bug I introduced in my last batch of changes.
14178
14179 2002-03-05  Ravi Pratap  <ravi@ximian.com>
14180
14181         * tree.cs (RecordEnum): Add. We now keep track of enums too.
14182
14183         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
14184         Enums since those are types too. 
14185
14186         * cs-parser.jay (enum_declaration): Record enums as we parse them.
14187
14188         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
14189         thanks to a call during the lookup process.
14190
14191 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
14192
14193         * statement.cs (Foreach): Lots of work to accomodate a particular
14194         kind of foreach statement that I had not kept in mind.  It is
14195         possible to have foreachs on classes that provide a GetEnumerator
14196         method that return objects that implement the "pattern" for using
14197         a foreach, there is no need to support GetEnumerator
14198         specifically. 
14199
14200         This is needed to compile nant.
14201
14202         * decl.cs: Only report 114 if the member is not `Finalize' and if
14203         the warning level is at least 2.
14204
14205         * class.cs: Moved the compare function from Method to
14206         MethodSignature. 
14207
14208         (MethodSignature.InheritableMemberSignatureCompare): Add new
14209         filter function that is used to extract inheritable methods from a
14210         class. 
14211
14212         (Method.Define): Use the new `inheritable_method_signature_filter'
14213         delegate
14214
14215         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
14216         command. 
14217
14218 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
14219
14220         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
14221
14222         * cs-parser.jay: Add opt_semicolon to the interface declaration.
14223
14224         * expression.cs: Pass location information to
14225         ConvertImplicitStandard. 
14226
14227         * class.cs: Added debugging code to track return values from
14228         interfaces. 
14229
14230 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
14231
14232         * expression.cs (Is.DoResolve): If either side of the `is' is an
14233         interface, do not flag the warning.
14234
14235         * ecore.cs (ImplicitReferenceConversion): We need a separate test
14236         for interfaces
14237
14238         * report.cs: Allow for --fatal to be used with --probe.
14239
14240         * typemanager.cs (NoTypes): Move the definition for the empty Type
14241         array here. 
14242
14243         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
14244         properties. 
14245         (TypeContainer.DefineProxy): New function used to proxy to parent
14246         implementations when implementing interfaces.
14247         (TypeContainer.ParentImplements): used to lookup if our parent
14248         implements a public function that is required by an interface.
14249         (TypeContainer.VerifyPendingMethods): Hook this up.
14250
14251         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
14252         `modules' and `assemblies' arraylists into arrays.  We only grow
14253         these are the very early start up of the program, so this improves
14254         the speedof LookupType (nicely measured).
14255
14256         * expression.cs (MakeByteBlob): Replaced unsafe code with
14257         BitConverter, as suggested by Paolo.
14258
14259         * cfold.cs (ConstantFold.Binary): Special case: perform constant
14260         folding of string concatenation, but if either side is a string,
14261         and the other is not, then return null, and let the runtime use
14262         the concatenation on the string plus the object (using
14263         `Object.ToString'). 
14264
14265 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
14266
14267         Constant Folding has been implemented now.
14268
14269         * expression.cs (Unary.Reduce): Do not throw an exception, catch
14270         the error instead on types that are not supported in one's
14271         complement. 
14272
14273         * constant.cs (Constant and all children): New set of functions to
14274         perform implict and explicit conversions.
14275
14276         * ecore.cs (EnumConstant): Implement the new functions to perform
14277         conversion by proxying to the child expression.
14278
14279         * codegen.cs: (ConstantCheckState): Constant evaluation has its
14280         own separate setting that can not be turned off from the command
14281         line using --unchecked or --checked and is only controlled using
14282         the checked/unchecked statements and expressions.  This setting is
14283         used by the constant folder to flag errors.
14284
14285         * expression.cs (CheckedExpr, UncheckedExpr): Set the
14286         ConstantCheckState as well.   
14287
14288         During Resolve, they also have to flag the state, because the
14289         constant folder runs completely in the Resolve phase.
14290
14291         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
14292         well.
14293
14294 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
14295
14296         * cfold.cs: New file, this file contains the constant folder.
14297
14298         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
14299         argument to track whether we are using the resulting address to
14300         load or store a value and provide better error messages. 
14301
14302         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
14303         new AddressOf arguments.
14304
14305         * statement.cs (Foreach.EmitCollectionForeach): Update
14306
14307         * expression.cs (Argument.Emit): Call AddressOf with proper
14308         arguments to track usage.
14309
14310         (New.DoEmit): Call AddressOf with new arguments.
14311
14312         (Unary.Emit): Adjust AddressOf call.
14313
14314 2002-03-01  Ravi Pratap  <ravi@ximian.com>
14315
14316         * cs-parser.jay (member_access): Change the case for pre-defined types
14317         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
14318         this suggestion.
14319
14320         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
14321         a method body.
14322
14323         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
14324         essentially like methods and apply attributes like MethodImplOptions to them too.
14325
14326         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
14327         not being null.
14328
14329         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
14330         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
14331         is the DeclSpace.
14332
14333         * Update code everywhere accordingly.
14334
14335         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
14336
14337         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
14338
14339 2002-02-28  Ravi Pratap  <ravi@ximian.com>
14340
14341         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
14342         try performing lookups against those instead of jumping straight into using
14343         the 'using' clauses.
14344
14345         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
14346
14347         (LookupType): Perform lookups in implicit parents too.
14348
14349         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
14350         sequence as RootContext.LookupType. 
14351
14352         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
14353         the various cases of namespace lookups into this method.
14354
14355 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
14356
14357         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
14358         in positional arguments)
14359
14360         * class.cs (Operator): Update the AllowedModifiers to contain
14361         extern. 
14362
14363         * cs-parser.jay: Update operator declaration to allow for the
14364         operator body to be empty.
14365
14366         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
14367         values. 
14368
14369 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
14370
14371         * class.cs (Method.Emit): Label parameters.
14372
14373         * driver.cs: Return 1 or 0 as the program exit code.
14374
14375 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
14376
14377         * expression.cs: Special case the `null' object when trying to
14378         auto-compute the type, as anything can be explicitly converted to
14379         that. 
14380
14381         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
14382         spotting this Paolo.
14383
14384         (Expression.ImplicitNumericConversion): Perform comparissions of
14385         the type using the underlying type in the case of an enumeration
14386         rather than using the enumeration type for the compare.
14387
14388         Cope with the underlying == type case, which is not possible to
14389         catch before. 
14390
14391         (Expression.ConvertNumericExplicit): Perform comparissions of
14392         the type using the underlying type in the case of an enumeration
14393         rather than using the enumeration type for the compare.
14394
14395         * driver.cs: If the user does not supply an extension, assume .exe
14396
14397         * cs-parser.jay (if_statement): Rewrote so that we can track the
14398         location for the if statement.
14399
14400         * expression.cs (Binary.ConstantFold): Only concat strings when
14401         the operation is "+", not everything ;-)
14402
14403         * statement.cs (Statement.EmitBoolExpression): Take a location
14404         argument. 
14405         (If, While, Do): Track location.
14406
14407         * expression.cs (Binary.ResolveOperator): In the object + string
14408         case, I was missing a call to ConvertImplicit
14409
14410 2002-02-25  Ravi Pratap  <ravi@ximian.com>
14411
14412         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
14413         Location arguments. Ensure we use RootContext.LookupType to do our work
14414         and not try to do a direct Type.GetType and ModuleBuilder.GetType
14415
14416         * interface.cs (PopulateMethod): Handle the type of the parameter being
14417         null gracefully.
14418
14419         * expression.cs (Invocation.BetterFunction): Handle the case when we 
14420         have a params method with no fixed arguments and a call is made with no
14421         arguments.
14422
14423 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
14424
14425         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
14426         the verbatim-string-literal
14427
14428         * support.cs (InternalParameters.ParameterModifier): handle null
14429         fixed parameters.
14430         (InternalParameters.ParameterType): ditto.
14431
14432         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
14433         duplicating the name of the variable parameter.
14434         (GetParameterByName): Fix bug where we were not looking up array
14435         paramters if they were the only present (thanks Paolo!).
14436         (GetParameterInfo): We only have an empty set of types if both
14437         fixed and array are set to null.
14438         (GetParameterInfo-idx): Handle FixedParameter == null
14439
14440         * cs-parser.jay: Handle the case where there is no catch
14441         statements (missing null test).
14442
14443 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
14444
14445         * driver.cs (MainDriver): Be conservative on our command line
14446         handling.
14447
14448         Catch DirectoryNotFoundException when calling GetFiles.
14449
14450         (SplitPathAndPattern): Used to split the input specification into
14451         a path and a pattern that we can feed to Directory.GetFiles.
14452
14453 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
14454
14455         * statement.cs (Fixed): Implement the last case of the Fixed
14456         statement (string handling).
14457
14458         * expression.cs (StringPtr): New class used to return a char * to
14459         a string;  Used by the Fixed statement.
14460
14461         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
14462
14463         * expression.cs (Binary.ResolveOperator): Remove redundant
14464         MemberLookup pn parent type.
14465         Optimize union call, we do not need a union if the types are the same.
14466         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
14467         type.
14468
14469         Specialize the use of MemberLookup everywhere, instead of using
14470         the default settings. 
14471
14472         (StackAlloc): Implement stackalloc keyword.
14473
14474         * cs-parser.jay: Add rule to parse stackalloc.
14475
14476         * driver.cs: Handle /h, /help, /?
14477
14478         * expression.cs (MakeByteBlob): Removed the hacks we had in place
14479         before we supported unsafe code.
14480
14481         * makefile: add --unsafe to the self compilation of mcs.
14482
14483 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
14484
14485         * expression.cs (PointerArithmetic): New class that is used to
14486         perform pointer arithmetic.
14487         (Binary.Resolve): Handle pointer arithmetic
14488         Handle pointer comparission.
14489         (ArrayPtr): Utility expression class that is used to take the
14490         address of an array.
14491
14492         (ElementAccess): Implement array access for pointers
14493
14494         * statement.cs (Fixed): Implement fixed statement for arrays, we
14495         are missing one more case before we are done.
14496
14497         * expression.cs (Indirection): Implement EmitAssign and set the
14498         ExprClass to Variable.  This allows pointer dereferences to be
14499         treated as variables, and to have values assigned to them.
14500
14501         * ecore.cs (Expression.StoreFromPtr): New utility function to
14502         store values dereferencing.
14503
14504 2002-02-20  Ravi Pratap  <ravi@ximian.com>
14505
14506         * expression.cs (Binary.ResolveOperator): Ensure that we are
14507         not trying to operate on a void type - this fixes the reported
14508         bug.
14509
14510         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
14511         the parent implementation is sealed.
14512
14513         * ../errors/cs0239.cs : Add.
14514
14515         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
14516
14517         * typemanager.cs (unverifiable_code_type): Corresponds to 
14518         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
14519         which have unsafe code in them.
14520
14521         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
14522         unsafe context.
14523
14524 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
14525
14526         * cs-tokenizer.cs: Add support for @"litreal strings"
14527
14528         Make tokenizer accept pre-processor directives
14529         on any column (remove the old C-like limitation). 
14530
14531         * rootcontext.cs (EmitCode): Emit any global attributes.
14532         (AddGlobalAttributes): Used to keep track of assembly attributes. 
14533
14534         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
14535
14536         * cs-parser.jay: Add support for global attributes.  
14537
14538 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
14539
14540         * expression.cs (Indirection): New helper class.  Unary will
14541         create Indirection classes to be able to implement the
14542         IMemoryLocation interface on it.
14543
14544 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
14545
14546         * cs-parser.jay (fixed_statement): reference the right statement.
14547
14548         * statement.cs (Fixed.Emit): Finish implementing the fixed
14549         statement for the &x case.
14550
14551 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
14552
14553         * class.cs (Property.Define, Method.Define): Remove newslot when
14554         `implementing'.  
14555
14556         * modifiers.cs: My use of NewSlot when `Abstract' was set was
14557         wrong.  NewSlot should only be used if the `new' keyword is present.
14558
14559         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
14560         locating our system dir.  Sorry about this.
14561
14562 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
14563
14564         * driver.cs (GetSystemDir): Compute correctly the location of our
14565         system assemblies.  I was using the compiler directory instead of
14566         the library directory.
14567
14568 2002-02-13  Ravi Pratap  <ravi@ximian.com>
14569
14570         * expression.cs (BetterFunction): Put back in what Miguel commented out
14571         since it is the correct fix. The problem is elsewhere ;-)
14572
14573         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
14574         parameters of the parms method are themselves compatible or not !
14575
14576         (StandardConversionExists): Fix very dangerous bug where we were forgetting
14577         to check that a class implements an interface before saying that an implicit
14578         conversion was allowed. Use ImplementsInterface to do the checking.
14579
14580 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
14581
14582         * class.cs (Method.Define): Track whether we are an explicit
14583         implementation or not.  And only call DefineMethodOverride if we
14584         are an explicit implementation.
14585
14586         (Property.DefineMethod): Ditto.
14587
14588 2002-02-11  Ravi Pratap  <ravi@ximian.com>
14589
14590         * expression.cs (BetterFunction): Catch hideous bug which was
14591          preventing us from detecting ambiguous calls due to implicit casts i.e
14592         cs0121.
14593
14594 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
14595
14596         * support.cs (Pair): Remove un-needed method.  I figured why I was
14597         getting the error in cs-parser.jay, the variable in a foreach loop
14598         is readonly, and the compiler does not really treat this as a variable.
14599
14600         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
14601         instead of EQUALS in grammar.  
14602
14603         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
14604
14605         * expression.cs (Unary.DoResolve): Check whether the argument is
14606         managed or not.
14607
14608 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
14609
14610         * support.cs: Api for Pair to set a value.  Despite the fact that
14611         the variables are public the MS C# compiler refuses to compile
14612         code that accesses the field if the variable is part of a foreach
14613         statement. 
14614
14615         * statement.cs (Fixed): Begin implementation of the fixed
14616         statement.
14617
14618         (Block.AddVariable): Return the VariableInfo on success and null
14619         on failure instead of true/false. 
14620
14621         * cs-parser.jay (foreach): Catch errors on variables already
14622         defined (we were ignoring this value before) and properly unwind
14623         the block hierarchy
14624
14625         (fixed_statement): grammar for the fixed statement.
14626
14627 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
14628
14629         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
14630         pointer types to be incretemented.
14631
14632         (SizeOf): Implement.
14633
14634         * cs-parser.jay (pointer_member_access): Implement
14635         expr->IDENTIFIER production.
14636
14637         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
14638         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
14639         on safe contexts.
14640
14641         (Unary): Implement indirection.
14642
14643         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
14644         use in non-unsafe context).
14645
14646         (SimpleName.DoResolve): Check for pointers in field access on safe
14647         contexts. 
14648
14649         (Expression.LoadFromPtr): Factor the load-indirect code in this
14650         function.  This was duplicated in UnboxCast and ParameterReference
14651
14652 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
14653
14654         * expression.cs (ComposedCast): report an error if a pointer cast
14655         is used in a safe region.
14656
14657         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
14658         pointer type casts in unsafe context.
14659
14660         * codegen.cs (EmitContext): Set up IsUnsafe.
14661
14662         * cs-parser.jay (non_expression_type): Add productions for pointer
14663         casts. 
14664
14665         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
14666         code.  We should not use force into static mode if the method is
14667         not virtual.  Fixes bug in MIS
14668
14669         * statement.cs (Do.Emit, While.Emit, For.Emit,
14670         Statement.EmitBoolExpression): Add support to Do and While to
14671         propagate infinite loop as `I do return' semantics.
14672
14673         Improve the For case to also test for boolean constants.
14674
14675         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
14676         to the list of attributes we can add.
14677
14678         Remove `EmitContext' argument.
14679
14680         * class.cs (Method.Define): Apply parameter attributes.
14681         (Constructor.Define): Apply parameter attributes.
14682         (MethodCore.LabelParameters): Move here the core of labeling
14683         parameters. 
14684
14685         * support.cs (ReflectionParameters.ParameterModifier,
14686         InternalParameters.ParameterModifier): Use IsByRef on the type and
14687         only return the OUT bit for these parameters instead of in/out/ref
14688         flags.
14689
14690         This is because I miss-understood things.  The ParameterInfo.IsIn
14691         and IsOut represent whether the parameter has the [In] and [Out]
14692         attributes set.  
14693
14694 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
14695
14696         * ecore.cs (FieldExpr.Emit): Release temporaries.
14697
14698         * assign.cs (LocalTemporary.Release): new function.
14699
14700         * codegen.cs (EmitContext.GetTemporaryStorage,
14701         EmitContext.FreeTemporaryStorage): Rework the way we deal with
14702         temporary storage.  Now we can "put back" localbuilders when we
14703         are done with them
14704
14705 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
14706
14707         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
14708         need to make a copy of the variable to generate verifiable code.
14709
14710 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
14711
14712         * driver.cs: Compute dynamically the system directory.
14713
14714         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
14715         Slower, but more generally useful.  Used by the abstract
14716         registering implementation. 
14717
14718         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
14719         the rules for the special rule on Type/instances.  First check if
14720         we have the same name, and if so, try that special static path
14721         rather than the instance path.
14722
14723 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
14724
14725         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
14726         for, while and if.
14727
14728         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
14729         Enum, ValueType, Delegate or Array for non-corlib compiles.
14730
14731         * cs-tokenizer.cs: Catch long identifiers (645)
14732
14733         * typemanager.cs (IndexerPropetyName): Ravi never tested this
14734         piece of code.
14735
14736         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
14737         fix, we were returning too early, so we were not registering
14738         pending methods from abstract classes.
14739
14740         Do not register pending methods if the class is abstract.
14741
14742         * expression.cs (Conditional.DoResolve): Report circular implicit
14743         conversions when we neecd to compute it for conditional
14744         expressions. 
14745
14746         (Is.DoResolve): If the expression is always of the provided type,
14747         flag warning 183.  If the expression can not ever be of the
14748         provided type flag warning 184.
14749
14750         * class.cs: Catch 169 as well.
14751
14752         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
14753         read. 
14754
14755 2002-01-18  Nick Drochak  <ndrochak@gol.com>
14756
14757         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
14758
14759 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
14760
14761         * interface.cs: (PopulateMethod): Check for pointers being defined
14762         only if the unsafe context is active.
14763         (PopulateProperty): ditto.
14764         (PopulateIndexer): ditto.
14765
14766         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
14767         specified.  If pointers are present, make sure that they are
14768         present in an unsafe context.
14769         (Constructor, Constructor.Define): ditto.
14770         (Field, Field.Define): ditto.
14771         (Property, Property.Define): ditto.
14772         (Event, Event.Define): ditto.
14773
14774         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
14775         hashtable if there are classes or structs defined.
14776
14777         * expression.cs (LocalVariableReference.DoResolve): Simplify this
14778         code, as the constant resolution moved.
14779
14780         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
14781         the metadata, so we can flag error 133. 
14782
14783         * decl.cs (MemberCore.UnsafeOK): New function to test that a
14784         pointer is being declared in an unsafe context.
14785
14786 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
14787
14788         * modifiers.cs (Modifiers.Check): Require a Location argument.
14789         Report error 227 for Unsafe use.
14790
14791         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
14792
14793         * statement.cs (For.Emit): If the test is null, then report that
14794         we do `return', as we wont reach anything afterwards.
14795
14796         (Switch.SwitchGoverningType): Track the expression that matched
14797         the conversion.
14798
14799         * driver.cs: Allow negative numbers as an error code to flag.
14800
14801         * cs-parser.jay: Handle 1551.
14802
14803         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
14804
14805 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
14806
14807         * cs-parser.jay: Report 1518 (type declaration can only contain
14808         class, struct, interface, enum or delegate)
14809
14810         (switch_label): Report 1523 (keywords `case' or `default' must
14811         preced code)
14812
14813         (opt_switch_sections): Report 1522 (empty switch)
14814
14815         * driver.cs: Report 1515 (response file specified multiple times)
14816         Report 1516 (Source file specified multiple times).
14817
14818         * expression.cs (Argument.Resolve): Signal 1510
14819
14820         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
14821         access not allowed in static code)
14822
14823 2002-01-11  Ravi Pratap  <ravi@ximian.com>
14824
14825         * typemanager.cs (IsPointerType): Utility method which we are going
14826         to need a lot.
14827
14828         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
14829         the object type, so we take care of that.
14830
14831         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
14832
14833         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
14834         added to non-params parameters :-)
14835
14836         * typemanager.cs (CSharpName): Include 'void' type too. 
14837
14838         (void_ptr_type): Include in the set of core types.
14839
14840         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
14841         duplicating code.
14842
14843         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
14844         an unsafe context.
14845
14846         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
14847         completely forgotten about it.
14848
14849 2002-01-10  Ravi Pratap  <ravi@ximian.com>
14850
14851         * cs-parser.jay (pointer_type): Add. This begins our implementation
14852         of parsing rules for unsafe code.
14853
14854         (unsafe_statement): Implement.
14855
14856         (embedded_statement): Modify to include the above.
14857
14858         * statement.cs (Unsafe): Implement new class for unsafe blocks.
14859
14860         * codegen.cs (EmitContext.InUnsafe): Add. This determines
14861         if the current context is an unsafe one.
14862
14863         * cs-parser.jay (local_variable_pointer_type): Since local variable types
14864         are handled differently, we need separate rules for them.
14865
14866         (local_variable_declaration): Update to use local_variable_pointer_type
14867         to allow variable declarations of unmanaged pointer types.
14868
14869         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
14870         in unsafe contexts.
14871
14872         * ../errors/cs0214.cs : Add.
14873
14874 2002-01-16  Nick Drochak  <ndrochak@gol.com>
14875
14876         * makefile: remove 'response' file when cleaning.
14877
14878 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
14879
14880         * cs-parser.jay: Report 1524.
14881
14882 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
14883
14884         * typemanager.cs (RegisterMethod): drop checking if we have
14885         registered this from here
14886
14887 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
14888
14889         * class.cs (Method.EmitDestructor): Implement calling our base
14890         destructor. 
14891
14892         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
14893         value of InFinally.
14894
14895         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
14896         this routine and will wrap the call in a try/catch block.  Deal
14897         with the case.
14898
14899 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
14900
14901         * ecore.cs (Expression.MemberLookup): instead of taking a
14902         parameter `same_type' that was used to tell whether we could
14903         access private members we compute our containing type from the
14904         EmitContext.
14905
14906         (FieldExpr): Added partial support for volatile fields.  This does
14907         not work for volatile fields exposed from assemblies, as I can not
14908         figure out how to extract the modreq from it.
14909
14910         Updated all the source files to use this.
14911
14912         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
14913         because it is referenced by MemberLookup very often. 
14914
14915 2002-01-09  Ravi Pratap  <ravi@ximian.com>
14916
14917         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
14918         TypeBuilder.GetCustomAttributes to retrieve what we need.
14919
14920         Get rid of redundant default_member_attr_type as this is the same as
14921         default_member_type which already exists.
14922
14923         * interface.cs, attribute.cs : Update accordingly.
14924
14925 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
14926
14927         * typemanager.cs: Enable IndexerPropertyName again.  It does not
14928         work for TYpeBuilders though.  Ravi, can you please fix this?
14929
14930         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
14931
14932         * expression.cs (Argument.Emit): Handle the case of ref objects
14933         being passed to ref functions;  
14934
14935         (ParameterReference.EmitLoad): Loads the content of the pointer
14936         without dereferencing.
14937
14938 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
14939
14940         * cs-tokenizer.cs: Implemented the pre-processing expressions.
14941
14942 2002-01-08  Ravi Pratap  <ravi@ximian.com>
14943
14944         * class.cs (Indexer.DefineMethod): Incorporate the interface
14945         type in the name of the method if we are doing explicit interface
14946         implementation.
14947
14948         * expression.cs (ConversionExists): Remove as it is completely obsolete.
14949
14950         (BetterConversion): Fix extremely trivial bug where we were referring to
14951         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
14952         again !
14953
14954         * ../errors/bug16.cs : Add although we have fixed it.
14955
14956 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
14957
14958         * expression.cs (BaseIndexer): Begin implementation.
14959
14960         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
14961
14962         * cs-parser.jay (indexer_declarator): Use qualified_identifier
14963         production directly to remove a shift/reduce, and implement
14964         explicit interface implementation.
14965
14966         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
14967         after a floating point suffix.
14968
14969         * expression.cs (DoNumericPromotions): Improved the conversion for
14970         uint/uint.  If we have a constant, we avoid doing a typecast to a
14971         larger type.
14972
14973         * class.cs (Indexer): Implement explicit interface implementation
14974         for indexers.
14975
14976 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
14977
14978         * class.cs: make the default instance constructor public and hidebysig.
14979
14980 2001-01-03  Ravi Pratap  <ravi@ximian.com>
14981
14982         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
14983         so we can call it from elsewhere.
14984
14985         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
14986         we emit it internally if the class has a defined indexer; otherwise the user
14987         emits it by decorating the class definition with the DefaultMemberAttribute.
14988
14989         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
14990         attribute is not used on a type which defines an indexer.
14991
14992         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
14993         character when we skip whitespace.
14994
14995         * ../errors/cs0646.cs : Add.
14996
14997 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
14998
14999         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
15000         again. 
15001
15002         * makefile: Add practical target `mcs3.exe' which builds the third
15003         generation compiler. 
15004
15005         * expression.cs (New): Fix structures constructor calling.
15006
15007         * class.cs (Property, Method, Indexer): Emit Final flag on the
15008         method if we are an interface implementation and we are not
15009         abstract. 
15010
15011         * ecore.cs (PropertyExpr): New public field `IsBase', tells
15012         whether this property is referencing a `base' method.
15013
15014         * expression.cs (Invocation.EmitCall): take an extra argument:
15015         is_base, this is used to determine whether the `call' or
15016         `callvirt' opcode should be used.
15017
15018
15019         * delegate.cs: update EmitCall.
15020
15021         * class.cs (Method.Define): Set NewSlot for the cases where we are
15022         not implementing an interface method.
15023
15024         (Property.Define): ditto.
15025
15026 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
15027
15028         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
15029         'r'.  Allows mcs to parse itself fully.
15030
15031 2002-01-02  Ravi Pratap  <ravi@ximian.com>
15032
15033         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
15034         of the number of initializers that require the InitializeArray method.
15035
15036         (CheckIndices): Store the Expression in all cases - not the plain value. Also
15037         update the above field where necessary.
15038
15039         (MakeByteBlob): Update accordingly.
15040
15041         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
15042         greater than 2.
15043
15044         (EmitDynamicInitializers): Update in accordance with the new optimization.
15045
15046         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
15047         same OpCode applies.
15048
15049         * cs-parser.jay : Fix some glaring errors I introduced.
15050
15051 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
15052
15053         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
15054         so that we can check for name clashes there too.
15055
15056         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
15057         for interface indexers.
15058
15059         * interfaces.cs (Define): Emit the default member attribute.
15060
15061         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
15062         variable was being referred to while setting the value ;-)
15063
15064 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
15065
15066         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
15067         byte-by-byte information when we know the data is zero.
15068
15069         Make the block always a multiple of 4, because
15070         DefineInitializedData has a bug.
15071
15072         * assign.cs: Fix, we should assign from the temporary, not from
15073         the source. 
15074
15075         * expression.cs (MakeByteBlob): Fix my incorrect code.
15076
15077 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
15078
15079         * typemanager.cs (EnumToUnderlying): This function is used to get
15080         the underlying type from an enumeration, because it does not
15081         always work. 
15082
15083         * constant.cs: Use the I4_S form for values between -128 and 127.
15084
15085         * statement.cs (Block.LookupLabel): Looks up a label.
15086         (Block): Drop support for labeled blocks.
15087
15088         (LabeledStatement): New kind of statement that represents a label
15089         only.
15090
15091         (Goto): Finally implement this bad boy.
15092
15093         * cs-parser.jay: Update to reflect new mechanism to implement
15094         labels.
15095
15096 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
15097
15098         * codegen.cs (EmitContext.This): a codegen property that keeps the
15099         a single instance of this instead of creating many different this
15100         instances. 
15101
15102         * delegate.cs (Delegate.DoResolve): Update to use the property;
15103
15104         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
15105
15106         * expression.cs (BaseAccess.DoResolve): Ditto.
15107
15108 2001-12-29  Ravi Pratap  <ravi@ximian.com>
15109
15110         * typemanager.cs (methodimpl_attr_type): Add to hold the type
15111         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
15112
15113         (InitCoreTypes): Update accordingly.
15114
15115         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
15116         so we can quickly store the state.
15117
15118         (ApplyAttributes): Set the correct implementation flags
15119         for InternalCall methods.
15120
15121 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
15122
15123         * expression.cs (EmitCall): if a method is not virtual, then do
15124         not use callvirt on it.
15125
15126         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
15127         user defined stuff) requires the use of stobj, which takes an
15128         address on the stack instead of an array and an index.  So emit
15129         the Ldelema operation for it.
15130
15131         (EmitStoreOpcode): Use stobj for valuetypes.
15132
15133         (UnaryMutator.EmitCode): Use the right 1 value depending on
15134         whether we are dealing with int64/uint64, float or doubles.
15135
15136         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
15137         constructors that I implemented last night.
15138
15139         (Constructor.IsDefault): Fix to work properly for static
15140         constructors.
15141
15142         * cs-parser.jay (CheckDef): report method signature errors.
15143         Update error number 103 to be 132.
15144
15145         * decl.cs: New AdditionResult enumeration value: MethodExists.
15146         Although we do this check for methods later on in the semantic
15147         analysis, catching repeated default constructors is so easy that
15148         we catch these here. 
15149
15150         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
15151         promotions code.
15152
15153         (ParameterReference.EmitAssign, Emit): handle
15154         bools as bytes.
15155
15156         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
15157         (ArrayAccess.EmitStoreOpcode): ditto.
15158
15159         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
15160
15161         * expression.cs (MakeByteBlob): Complete all the missing types
15162         (uint, short, ushort, byte, sbyte)
15163
15164         * class.cs: Only init instance field initializers on instance
15165         constructors. 
15166
15167         Rename `constructors' to instance_constructors. 
15168
15169         (TypeContainer.AddConstructor): Only add constructors to the list
15170         if it is not static.
15171
15172         Make sure that we handle default_static_constructor independently
15173         everywhere where we handle instance_constructors
15174
15175 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
15176
15177         * class.cs: Do not lookup or create a base initializer for a
15178         static constructor.
15179
15180         (ConstructorInitializer.Resolve): use the proper type to lookup
15181         for constructors.
15182
15183         * cs-parser.jay: Report error 1585 (modifiers between type and name).
15184
15185         * enum.cs, interface.cs: Remove CloseType, this is taken care by
15186         in DeclSpace. 
15187
15188         * decl.cs: CloseType is now an virtual method, the default
15189         implementation just closes this type.
15190
15191 2001-12-28  Ravi Pratap  <ravi@ximian.com>
15192
15193         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
15194         to PreserveSig by default. Also emit HideBySig on such methods.
15195
15196         Basically, set the defaults to standard values.
15197
15198         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
15199         argument, if candidate is better, it can't be worse than the best !
15200
15201         (Invocation): Re-write bits to differentiate between methods being
15202         applicable in their expanded form and their normal form - for params
15203         methods of course.
15204
15205         Get rid of use_standard everywhere as only standard conversions are allowed
15206         in overload resolution. 
15207
15208         More spec conformance.
15209
15210 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
15211
15212         * driver.cs: Add --timestamp, to see where the compiler spends
15213         most of its time.
15214
15215         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
15216         `this' in static code.
15217
15218         (SimpleName.DoResolve): Implement in terms of a helper function
15219         that allows static-references to be passed upstream to
15220         MemberAccess.
15221
15222         (Expression.ResolveWithSimpleName): Resolve specially simple
15223         names when called by MemberAccess to implement the special
15224         semantics. 
15225
15226         (Expression.ImplicitReferenceConversion): Handle conversions from
15227         Null to reference types before others, as Null's type is
15228         System.Object. 
15229
15230         * expression.cs (Invocation.EmitCall): Handle the special case of
15231         calling methods declared on a reference type from a ValueType
15232         (Base classes System.Object and System.Enum)
15233
15234         (MemberAccess.Resolve): Only perform lookups on Enumerations if
15235         the left hand side is a TypeExpr, not on every enumeration. 
15236
15237         (Binary.Resolve): If types are reference types, then do a cast to
15238         object on operators != and == of both arguments.
15239
15240         * typemanager.cs (FindMembers): Extract instance and static
15241         members if requested.
15242
15243         * interface.cs (PopulateProperty): Use void_type instead of null
15244         as the return type for the setter method.
15245
15246         (PopulateIndexer): ditto.
15247
15248 2001-12-27  Ravi Pratap  <ravi@ximian.com>
15249
15250         * support.cs (ReflectionParameters): Fix minor bug where we
15251         were examining the wrong parameter for the ParamArray attribute.
15252
15253         Cope with requests for the type of the parameter at position
15254         greater than the params parameter's. We now return the element
15255         type of the params array as that makes more sense.
15256
15257         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
15258         accordingly as we no longer have to extract the element type
15259         ourselves.
15260
15261         (Invocation.OverloadResolve): Update.
15262
15263 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
15264
15265         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
15266         against IEnumerator, test whether the return value is a descendant
15267         of the IEnumerator interface.
15268
15269         * class.cs (Indexer.Define): Use an auxiliary method to implement
15270         the other bits of the method definition.  Begin support for
15271         explicit interface implementation.
15272
15273         (Property.DefineMethod): Use TypeManager.void_type instead of null
15274         for an empty return value.
15275
15276 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
15277
15278         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
15279         dealing with a FieldExpr which is composed of a FieldBuilder, in
15280         the code path we did extract the constant, but we should have
15281         obtained the underlying value to be able to cast it (otherwise we
15282         end up in an infinite loop, this is what Ravi was running into).
15283
15284         (ArrayCreation.UpdateIndices): Arrays might be empty.
15285
15286         (MemberAccess.ResolveMemberAccess): Add support for section
15287         14.5.4.1 that deals with the special case of E.I when E is a type
15288         and something else, that I can be a reference to a static member.
15289
15290         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
15291         handle a particular array type to create byte blobs, it is just
15292         something we dont generate byteblobs for.
15293
15294         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
15295         arguments. 
15296
15297         * location.cs (Push): remove the key from the hashtable that we
15298         are about to add.   This happens for empty files.
15299
15300         * driver.cs: Dispose files after we have parsed them.
15301
15302         (tokenize): new function that only runs the tokenizer on its
15303         input, for speed testing.
15304
15305 2001-12-26  Ravi Pratap  <ravi@ximian.com>
15306
15307         * class.cs (Event.Define): Define the private field only if there
15308         are no accessors defined.
15309
15310         * expression.cs (ResolveMemberAccess): If there is no associated
15311         field with the event, that means we have an event defined with its
15312         own accessors and we should flag error cs0070 since transforming
15313         ourselves into a field is not valid in that case.
15314
15315         * ecore.cs (SimpleName.DoResolve): Same as above.
15316
15317         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
15318         and charset to sane values.
15319
15320 2001-12-25  Ravi Pratap  <ravi@ximian.com>
15321
15322         * assign.cs (DoResolve): Perform check on events only if they 
15323         are being accessed outside the declaring type.
15324
15325         * cs-parser.jay (event_declarations): Update rules to correctly
15326         set the type of the implicit parameter etc.
15327
15328         (add_accessor, remove_accessor): Set current local parameters.
15329
15330         * expression.cs (Binary): For delegate addition and subtraction,
15331         cast the return value from the method into the appropriate delegate
15332         type.
15333
15334 2001-12-24  Ravi Pratap  <ravi@ximian.com>
15335
15336         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
15337         of these as the workaround is unnecessary.
15338
15339         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
15340         delegate data - none of that is needed at all.
15341
15342         Re-write bits to extract the instance expression and the delegate method
15343         correctly.
15344
15345         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
15346         on delegates too.
15347
15348         * attribute.cs (ApplyAttributes): New method to take care of common tasks
15349         of attaching attributes instead of duplicating code everywhere.
15350
15351         * everywhere : Update code to do attribute emission using the above method.
15352
15353 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
15354
15355         * expression.cs (IsParamsMethodApplicable): if there are not
15356         parameters, return immediately.
15357
15358         * ecore.cs: The 0 literal can be implicity converted to an enum
15359         type. 
15360
15361         (SimpleName.DoResolve): First lookup the type, then lookup the
15362         members. 
15363
15364         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
15365         want to get its address.  If the InstanceExpression is not
15366         addressable, store the result in a temporary variable, then get
15367         the address of it.
15368
15369         * codegen.cs: Only display 219 errors on warning level or above. 
15370
15371         * expression.cs (ArrayAccess): Make it implement the
15372         IMemoryLocation interface.
15373
15374         (Binary.DoResolve): handle the operator == (object a, object b)
15375         and operator != (object a, object b) without incurring into a
15376         BoxedCast (because 5 != o should never be performed).
15377
15378         Handle binary enumerator operators.
15379
15380         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
15381         value type, otherwise use Ldelem_ref.
15382
15383         Use precomputed names;
15384
15385         (AddressOf): Implement address of
15386
15387         * cs-parser.jay (labeled_statement): Fix recursive block
15388         addition by reworking the production.
15389
15390         * expression.cs (New.DoEmit): New has a special case:
15391                 
15392                  If we are dealing with a ValueType, we have a few
15393                  situations to deal with:
15394                 
15395                     * The target of New is a ValueType variable, that is
15396                       easy, we just pass this as the variable reference
15397                 
15398                     * The target of New is being passed as an argument,
15399                       to a boxing operation or a function that takes a
15400                       ValueType.
15401                 
15402                       In this case, we need to create a temporary variable
15403                       that is the argument of New.
15404
15405
15406 2001-12-23  Ravi Pratap  <ravi@ximian.com>
15407
15408         * rootcontext.cs (LookupType): Check that current_type is not null before
15409         going about looking at nested types.
15410
15411         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
15412         not implement the IAssignMethod interface any more.
15413
15414         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
15415         where we tranform them into FieldExprs if they are being resolved from within
15416         the declaring type.
15417
15418         * ecore.cs (SimpleName.DoResolve): Do the same here.
15419
15420         * assign.cs (DoResolve, Emit): Clean up code considerably. 
15421
15422         * ../errors/bug10.cs : Add.
15423
15424         * ../errors/cs0070.cs : Add.
15425
15426         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
15427
15428         * assign.cs : Get rid of EventIsLocal everywhere.
15429
15430 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
15431
15432         * ecore.cs (ConvertIntLiteral): finished the implementation.
15433
15434         * statement.cs (SwitchLabel): Convert the value we are using as a
15435         key before looking up the table.
15436
15437 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
15438
15439         * codegen.cs (EmitTopBlock): Require a Location argument now.
15440
15441         * cs-parser.jay (constructor_declarator): We need to setup
15442         current_local_parameters before we parse the
15443         opt_constructor_initializer, to allow the variables to be bound
15444         to the constructor arguments.
15445
15446         * rootcontext.cs (LookupType): First lookup nested classes in our
15447         class and our parents before we go looking outside our class.
15448
15449         * expression.cs (ConstantFold): Extract/debox the values at the
15450         beginnning. 
15451
15452         * rootcontext.cs (EmitCode): Resolve the constants first before we
15453         resolve the types.  This is not really needed, but it helps debugging.
15454
15455         * statement.cs: report location.
15456
15457         * cs-parser.jay: pass location to throw statement.
15458
15459         * driver.cs: Small bug fix.
15460
15461         * report.cs: Updated format to be 4-zero filled digits.
15462
15463 2001-12-22  Ravi Pratap  <ravi@ximian.com>
15464
15465         * expression.cs (CheckIndices): Fix minor bug where the wrong
15466         variable was being referred to ;-)
15467
15468         (DoEmit): Do not call EmitStaticInitializers when the 
15469         underlying type is System.Object.
15470
15471 2001-12-21  Ravi Pratap  <ravi@ximian.com>
15472
15473         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
15474         and do the usual workaround for SRE.
15475
15476         * class.cs (MyEventBuilder.EventType): New member to get at the type
15477         of the event, quickly.
15478
15479         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
15480
15481         * assign.cs (Assign.DoResolve): Handle the case when the target
15482         is an EventExpr and perform the necessary checks.
15483
15484         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
15485         interface.
15486
15487         (SimpleName.MemberStaticCheck): Include check for EventExpr.
15488
15489         (EventExpr): Set the type in the constructor itself since we 
15490         are meant to be born fully resolved.
15491
15492         (EventExpr.Define): Revert code I wrote earlier.
15493                 
15494         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
15495         instance expression is null. The instance expression is a This in that case
15496         or a null, depending on whether it is a static method or not.
15497
15498         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
15499         refers to more than one method.
15500
15501         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
15502         and accordingly flag errors.
15503
15504 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
15505
15506         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
15507
15508 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
15509
15510         * location.cs (ToString): Provide useful rutine.
15511
15512 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
15513
15514         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
15515         objects, return the actual integral boxed.
15516
15517         * statement.cs (SwitchLabel): define an ILLabel for each
15518         SwitchLabel. 
15519
15520         (Switch.CheckSwitch): If the value is a Literal, extract
15521         the underlying literal.
15522
15523         Also in the unused hashtable we had, add the SwitchLabel so we can
15524         quickly look this value up.
15525
15526         * constant.cs: Implement a bunch of new constants.  Rewrite
15527         Literal based on this.  Made changes everywhere to adapt to this.
15528
15529         * expression.cs (Expression.MakeByteBlob): Optimize routine by
15530         dereferencing array only once, and also copes with enumrations.
15531
15532         bytes are two bytes wide, not one.
15533
15534         (Cast): Perform constant conversions.
15535
15536         * ecore.cs (TryImplicitIntConversion): Return literals instead of
15537         wrappers to the literals here.
15538
15539         * expression.cs (DoNumericPromotions): long literals can converted
15540         to ulong implicity (this is taken care of elsewhere, but I was
15541         missing this spot).
15542
15543         * ecore.cs (Expression.Literalize): Make the return type Literal,
15544         to improve type checking.
15545
15546         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
15547
15548 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
15549
15550         * literal.cs: Revert code from ravi that checked the bounds.  The
15551         bounds are sane by the definition of the type itself. 
15552
15553         * typemanager.cs: Fix implementation of ImplementsInterface.  We
15554         need to actually look up in our parent hierarchy for interfaces
15555         implemented. 
15556
15557         * const.cs: Use the underlying type for enumerations
15558
15559         * delegate.cs: Compute the basename for the delegate creation,
15560         that should fix the delegate test case, and restore the correct
15561         Type Lookup semantics in rootcontext
15562
15563         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
15564         referencing a nested type with the Reflection API is using the "+"
15565         sign. 
15566
15567         * cs-parser.jay: Do not require EOF token at the end.
15568
15569 2001-12-20  Ravi Pratap  <ravi@ximian.com>
15570
15571         * rootcontext.cs (LookupType): Concatenate type names with
15572         a '.' instead of a '+' The test suite passes again.
15573
15574         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
15575         field of the enumeration.
15576
15577         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
15578         the case when the member is an EventExpr.
15579
15580         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
15581         static has an associated instance expression.
15582
15583         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
15584
15585         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
15586
15587         * class.cs (Event.Define): Register event and perform appropriate checks
15588         for error #111.
15589
15590         We define the Add and Remove methods even if the use provides none because
15591         in that case, we provide default implementations ourselves.
15592
15593         Define a private field of the type of the event. This is done by the CSC compiler
15594         and we should be doing it too ;-)
15595
15596         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
15597         More methods we use in code we generate.
15598
15599         (multicast_delegate_type, delegate_type): Two separate types since the distinction
15600         is important.
15601
15602         (InitCoreTypes): Update accordingly for the above.
15603
15604         * class.cs (Event.Emit): Generate code for default accessors that we provide
15605
15606         (EmitDefaultMethod): Do the job in the above.
15607
15608         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
15609         appropriate place.
15610
15611 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
15612
15613         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
15614         builders even if we were missing one.
15615
15616         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
15617         pass the Basename as our class name instead of the Name.  The
15618         basename will be correctly composed for us.
15619
15620         * parameter.cs (Paramters): Now takes a Location argument.
15621
15622         * decl.cs (DeclSpace.LookupType): Removed convenience function and
15623         make all the code call directly LookupType in RootContext and take
15624         this chance to pass the Location information everywhere.
15625
15626         * Everywhere: pass Location information.
15627
15628 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
15629
15630         * class.cs (Constructor.Define): Updated way of detecting the
15631         length of the parameters.
15632
15633         (TypeContainer.DefineType): Use basename as the type name for
15634         nested types.
15635
15636         (TypeContainer.Define): Do not recursively define types here, as
15637         definition is taken care in order by the RootContext.
15638
15639         * tree.cs: Keep track of namespaces in a per-file basis.
15640
15641         * parameter.cs (Parameter.ComputeSignature): Update to use
15642         DeclSpace. 
15643
15644         (Parameters.GetSignature): ditto.
15645
15646         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
15647         instead of a TypeContainer.
15648
15649         (Interface.SemanticAnalysis): Use `this' instead of our parent to
15650         resolve names.  Because we need to be resolve in our context, not
15651         our parents.
15652
15653         * driver.cs: Implement response files.
15654
15655         * class.cs (TypeContainer.DefineType): If we are defined, do not
15656         redefine ourselves.
15657
15658         (Event.Emit): Emit the code for add/remove handlers.
15659         (Event.Define): Save the MethodBuilders for add/remove.
15660
15661         * typemanager.cs: Use pair here too.
15662
15663         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
15664         DictionaryEntry requires the first argument to be non-null.  
15665
15666         (enum_declaration): Compute full name for registering the
15667         enumeration.
15668
15669         (delegate_declaration): Instead of using
15670         formal_parameter_list, use opt_formal_parameter_list as the list
15671         can be empty.
15672
15673         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
15674         (EventParsing): New property that controls whether `add' and
15675         `remove' are returned as tokens or identifiers (for events);
15676
15677 2001-12-19  Ravi Pratap  <ravi@ximian.com>
15678
15679         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
15680         use MyEventBuilder only and let it wrap the real builder for us.
15681
15682         (MyEventBuilder): Revamp constructor etc.
15683
15684         Implement all operations that we perform on EventBuilder in precisely the same
15685         way here too.
15686
15687         (FindMembers): Update to use the EventBuilder member.
15688
15689         (Event.Emit): Update accordingly.
15690
15691 2001-12-18  Ravi Pratap  <ravi@ximian.com>
15692
15693         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
15694         by calling the appropriate methods.
15695
15696         (GetCustomAttributes): Make stubs as they cannot possibly do anything
15697         useful.
15698
15699         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
15700
15701 2001-12-17  Ravi Pratap  <ravi@ximian.com>
15702
15703         * delegate.cs (Delegate.Populate): Check that the return type
15704         and various parameters types are indeed accessible.
15705
15706         * class.cs (Constructor.Define): Same here.
15707
15708         (Field.Define): Ditto.
15709
15710         (Event.Define): Ditto.
15711
15712         (Operator.Define): Check that the underlying Method defined itself
15713         correctly - so it's MethodBuilder should not be null.
15714
15715         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
15716         expression happens to be null.
15717
15718         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
15719         members but as of now we don't seem to be able to do anything really useful with it.
15720
15721         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
15722         not the EventBuilder.
15723
15724 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
15725
15726         * cs-tokenizer.cs: Add support for defines.
15727         Add support for #if, #elif, #else, #endif
15728
15729         (eval_var): evaluates a variable.
15730         (eval): stubbed for evaluating functions.
15731
15732         * cs-parser.jay: Pass the defines information
15733
15734         * driver.cs: Add --define command line option.
15735
15736         * decl.cs: Move MemberCore here.
15737
15738         Make it the base class for DeclSpace.  This allows us to catch and
15739         report 108 and 109 for everything now.
15740
15741         * class.cs (TypeContainer.Define): Extract all the members
15742         before populating and emit the warning 108 (new keyword required
15743         to override) instead of having each member implement this.
15744
15745         (MemberCore.Define): New abstract method, we will be using this in
15746         the warning reporting engine in Populate.
15747
15748         (Operator.Define): Adjust to new MemberCore protocol. 
15749
15750         * const.cs (Const): This does not derive from Expression, it is a
15751         temporary object we use to create fields, it is a MemberCore. 
15752
15753         * class.cs (Method.Define): Allow the entry point to be in a
15754         specific class.
15755
15756         * driver.cs: Rewrite the argument handler to clean it up a bit.
15757
15758         * rootcontext.cs: Made it just an auxiliary namespace feature by
15759         making everything static.
15760
15761         * driver.cs: Adapt code to use RootContext type name instead of
15762         instance variable.
15763
15764         * delegate.cs: Remove RootContext argument.
15765
15766         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
15767         argument. 
15768
15769         * class.cs (Event.Define): The lookup can fail.
15770
15771         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
15772
15773         * expression.cs: Resolve the this instance before invoking the code.
15774
15775 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
15776
15777         * cs-parser.jay: Add a production in element_access that allows
15778         the thing to become a "type" reference.  This way we can parse
15779         things like "(string [])" as a type.
15780
15781         Note that this still does not handle the more complex rules of
15782         casts. 
15783
15784
15785         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
15786
15787         * ecore.cs: (CopyNewMethods): new utility function used to
15788         assemble the list of methods from running FindMembers.
15789
15790         (MemberLookup): Rework FindMembers so that 
15791
15792 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
15793
15794         * class.cs (TypeContainer): Remove Delegates who fail to be
15795         defined.
15796
15797         * delegate.cs (Populate): Verify that we dont get null return
15798         values.   TODO: Check for AsAccessible.
15799
15800         * cs-parser.jay: Use basename to emit error 574 (destructor should
15801         have the same name as container class), not the full name.
15802
15803         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
15804         possible representation.  
15805
15806         Also implements integer type suffixes U and L.
15807
15808 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
15809
15810         * expression.cs (ArrayCreation.DoResolve): We need to do the
15811         argument resolution *always*.
15812
15813         * decl.cs: Make this hold the namespace.  Hold the root context as
15814         well.
15815         (LookupType): Move here.
15816
15817         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
15818
15819         * location.cs (Row, Name): Fixed the code, it was always returning
15820         references to the first file.
15821
15822         * interface.cs: Register properties defined through interfaces.
15823
15824         * driver.cs: Add support for globbing on the command line
15825
15826         * class.cs (Field): Make it derive from MemberCore as well.
15827         (Event): ditto.
15828
15829 2001-12-15  Ravi Pratap  <ravi@ximian.com>
15830
15831         * class.cs (Event::Define): Check that the type of the event is a delegate
15832         type else flag error #66.
15833
15834         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
15835         same.
15836
15837         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
15838         values of EntryPoint, CharSet etc etc.
15839
15840         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
15841
15842         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
15843         be null and we should ignore this. I am not sure if this is really clean. Apparently,
15844         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
15845         which needs this to do its work.
15846
15847         * ../errors/cs0066.cs : Add.
15848
15849 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
15850
15851         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
15852         helper functions.
15853
15854         * class.cs: (MethodSignature.MethodSignature): Removed hack that
15855         clears out the parameters field.
15856         (MemberSignatureCompare): Cleanup
15857
15858         (MemberCore): New base class used to share code between MethodCore
15859         and Property.
15860
15861         (RegisterRequiredImplementations) BindingFlags.Public requires
15862         either BindingFlags.Instace or Static.  Use instance here.
15863
15864         (Property): Refactored code to cope better with the full spec.
15865
15866         * parameter.cs (GetParameterInfo): Return an empty array instead
15867         of null on error.
15868
15869         * class.cs (Property): Abstract or extern properties have no bodies.
15870
15871         * parameter.cs (GetParameterInfo): return a zero-sized array.
15872
15873         * class.cs (TypeContainer.MethodModifiersValid): Move all the
15874         method modifier validation to the typecontainer so we can reuse
15875         this on properties.
15876
15877         (MethodCore.ParameterTypes): return an empty sized array of types.
15878
15879         (Property.Define): Test property modifier validity.
15880
15881         Add tests for sealed/override too.
15882
15883         (Method.Emit): abstract or extern methods have no bodies.
15884
15885 2001-12-14  Ravi Pratap  <ravi@ximian.com>
15886
15887         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
15888         thing.
15889
15890         (Method::Define, ::Emit): Modify accordingly.
15891
15892         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
15893
15894         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
15895
15896         * makefile: Pass in /unsafe.
15897
15898 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
15899
15900         * class.cs (MakeKey): Kill routine.
15901
15902         * class.cs (TypeContainer.Define): Correctly define explicit
15903         method implementations (they require the full interface name plus
15904         the method name).
15905
15906         * typemanager.cs: Deply the PtrHashtable here and stop using the
15907         lame keys.  Things work so much better.
15908
15909         This of course broke everyone who depended on `RegisterMethod' to
15910         do the `test for existance' test.  This has to be done elsewhere.
15911
15912         * support.cs (PtrHashtable): A hashtable that avoid comparing with
15913         the object stupid Equals method (because, that like fails all over
15914         the place).  We still do not use it.
15915
15916         * class.cs (TypeContainer.SetRequiredInterface,
15917         TypeContainer.RequireMethods): Killed these two routines and moved
15918         all the functionality to RegisterRequiredImplementations.
15919
15920         (TypeContainer.RegisterRequiredImplementations): This routine now
15921         registers all the implementations required in an array for the
15922         interfaces and abstract methods.  We use an array of structures
15923         which can be computed ahead of time to reduce memory usage and we
15924         also assume that lookups are cheap as most classes will not
15925         implement too many interfaces.
15926
15927         We also avoid creating too many MethodSignatures.
15928
15929         (TypeContainer.IsInterfaceMethod): Update and optionally does not
15930         clear the "pending" bit if we find that there are problems with
15931         the declaration.
15932
15933         (TypeContainer.VerifyPendingMethods): Update to report errors of
15934         methods that look like implementations but are not.
15935
15936         (TypeContainer.Define): Add support for explicit interface method
15937         implementation. 
15938
15939 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
15940
15941         * typemanager.cs: Keep track of the parameters here instead of
15942         being a feature of the TypeContainer.
15943
15944         * class.cs: Drop the registration of parameters here, as
15945         InterfaceMethods are also interface declarations.
15946
15947         * delegate.cs: Register methods with the TypeManager not only with
15948         the TypeContainer.  This code was buggy.
15949
15950         * interface.cs: Full registation here.
15951
15952 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
15953
15954         * expression.cs: Remove reducer for binary expressions, it can not
15955         be done this way.
15956
15957         * const.cs: Put here the code that used to go into constant.cs
15958
15959         * constant.cs: Put here the code for constants, this is a new base
15960         class for Literals.
15961
15962         * literal.cs: Make Literal derive from Constant.
15963
15964 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
15965
15966         * statement.cs (Return.Emit): Report error 157 if the user
15967         attempts to return from a finally block.
15968
15969         (Return.Emit): Instead of emitting a return, jump to the end of
15970         the function.
15971
15972         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
15973         LocalBuilder to store the result of the function.  ReturnLabel is
15974         the target where we jump.
15975
15976
15977 2001-12-09  Radek Doulik  <rodo@ximian.com>
15978
15979         * cs-parser.jay: remember alias in current namespace
15980
15981         * ecore.cs (SimpleName::DoResolve): use aliases for types or
15982         namespaces
15983
15984         * class.cs (LookupAlias): lookup alias in my_namespace
15985
15986         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
15987         aliases hashtable
15988         (LookupAlias): lookup alias in this and if needed in parent
15989         namespaces
15990
15991 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
15992
15993         * support.cs: 
15994
15995         * rootcontext.cs: (ModuleBuilder) Made static, first step into
15996         making things static.  I need this to avoid passing the
15997         TypeContainer when calling ParameterType.
15998
15999         * support.cs (InternalParameters.ParameterType): Remove ugly hack
16000         that did string manipulation to compute the type and then call
16001         GetType.  Use Parameter.ParameterType instead.
16002
16003         * cs-tokenizer.cs: Consume the suffix for floating values.
16004
16005         * expression.cs (ParameterReference): figure out whether this is a
16006         reference parameter or not.  Kill an extra variable by computing
16007         the arg_idx during emission.
16008
16009         * parameter.cs (Parameters.GetParameterInfo): New overloaded
16010         function that returns whether a parameter is an out/ref value or not.
16011
16012         (Parameter.ParameterType): The type of the parameter (base,
16013         without ref/out applied).
16014
16015         (Parameter.Resolve): Perform resolution here.
16016         (Parameter.ExternalType): The full type (with ref/out applied).
16017
16018         * statement.cs (Using.Emit, Using.EmitExpression): Implement
16019         support for expressions on the using statement.
16020
16021 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
16022
16023         * statement.cs (Using.EmitLocalVariableDecls): Split the
16024         localvariable handling of the using statement.
16025
16026         (Block.EmitMeta): Keep track of variable count across blocks.  We
16027         were reusing slots on separate branches of blocks.
16028
16029         (Try.Emit): Emit the general code block, we were not emitting it. 
16030
16031         Check the type of the declaration to be an IDisposable or
16032         something that can be implicity converted to it. 
16033
16034         Emit conversions if required.
16035
16036         * ecore.cs (EmptyExpression): New utility class.
16037         (Expression.ImplicitConversionExists): New utility function.
16038
16039 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
16040
16041         * statement.cs (Using): Implement.
16042
16043         * expression.cs (LocalVariableReference): Support read only variables.
16044
16045         * statement.cs: Remove the explicit emit for the Leave opcode.
16046         (VariableInfo): Add a readonly field.
16047
16048 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
16049
16050         * ecore.cs (ConvCast): new class used to encapsulate the various
16051         explicit integer conversions that works in both checked and
16052         unchecked contexts.
16053
16054         (Expression.ConvertNumericExplicit): Use new ConvCast class to
16055         properly generate the overflow opcodes.
16056
16057 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
16058
16059         * statement.cs: The correct type for the EmptyExpression is the
16060         element_type, not the variable type.  Ravi pointed this out.
16061
16062 2001-12-04  Ravi Pratap  <ravi@ximian.com>
16063
16064         * class.cs (Method::Define): Handle PInvoke methods specially
16065         by using DefinePInvokeMethod instead of the usual one.
16066
16067         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
16068         above to do the task of extracting information and defining the method.
16069
16070 2001-12-04  Ravi Pratap  <ravi@ximian.com>
16071
16072         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
16073         of the condition for string type.
16074
16075         (Emit): Move that here. 
16076
16077         (ArrayCreation::CheckIndices): Keep string literals in their expression
16078         form.
16079
16080         (EmitDynamicInitializers): Handle strings appropriately.
16081
16082 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
16083
16084         * codegen.cs (EmitContext): Replace multiple variables with a
16085         single pointer to the current Switch statement.
16086
16087         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
16088         EmitContext.
16089
16090 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
16091
16092         * statement.cs 
16093
16094         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
16095         default'.
16096
16097         (Foreach.Emit): Foreach on arrays was not setting
16098         up the loop variables (for break/continue).
16099
16100         (GotoCase): Semi-implented.
16101
16102 2001-12-03  Ravi Pratap  <ravi@ximian.com>
16103
16104         * attribute.cs (CheckAttribute): Handle system attributes by using
16105         Attribute.GetAttributes to examine information we need.
16106
16107         (GetValidPlaces): Same here.
16108
16109         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
16110
16111         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
16112
16113         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
16114
16115         (Method::Define): Set appropriate flags if we have a DllImport attribute.
16116
16117         (Method::Emit): Handle the case when we are a PInvoke method.
16118
16119 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
16120
16121         * expression.cs: Use ResolveWithSimpleName on compound names.
16122
16123 2001-12-02  Ravi Pratap  <ravi@ximian.com>
16124
16125         * constant.cs (EmitConstant): Make sure we resolve the associated expression
16126         before trying to reduce it.
16127
16128         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
16129
16130         * constant.cs (LookupConstantValue): Implement.
16131
16132         (EmitConstant): Use the above in emitting the constant.
16133
16134         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
16135         that are user-defined by doing a LookupConstantValue on them.
16136
16137         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
16138         too, like above.
16139
16140 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
16141
16142         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
16143
16144         (BaseAccess.DoResolve): Implement.
16145
16146         (MemberAccess.DoResolve): Split this routine into a
16147         ResolveMemberAccess routine that can be used independently
16148
16149 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
16150
16151         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
16152         As that share bits of the implementation.  Is returns a boolean,
16153         while As returns the Type that is being probed.
16154
16155 2001-12-01  Ravi Pratap  <ravi@ximian.com>
16156
16157         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
16158         instead of a Literal - much easier.
16159
16160         (EnumInTransit): Remove - utterly useless :-)
16161
16162         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
16163
16164         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
16165
16166         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
16167         chain when we have no associated expression.
16168
16169 2001-11-30  Ravi Pratap  <ravi@ximian.com>
16170
16171         * constant.cs (Define): Use Location while reporting the errror.
16172
16173         Also emit a warning when 'new' is used and there is no inherited
16174         member to hide.
16175
16176         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
16177         populated.
16178
16179         (LookupEnumValue): Implement to lookup an enum member's value and define it
16180         if necessary.
16181
16182         (Populate): Re-write accordingly to use the above routine.
16183
16184 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
16185
16186         * expression.cs (This): Fix prototype for DoResolveLValue to
16187         override the base class DoResolveLValue.
16188
16189         * cs-parser.cs: Report errors cs574 and cs575 (destructor
16190         declarations) 
16191
16192         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
16193         (we need to load the address of the field here).  This fixes
16194         test-22. 
16195
16196         (FieldExpr.DoResolveLValue): Call the DoResolve
16197         function to initialize the Instance expression.
16198
16199         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
16200         correctly the GetEnumerator operation on a value type.
16201
16202         * cs-parser.jay: Add more simple parsing error catches.
16203
16204         * statement.cs (Switch): Add support for string switches.
16205         Handle null specially.
16206
16207         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
16208
16209 2001-11-28  Ravi Pratap  <ravi@ximian.com>
16210
16211         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
16212
16213         (declare_local_constant): New helper function.
16214
16215         * statement.cs (AddConstant): Keep a separate record of constants
16216
16217         (IsConstant): Implement to determine if a variable is a constant.
16218
16219         (GetConstantExpression): Implement.
16220
16221         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
16222
16223         * statement.cs (IsVariableDefined): Re-write.
16224
16225 2001-11-27  Ravi Pratap  <ravi@ximian.com>
16226
16227         * class.cs (TypeContainer::FindMembers): Look for constants
16228         in the case when we are looking for MemberTypes.Field
16229
16230         * expression.cs (MemberAccess::DoResolve): Check that in the
16231         case we are a FieldExpr and a Literal, we are not being accessed
16232         by an instance reference.
16233
16234         * cs-parser.jay (local_constant_declaration): Implement.
16235
16236         (declaration_statement): Implement for constant declarations.
16237
16238 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
16239
16240         * statement.cs (Switch): Catch double defaults.
16241
16242         (Switch): More work on the switch() statement
16243         implementation.  It works for integral values now, need to finish
16244         string support.
16245
16246
16247 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
16248
16249         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
16250         integer literals into other integer literals.  To be used by
16251         switch. 
16252
16253 2001-11-24  Ravi Pratap  <ravi@ximian.com>
16254
16255         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
16256         some memory.
16257
16258         (EmitDynamicInitializers): Cope with the above since we extract data
16259         directly from ArrayData now.
16260
16261         (ExpectInitializers): Keep track of whether initializers are mandatory
16262         or not.
16263
16264         (Bounds): Make it a hashtable to prevent the same dimension being 
16265         recorded for every element in that dimension.
16266
16267         (EmitDynamicInitializers): Fix bug which prevented the Set array method
16268         from being found.
16269
16270         Also fix bug which was causing the indices to be emitted in the reverse
16271         order.
16272
16273 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
16274
16275         * expression.cs (ArrayCreation): Implement the bits that Ravi left
16276         unfinished.  They do not work, because the underlying code is
16277         sloppy.
16278
16279 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
16280
16281         * cs-parser.jay: Remove bogus fixme.
16282
16283         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
16284         on Switch statement.
16285
16286 2001-11-23  Ravi Pratap  <ravi@ximian.com>
16287
16288         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
16289         the same. 
16290
16291         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
16292         parameter. Apparently, any expression is allowed. 
16293
16294         (ValidateInitializers): Update accordingly.
16295
16296         (CheckIndices): Fix some tricky bugs thanks to recursion.
16297
16298         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
16299         I was being completely brain-dead.
16300
16301         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
16302         and re-write acordingly.
16303
16304         (DelegateInvocation): Re-write accordingly.
16305
16306         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
16307
16308         (MakeByteBlob): Handle types more correctly.
16309
16310         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
16311         initialization from expressions but it is incomplete because I am a complete
16312         Dodo :-|
16313
16314 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
16315
16316         * statement.cs (If.Emit): Fix a bug that generated incorrect code
16317         on If.  Basically, we have to return `true' (ie, we do return to
16318         our caller) only if both branches of the if return.
16319
16320         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
16321         short-circuit operators, handle them as short circuit operators. 
16322
16323         (Cast.DoResolve): Resolve type.
16324         (Cast.Cast): Take an expression as the target type.
16325
16326         * cs-parser.jay (cast_expression): Remove old hack that only
16327         allowed a limited set of types to be handled.  Now we take a
16328         unary_expression and we resolve to a type during semantic
16329         analysis.
16330
16331         Use the grammar productions from Rhys to handle casts (this is
16332         not complete like Rhys syntax yet, we fail to handle that corner
16333         case that C# has regarding (-x), but we will get there.
16334
16335 2001-11-22  Ravi Pratap  <ravi@ximian.com>
16336
16337         * class.cs (EmitFieldInitializer): Take care of the case when we have a
16338         field which is an array type.
16339
16340         * cs-parser.jay (declare_local_variables): Support array initialization too.
16341
16342         * typemanager.cs (MakeKey): Implement.
16343
16344         (everywhere): Use the above appropriately.
16345
16346         * cs-parser.jay (for_statement): Update for array initialization while
16347         declaring variables.
16348
16349         * ecore.cs : The error message was correct, it's the variable's names that
16350         were misleading ;-) Make the code more readable.
16351
16352         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
16353         the correct type etc.
16354
16355         (ConvertExplicit): Handle Enum types by examining the underlying type.
16356
16357 2001-11-21  Ravi Pratap  <ravi@ximian.com>
16358
16359         * parameter.cs (GetCallingConvention): Always return
16360         CallingConventions.Standard for now.
16361
16362 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
16363
16364         * expression.cs (Binary.ResolveOperator): Update the values of `l'
16365         and `r' after calling DoNumericPromotions.
16366
16367         * ecore.cs: Fix error message (the types were in the wrong order).
16368
16369         * statement.cs (Foreach.ProbeCollectionType): Need to pass
16370         BindingFlags.Instance as well 
16371
16372         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
16373         implicit int literal conversion in an empty cast so that we
16374         propagate the right type upstream.
16375
16376         (UnboxCast): new class used to unbox value types.
16377         (Expression.ConvertExplicit): Add explicit type conversions done
16378         by unboxing.
16379
16380         (Expression.ImplicitNumericConversion): Oops, forgot to test for
16381         the target type before applying the implicit LongLiterals to ULong
16382         literal cast.
16383
16384 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
16385
16386         * cs-parser.jay (for_statement): Reworked the way For works: now
16387         we declare manually any variables that are introduced in
16388         for_initializer to solve the problem of having out-of-band code
16389         emition (that is what got for broken).
16390
16391         (declaration_statement): Perform the actual variable declaration
16392         that used to be done in local_variable_declaration here.
16393
16394         (local_variable_declaration): Do not declare anything, just pass
16395         the information on a DictionaryEntry
16396
16397 2001-11-20  Ravi Pratap  <ravi@ximian.com>
16398
16399         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
16400         re-write of the logic to now make it recursive.
16401
16402         (UpdateIndices): Re-write accordingly.
16403
16404         Store element data in a separate ArrayData list in the above methods.
16405
16406         (MakeByteBlob): Implement to dump the array data into a byte array.
16407
16408 2001-11-19  Ravi Pratap  <ravi@ximian.com>
16409
16410         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
16411         into CheckIndices.
16412
16413         * constant.cs (Define): Implement.
16414
16415         (EmitConstant): Re-write fully.
16416
16417         Pass in location info.
16418
16419         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
16420         respectively.
16421
16422         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
16423         DictionaryEntry since we need location info too.
16424
16425         (constant_declaration): Update accordingly.
16426
16427         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
16428         code into another method : UpdateIndices.
16429
16430 2001-11-18  Ravi Pratap  <ravi@ximian.com>
16431
16432         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
16433         some type checking etc.
16434
16435 2001-11-17  Ravi Pratap  <ravi@ximian.com>
16436
16437         * expression.cs (ArrayCreation::ValidateInitializers): Implement
16438         bits to provide dimension info if the user skips doing that.
16439
16440         Update second constructor to store the rank correctly.
16441
16442 2001-11-16  Ravi Pratap  <ravi@ximian.com>
16443
16444         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
16445         and try to implement.
16446
16447         * ../errors/cs0150.cs : Add.
16448
16449         * ../errors/cs0178.cs : Add.
16450
16451 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
16452
16453         * statement.cs: Implement foreach on multi-dimensional arrays. 
16454
16455         * parameter.cs (Parameters.GetParameterByName): Also lookup the
16456         name of the params argument.
16457
16458         * expression.cs: Use EmitStoreOpcode to get the right opcode while
16459         initializing the array.
16460
16461         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
16462         we can use this elsewhere.
16463
16464         * statement.cs: Finish implementation of foreach for single
16465         dimension arrays.
16466
16467         * cs-parser.jay: Use an out-of-band stack to pass information
16468         around, I wonder why I need this.
16469
16470         foreach_block: Make the new foreach_block the current_block.
16471
16472         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
16473         function used to return a static Parameters structure.  Used for
16474         empty parameters, as those are created very frequently.
16475
16476         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
16477
16478 2001-11-15  Ravi Pratap  <ravi@ximian.com>
16479
16480         * interface.cs : Default modifier is private, not public. The
16481         make verify test passes again.
16482
16483 2001-11-15  Ravi Pratap  <ravi@ximian.com>
16484
16485         * support.cs (ReflectionParameters): Fix logic to determine
16486         whether the last parameter is a params one. Test 9 passes again.
16487
16488         * delegate.cs (Populate): Register the builders we define with
16489         RegisterParameterForBuilder. Test 19 passes again.
16490
16491         * cs-parser.jay (property_declaration): Reference $6 instead
16492         of $$ to get at the location.
16493
16494         (indexer_declaration): Similar stuff.
16495
16496         (attribute): Ditto.
16497
16498         * class.cs (Property): Register parameters for the Get and Set methods
16499         if they exist. Test 23 passes again.
16500
16501         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
16502         call to EmitArguments as we are sure there aren't any params arguments. 
16503         Test 32 passes again.
16504
16505         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
16506         IndexOutOfRangeException. 
16507
16508         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
16509         Test 33 now passes again.
16510
16511 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
16512
16513         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
16514         broke a bunch of things.  Will have to come up with a better way
16515         of tracking locations.
16516
16517         * statement.cs: Implemented foreach for single dimension arrays.
16518
16519 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
16520
16521         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
16522         an error.  This removes the lookup from the critical path.
16523
16524         * cs-parser.jay: Removed use of temporary_loc, which is completely
16525         broken. 
16526
16527 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
16528
16529         * support.cs (ReflectionParameters.ParameterModifier): Report
16530         whether the argument is a PARAMS argument or not.
16531
16532         * class.cs: Set the attribute `ParamArrayAttribute' on the
16533         parameter argument.
16534
16535         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
16536         and cons_param_array_attribute (ConstructorInfo for
16537         ParamArrayAttribute)., 
16538
16539         * codegen.cs: Emit the return using the `Return' statement, that
16540         way we can report the error correctly for missing return values. 
16541
16542         * class.cs (Method.Emit): Clean up.
16543
16544         * expression.cs (Argument.Resolve): Take another argument: the
16545         location where this argument is used.  Notice that this is not
16546         part of the "Argument" class as to reduce the size of the
16547         structure (we know the approximate location anyways).
16548
16549         Test if the argument is a variable-reference, if not, then
16550         complain with a 206.
16551
16552         (Argument.Emit): Emit addresses of variables.
16553
16554         (Argument.FullDesc): Simplify.
16555
16556         (Invocation.DoResolve): Update for Argument.Resolve.
16557
16558         (ElementAccess.DoResolve): ditto.
16559
16560         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
16561         method should be virtual, as this method is always virtual.
16562
16563         (NewDelegate.DoResolve): Update for Argument.Resolve.
16564
16565         * class.cs (ConstructorInitializer.DoResolve): ditto.
16566
16567         * attribute.cs (Attribute.Resolve): ditto.
16568
16569 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
16570
16571         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
16572
16573         * expression.cs (ParameterReference): Drop IStackStorage and implement
16574         IAssignMethod instead. 
16575
16576         (LocalVariableReference): ditto.
16577
16578         * ecore.cs (FieldExpr): Drop IStackStorage and implement
16579         IAssignMethod instead. 
16580
16581 2001-11-13  Miguel de Icaza <miguel@ximian.com>
16582
16583         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
16584         enumerations that are used in heavily used structures derive from
16585         byte in a laughable and pathetic attempt to reduce memory usage.
16586         This is the kind of pre-optimzations that you should not do at
16587         home without adult supervision.
16588
16589         * expression.cs (UnaryMutator): New class, used to handle ++ and
16590         -- separatedly from the other unary operators.  Cleans up the
16591         code, and kills the ExpressionStatement dependency in Unary.
16592
16593         (Unary): Removed `method' and `Arguments' from this class, making
16594         it smaller, and moving it all to SimpleCall, so I can reuse this
16595         code in other locations and avoid creating a lot of transient data
16596         strucutres when not required.
16597
16598         * cs-parser.jay: Adjust for new changes.
16599
16600 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
16601
16602         * enum.cs (Enum.Populate): If there is a failure during
16603         definition, return
16604
16605         * cs-parser.jay (opt_enum_base): we used to catch type errors
16606         here, but this is really incorrect.  The type error should be
16607         catched during semantic analysis.
16608
16609 2001-12-11  Ravi Pratap  <ravi@ximian.com>
16610
16611         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
16612         current_local_parameters as expected since I, in my stupidity, had forgotten
16613         to do this :-)
16614
16615         * attribute.cs (GetValidPlaces): Fix stupid bug.
16616
16617         * class.cs (Method::Emit): Perform check on applicability of attributes.
16618
16619         (Constructor::Emit): Ditto.
16620
16621         (Field::Emit): Ditto.
16622
16623         (Field.Location): Store location information.
16624
16625         (Property, Event, Indexer, Operator): Ditto.
16626
16627         * cs-parser.jay (field_declaration): Pass in location for each field.
16628
16629         * ../errors/cs0592.cs : Add.
16630
16631 2001-11-12  Ravi Pratap  <ravi@ximian.com>
16632
16633         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
16634
16635         (InitCoreTypes): Update accordingly.
16636
16637         (RegisterAttrType, LookupAttr): Implement.
16638
16639         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
16640         info about the same.
16641
16642         (Resolve): Update to populate the above as necessary.
16643
16644         (Error592): Helper.
16645
16646         (GetValidPlaces): Helper to the above.
16647
16648         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
16649
16650         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
16651
16652 2001-11-12  Ravi Pratap  <ravi@ximian.com>
16653
16654         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
16655
16656         * ../errors/cs0617.cs : Add.
16657
16658 2001-11-11  Ravi Pratap  <ravi@ximian.com>
16659
16660         * enum.cs (Emit): Rename to Populate to be more consistent with what
16661         we expect it to do and when exactly it is called.
16662
16663         * class.cs, rootcontext.cs : Update accordingly.
16664
16665         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
16666         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
16667
16668         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
16669
16670         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
16671         of a fieldinfo using the above, when dealing with a FieldBuilder.
16672
16673 2001-11-10  Ravi Pratap  <ravi@ximian.com>
16674
16675         * ../errors/cs0031.cs : Add.
16676
16677         * ../errors/cs1008.cs : Add.
16678
16679         * ../errrors/cs0543.cs : Add.
16680
16681         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
16682         enum type.
16683
16684         (FindMembers): Implement.
16685
16686         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
16687         enums and delegates too.
16688
16689         (enum_types): Rename to builder_to_enum.
16690
16691         (delegate_types): Rename to builder_to_delegate.
16692
16693         * delegate.cs (FindMembers): Implement.
16694
16695 2001-11-09  Ravi Pratap  <ravi@ximian.com>
16696
16697         * typemanager.cs (IsEnumType): Implement.
16698
16699         * enum.cs (Emit): Re-write parts to account for the underlying type
16700         better and perform checking etc.
16701
16702         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
16703         of the underlying type.
16704
16705         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
16706         value
16707
16708         * enum.cs (error31): Helper to report error #31.
16709
16710         * cs-parser.jay (enum_declaration): Store location of each member too.
16711
16712         * enum.cs (member_to_location): New hashtable. 
16713
16714         (AddEnumMember): Update location hashtable.
16715
16716         (Emit): Use the location of each member while reporting errors.
16717
16718 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
16719
16720         * cs-parser.jay: A for_initializer if is a
16721         local_variable_declaration really ammount to have an implicit
16722         block with the variable declaration and no initializer for for.
16723
16724         * statement.cs (For.Emit): Cope with null initializers.
16725
16726         This fixes the infinite loop on for initializers.
16727
16728 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
16729
16730         * enum.cs: More cleanup.
16731
16732         * ecore.cs: Remove dead code.
16733
16734         * class.cs (Property.Emit): More simplification.
16735         (Event.Emit): ditto.
16736
16737         Reworked to have less levels of indentation.
16738
16739 2001-11-08  Ravi Pratap  <ravi@ximian.com>
16740
16741         * class.cs (Property): Emit attributes.
16742
16743         (Field): Ditto.
16744
16745         (Event): Ditto.
16746
16747         (Indexer): Ditto.
16748
16749         (Operator): Ditto.
16750
16751         * enum.cs (Emit): Ditto.
16752
16753         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
16754         Enums too.
16755
16756         * class.cs (Field, Event, etc.): Move attribute generation into the
16757         Emit method everywhere.
16758
16759         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
16760         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
16761         as we had no way of defining nested enums !
16762
16763         * rootcontext.cs : Adjust code accordingly.
16764
16765         * typemanager.cs (AddEnumType): To keep track of enum types separately.
16766
16767 2001-11-07  Ravi Pratap  <ravi@ximian.com>
16768
16769         * expression.cs (EvalConstantExpression): Move into ecore.cs
16770
16771         * enum.cs (Enum): Rename some members and make them public and readonly
16772         according to our convention.
16773
16774         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
16775         nothing else.
16776
16777         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
16778
16779         (Enum::Emit): Write a simple version for now which doesn't try to compute
16780         expressions. I shall modify this to be more robust in just a while.
16781
16782         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
16783
16784         (TypeContainer::CloseType): Create the Enum types too.
16785
16786         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
16787
16788         * expression.cs (EvalConstantExpression): Get rid of completely.
16789
16790         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
16791         user-defined values and other cases.
16792
16793         (IsValidEnumLiteral): Helper function.
16794
16795         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
16796         out there in the case we had a literal FieldExpr.
16797
16798         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
16799
16800         (Literalize): Revamp a bit to take two arguments.
16801
16802         (EnumLiteral): New class which derives from Literal to wrap enum literals.
16803
16804 2001-11-06  Ravi Pratap  <ravi@ximian.com>
16805
16806         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
16807
16808         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
16809
16810         (Resolve): Use the above to ensure we have proper initializers.
16811
16812 2001-11-05  Ravi Pratap  <ravi@ximian.com>
16813
16814         * expression.cs (Expression::EvalConstantExpression): New method to 
16815         evaluate constant expressions.
16816
16817         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
16818
16819 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
16820
16821         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
16822         in an array.
16823
16824         (Binary.ResolveOperator): Handle operator != (object a, object b)
16825         and operator == (object a, object b);
16826
16827         (Binary.DoNumericPromotions): Indicate whether the numeric
16828         promotion was possible.
16829
16830         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
16831         Implement.  
16832
16833         Made the ArrayAccess implement interface IAssignMethod instead of
16834         IStackStore as the order in which arguments are passed reflects
16835         this.
16836
16837         * assign.cs: Instead of using expr.ExprClass to select the way of
16838         assinging, probe for the IStackStore/IAssignMethod interfaces.
16839
16840         * typemanager.cs: Load InitializeArray definition.
16841
16842         * rootcontext.cs (RootContext.MakeStaticData): Used to define
16843         static data that can be used to initialize arrays. 
16844
16845 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
16846
16847         * expression.cs: Handle operator== and operator!= for booleans.
16848
16849         (Conditioal.Reduce): Implement reducer for the ?: operator.
16850
16851         (Conditional.Resolve): Implement dead code elimination.
16852
16853         (Binary.Resolve): Catch string literals and return a new
16854         concatenated string.
16855
16856         (Unary.Reduce): Implement reduction of unary expressions.
16857
16858         * ecore.cs: Split out the expression core handling here.
16859
16860         (Expression.Reduce): New method used to perform constant folding
16861         and CSE.  This is needed to support constant-expressions. 
16862
16863         * statement.cs (Statement.EmitBoolExpression): Pass true and false
16864         targets, and optimize for !x.
16865
16866 2001-11-04  Ravi Pratap  <ravi@ximian.com>
16867
16868         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
16869         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
16870         set custom atttributes.
16871
16872         * literal.cs (Literal::GetValue): New abstract method to return the actual
16873         value of the literal, cast as an object.
16874
16875         (*Literal): Implement GetValue method.
16876
16877         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
16878         expressions to the arraylist but objects of type Argument.
16879
16880         * class.cs (TypeContainer::Emit): Emit our attributes too.
16881
16882         (Method::Emit, Constructor::Emit): Ditto.
16883
16884         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
16885         to be ignoring earlier.
16886
16887 2001-11-03  Ravi Pratap  <ravi@ximian.com>
16888
16889         * attribute.cs (AttributeSection::Define): Implement to do the business
16890         of constructing a CustomAttributeBuilder.
16891
16892         (Attribute): New trivial class. Increases readability of code.  
16893
16894         * cs-parser.jay : Update accordingly.
16895
16896         (positional_argument_list, named_argument_list, named_argument): New rules
16897
16898         (attribute_arguments): Use the above so that we are more correct.
16899
16900 2001-11-02  Ravi Pratap  <ravi@ximian.com>
16901
16902         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
16903         to perform all checks for a method with a params parameter.
16904
16905         (Invocation::OverloadResolve): Update to use the above method and therefore
16906         cope correctly with params method invocations.
16907
16908         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
16909         params too.
16910
16911         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
16912         constructors in our parent too because we can't afford to miss out on 
16913         protected ones ;-)
16914
16915         * attribute.cs (AttributeSection): New name for the class Attribute
16916
16917         Other trivial changes to improve readability.
16918
16919         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
16920         use the new class names.
16921
16922 2001-11-01  Ravi Pratap  <ravi@ximian.com>
16923
16924         * class.cs (Method::Define): Complete definition for params types too
16925
16926         (Indexer::Define): Ditto.
16927
16928         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
16929         Cope everywhere with a request for info about the array parameter.
16930
16931 2001-11-01  Ravi Pratap  <ravi@ximian.com>
16932
16933         * tree.cs (RecordNamespace): Fix up to check for the correct key.
16934
16935         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
16936         local_variable_type to extract the string corresponding to the type.
16937
16938         (local_variable_type): Fixup the action to use the new helper method.
16939
16940         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
16941         go.
16942
16943         * expression.cs : Clean out code which uses the above.
16944
16945 2001-10-31  Ravi Pratap  <ravi@ximian.com>
16946
16947         * typemanager.cs (RegisterMethod): Check if we already have an existing key
16948         and bale out if necessary by returning a false.
16949
16950         (RegisterProperty): Ditto.
16951
16952         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
16953         and print out appropriate error messages.
16954
16955         * interface.cs (everywhere): Ditto.
16956
16957         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
16958         location to constructor.
16959
16960         * class.cs (Property, Event, Indexer): Update accordingly.
16961
16962         * ../errors/cs111.cs : Added.
16963
16964         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
16965         of a method, as laid down by the spec.
16966
16967         (Invocation::OverloadResolve): Use the above method.
16968
16969 2001-10-31  Ravi Pratap  <ravi@ximian.com>
16970
16971         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
16972         now take a TypeContainer and a Parameters object.
16973
16974         (ParameterData): Modify return type of ParameterModifier method to be 
16975         Parameter.Modifier and not a string.
16976
16977         (ReflectionParameters, InternalParameters): Update accordingly.
16978
16979         * expression.cs (Argument::GetParameterModifier): Same here.
16980
16981         * support.cs (InternalParameters::ParameterType): Find a better way of determining
16982         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
16983         symbol in it at all so maybe this is only for now.
16984
16985 2001-10-30  Ravi Pratap  <ravi@ximian.com>
16986
16987         * support.cs (InternalParameters): Constructor now takes an extra argument 
16988         which is the actual Parameters class.
16989
16990         (ParameterDesc): Update to provide info on ref/out modifiers.
16991
16992         * class.cs (everywhere): Update call to InternalParameters to pass in
16993         the second argument too.
16994
16995         * support.cs (ParameterData): Add ParameterModifier, which is a method 
16996         to return the modifier info [ref/out etc]
16997
16998         (InternalParameters, ReflectionParameters): Implement the above.
16999
17000         * expression.cs (Argument::ParameterModifier): Similar function to return
17001         info about the argument's modifiers.
17002
17003         (Invocation::OverloadResolve): Update to take into account matching modifiers 
17004         too.
17005
17006         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
17007         a new SetFormalParameters object which we pass to InternalParameters.
17008
17009 2001-10-30  Ravi Pratap  <ravi@ximian.com>
17010
17011         * expression.cs (NewArray): Merge into the ArrayCreation class.
17012
17013 2001-10-29  Ravi Pratap  <ravi@ximian.com>
17014
17015         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
17016         NewUserdefinedArray into one as there wasn't much of a use in having
17017         two separate ones.
17018
17019         * expression.cs (Argument): Change field's name to ArgType from Type.
17020
17021         (Type): New readonly property which returns the proper type, taking into 
17022         account ref/out modifiers.
17023
17024         (everywhere): Adjust code accordingly for the above.
17025
17026         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
17027         whether we are emitting for a ref or out parameter.
17028
17029         * expression.cs (Argument::Emit): Use the above field to set the state.
17030
17031         (LocalVariableReference::Emit): Update to honour the flag and emit the
17032         right stuff.
17033
17034         * parameter.cs (Attributes): Set the correct flags for ref parameters.
17035
17036         * expression.cs (Argument::FullDesc): New function to provide a full desc.
17037
17038         * support.cs (ParameterData): Add method ParameterDesc to the interface.
17039
17040         (ReflectionParameters, InternalParameters): Implement the above method.
17041
17042         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
17043         reporting errors.
17044
17045         (Invocation::FullMethodDesc): Ditto. 
17046
17047 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
17048
17049         * cs-parser.jay: Add extra production for the second form of array
17050         creation. 
17051
17052         * expression.cs (ArrayCreation): Update to reflect the above
17053         change. 
17054
17055         * Small changes to prepare for Array initialization.
17056
17057 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
17058
17059         * typemanager.cs (ImplementsInterface): interface might be null;
17060         Deal with this problem;
17061
17062         Also, we do store negative hits on the cache (null values), so use
17063         this instead of calling t.GetInterfaces on the type everytime.
17064
17065 2001-10-28  Ravi Pratap  <ravi@ximian.com>
17066
17067         * typemanager.cs (IsBuiltinType): New method to help determine the same.
17068
17069         * expression.cs (New::DoResolve): Get rid of array creation code and instead
17070         split functionality out into different classes.
17071
17072         (New::FormArrayType): Move into NewBuiltinArray.
17073
17074         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
17075         quite useless.
17076
17077         (NewBuiltinArray): New class to handle creation of built-in arrays.
17078
17079         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
17080         account creation of one-dimensional arrays.
17081
17082         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
17083
17084         (NewUserdefinedArray::DoResolve): Implement.
17085
17086         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
17087
17088         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
17089         we maintain inside the TypeManager. This is necessary to perform lookups on the
17090         module builder.
17091
17092         (LookupType): Update to perform GetType on the module builders too.     
17093
17094         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
17095
17096         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
17097
17098 2001-10-23  Ravi Pratap  <ravi@ximian.com>
17099
17100         * expression.cs (New::DoResolve): Implement guts of array creation.
17101
17102         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
17103
17104 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
17105
17106         * expression.cs: Fix bug I introduced lsat night that broke
17107         Delegates. 
17108
17109         (Expression.Resolve): Report a 246 error (can not resolve name)
17110         if we find a SimpleName in the stream.
17111
17112         (Expression.ResolveLValue): Ditto.
17113
17114         (Expression.ResolveWithSimpleName): This function is a variant of
17115         ResolveName, this one allows SimpleNames to be returned without a
17116         warning.  The only consumer of SimpleNames is MemberAccess
17117
17118 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
17119
17120         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
17121         might arrive here.  I have my doubts that this is correct.
17122
17123         * statement.cs (Lock): Implement lock statement.
17124
17125         * cs-parser.jay: Small fixes to support `lock' and `using'
17126
17127         * cs-tokenizer.cs: Remove extra space
17128
17129         * driver.cs: New flag --checked, allows to turn on integer math
17130         checking. 
17131
17132         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
17133         Threading.Monitor.Exit 
17134
17135 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
17136
17137         * expression.cs (IndexerAccess::DoResolveLValue): Set the
17138         Expression Class to be IndexerAccess.
17139
17140         Notice that Indexer::DoResolve sets the eclass to Value.
17141
17142 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
17143
17144         * class.cs (TypeContainer::Emit): Emit code for indexers.
17145
17146         * assign.cs (IAssignMethod): New interface implemented by Indexers
17147         and Properties for handling assignment.
17148
17149         (Assign::Emit): Simplify and reuse code. 
17150
17151         * expression.cs (IndexerAccess, PropertyExpr): Implement
17152         IAssignMethod, clean up old code. 
17153
17154 2001-10-22  Ravi Pratap  <ravi@ximian.com>
17155
17156         * typemanager.cs (ImplementsInterface): New method to determine if a type
17157         implements a given interface. Provides a nice cache too.
17158
17159         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
17160         method.
17161
17162         (ConvertReferenceExplicit): Ditto.
17163
17164         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
17165         various methods, with correct names etc.
17166
17167         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
17168         Operator.UnaryNegation.
17169
17170         * cs-parser.jay (operator_declarator): Be a little clever in the case where
17171         we have a unary plus or minus operator.
17172
17173         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
17174         UnaryMinus.
17175
17176         * everywhere : update accordingly.
17177
17178         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
17179         respectively.
17180
17181         * class.cs (Method::Define): For the case where we are implementing a method
17182         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
17183         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
17184
17185 2001-10-21  Ravi Pratap  <ravi@ximian.com>
17186
17187         * interface.cs (FindMembers): Implement to work around S.R.E
17188         lameness.
17189
17190         * typemanager.cs (IsInterfaceType): Implement.
17191
17192         (FindMembers): Update to handle interface types too.
17193
17194         * expression.cs (ImplicitReferenceConversion): Re-write bits which
17195         use IsAssignableFrom as that is not correct - it doesn't work.
17196
17197         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
17198         and accordingly override EmitStatement.
17199
17200         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
17201         using the correct logic :-)
17202
17203 2001-10-19  Ravi Pratap  <ravi@ximian.com>
17204
17205         * ../errors/cs-11.cs : Add to demonstrate error -11 
17206
17207 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
17208
17209         * assign.cs (Assign::Resolve): Resolve right hand side first, and
17210         then pass this as a hint to ResolveLValue.
17211
17212         * expression.cs (FieldExpr): Add Location information
17213
17214         (FieldExpr::LValueResolve): Report assignment to readonly
17215         variable. 
17216
17217         (Expression::ExprClassFromMemberInfo): Pass location information.
17218
17219         (Expression::ResolveLValue): Add new method that resolves an
17220         LValue. 
17221
17222         (Expression::DoResolveLValue): Default invocation calls
17223         DoResolve. 
17224
17225         (Indexers): New class used to keep track of indexers in a given
17226         Type. 
17227
17228         (IStackStore): Renamed from LValue, as it did not really describe
17229         what this did.  Also ResolveLValue is gone from this interface and
17230         now is part of Expression.
17231
17232         (ElementAccess): Depending on the element access type
17233
17234         * typemanager.cs: Add `indexer_name_type' as a Core type
17235         (System.Runtime.CompilerServices.IndexerNameAttribute)
17236
17237         * statement.cs (Goto): Take a location.
17238
17239 2001-10-18  Ravi Pratap  <ravi@ximian.com>
17240
17241         * delegate.cs (Delegate::VerifyDelegate): New method to verify
17242         if two delegates are compatible.
17243
17244         (NewDelegate::DoResolve): Update to take care of the case when
17245         we instantiate a delegate from another delegate.
17246
17247         * typemanager.cs (FindMembers): Don't even try to look up members
17248         of Delegate types for now.
17249
17250 2001-10-18  Ravi Pratap  <ravi@ximian.com>
17251
17252         * delegate.cs (NewDelegate): New class to take care of delegate
17253         instantiation.
17254
17255         * expression.cs (New): Split the delegate related code out into 
17256         the NewDelegate class.
17257
17258         * delegate.cs (DelegateInvocation): New class to handle delegate 
17259         invocation.
17260
17261         * expression.cs (Invocation): Split out delegate related code into
17262         the DelegateInvocation class.
17263
17264 2001-10-17  Ravi Pratap  <ravi@ximian.com>
17265
17266         * expression.cs (New::DoResolve): Implement delegate creation fully
17267         and according to the spec.
17268
17269         (New::DoEmit): Update to handle delegates differently.
17270
17271         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
17272         because of which we were printing out arguments in reverse order !
17273
17274         * delegate.cs (VerifyMethod): Implement to check if the given method
17275         matches the delegate.
17276
17277         (FullDelegateDesc): Implement.
17278
17279         (VerifyApplicability): Implement.
17280
17281         * expression.cs (Invocation::DoResolve): Update to accordingly handle
17282         delegate invocations too.
17283
17284         (Invocation::Emit): Ditto.
17285
17286         * ../errors/cs1593.cs : Added.
17287
17288         * ../errors/cs1594.cs : Added.
17289
17290         * delegate.cs (InstanceExpression, TargetMethod): New properties.
17291
17292 2001-10-16  Ravi Pratap  <ravi@ximian.com>
17293
17294         * typemanager.cs (intptr_type): Core type for System.IntPtr
17295
17296         (InitCoreTypes): Update for the same.
17297
17298         (iasyncresult_type, asynccallback_type): Ditto.
17299
17300         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
17301         correct.
17302
17303         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
17304         too.
17305
17306         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
17307         the builders for the 4 members of a delegate type :-)
17308
17309         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
17310         type.
17311
17312         * expression.cs (New::DoResolve): Implement guts for delegate creation.
17313
17314         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
17315
17316 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
17317
17318         * statement.cs (Break::Emit): Implement.   
17319         (Continue::Emit): Implement.
17320
17321         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
17322         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
17323         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
17324         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
17325         end loop
17326
17327         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
17328         properties that track the label for the current loop (begin of the
17329         loop and end of the loop).
17330
17331 2001-10-15  Ravi Pratap  <ravi@ximian.com>
17332
17333         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
17334         use of emitting anything at all.
17335
17336         * class.cs, rootcontext.cs : Get rid of calls to the same.
17337
17338         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
17339
17340         (Populate): Define the constructor correctly and set the implementation
17341         attributes.
17342
17343         * typemanager.cs (delegate_types): New hashtable to hold delegates that
17344         have been defined.
17345
17346         (AddDelegateType): Implement.
17347
17348         (IsDelegateType): Implement helper method.
17349
17350         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
17351
17352         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
17353         and accordingly handle it.
17354
17355         * delegate.cs (Populate): Take TypeContainer argument.
17356         Implement bits to define the Invoke method. However, I still haven't figured out
17357         how to take care of the native int bit :-(
17358
17359         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
17360         Qualify the name of the delegate, not its return type !
17361
17362         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
17363         conversion.
17364
17365         (StandardConversionExists): Checking for array types turns out to be recursive.
17366
17367         (ConvertReferenceExplicit): Implement array conversion.
17368
17369         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
17370
17371 2001-10-12  Ravi Pratap  <ravi@ximian.com>
17372
17373         * cs-parser.jay (delegate_declaration): Store the fully qualified
17374         name as it is a type declaration.
17375
17376         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
17377         readonly.
17378
17379         (DefineDelegate): Renamed from Define. Does the same thing essentially,
17380         as TypeContainer::DefineType.
17381
17382         (Populate): Method in which all the definition of the various methods (Invoke)
17383         etc is done.
17384
17385         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
17386         see.
17387
17388         (CloseDelegate): Finally creates the delegate.
17389
17390         * class.cs (TypeContainer::DefineType): Update to define delegates.
17391         (Populate, Emit and CloseType): Do the same thing here too.
17392
17393         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
17394         delegates in all these operations.
17395
17396 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
17397
17398         * expression.cs: LocalTemporary: a new expression used to
17399         reference a temporary that has been created.
17400
17401         * assign.cs: Handle PropertyAccess back here, so that we can
17402         provide the proper semantic access to properties.
17403
17404         * expression.cs (Expression::ConvertReferenceExplicit): Implement
17405         a few more explicit conversions. 
17406
17407         * modifiers.cs: `NEW' modifier maps to HideBySig.
17408
17409         * expression.cs (PropertyExpr): Make this into an
17410         ExpressionStatement, and support the EmitStatement code path. 
17411
17412         Perform get/set error checking, clean up the interface.
17413
17414         * assign.cs: recognize PropertyExprs as targets, and if so, turn
17415         them into toplevel access objects.
17416
17417 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
17418
17419         * expression.cs: PropertyExpr::PropertyExpr: use work around the
17420         SRE.
17421
17422         * typemanager.cs: Keep track here of our PropertyBuilders again to
17423         work around lameness in SRE.
17424
17425 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
17426
17427         * expression.cs (LValue::LValueResolve): New method in the
17428         interface, used to perform a second resolution pass for LValues. 
17429
17430         (This::DoResolve): Catch the use of this in static methods.
17431
17432         (This::LValueResolve): Implement.
17433
17434         (This::Store): Remove warning, assigning to `this' in structures
17435         is 
17436
17437         (Invocation::Emit): Deal with invocation of
17438         methods on value types.  We need to pass the address to structure
17439         methods rather than the object itself.  (The equivalent code to
17440         emit "this" for structures leaves the entire structure on the
17441         stack instead of a pointer to it). 
17442
17443         (ParameterReference::DoResolve): Compute the real index for the
17444         argument based on whether the method takes or not a `this' pointer
17445         (ie, the method is static).
17446
17447         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
17448         value types returned from functions when we need to invoke a
17449         method on the sturcture.
17450
17451
17452 2001-10-11  Ravi Pratap  <ravi@ximian.com>
17453
17454         * class.cs (TypeContainer::DefineType): Method to actually do the business of
17455         defining the type in the Modulebuilder or Typebuilder. This is to take
17456         care of nested types which need to be defined on the TypeBuilder using
17457         DefineNestedMethod.
17458
17459         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
17460         methods in RootContext, only ported to be part of TypeContainer.
17461
17462         (TypeContainer::GetInterfaceOrClass): Ditto.
17463
17464         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
17465
17466         * interface.cs (Interface::DefineInterface): New method. Does exactly
17467         what RootContext.CreateInterface did earlier, only it takes care of nested types 
17468         too.
17469
17470         (Interface::GetInterfaces): Move from RootContext here and port.
17471
17472         (Interface::GetInterfaceByName): Same here.
17473
17474         * rootcontext.cs (ResolveTree): Re-write.
17475
17476         (PopulateTypes): Re-write.
17477
17478         * class.cs (TypeContainer::Populate): Populate nested types too.
17479         (TypeContainer::Emit): Emit nested members too.
17480
17481         * typemanager.cs (AddUserType): Do not make use of the FullName property,
17482         instead just use the name argument passed in as it is already fully
17483         qualified.
17484
17485         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
17486         to TypeContainer mapping to see if a type is user-defined.
17487
17488         * class.cs (TypeContainer::CloseType): Implement. 
17489
17490         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
17491         the default constructor.
17492
17493         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
17494         twice.
17495
17496         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
17497
17498         * interface.cs (CloseType): Create the type here.
17499
17500         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
17501         the hierarchy.
17502
17503         Remove all the methods which are now in TypeContainer.
17504
17505 2001-10-10  Ravi Pratap  <ravi@ximian.com>
17506
17507         * delegate.cs (Define): Re-write bits to define the delegate
17508         correctly.
17509
17510 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
17511
17512         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
17513
17514         * expression.cs (ImplicitReferenceConversion): handle null as well
17515         as a source to convert to any reference type.
17516
17517         * statement.cs (Return): Perform any implicit conversions to
17518         expected return type.  
17519
17520         Validate use of return statement.  
17521
17522         * codegen.cs (EmitContext): Pass the expected return type here.
17523
17524         * class.cs (Method, Constructor, Property): Pass expected return
17525         type to EmitContext.
17526
17527 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
17528
17529         * expression.cs: Make DoResolve take an EmitContext instead of a
17530         TypeContainer.
17531
17532         Replaced `l' and `location' for `loc', for consistency.
17533
17534         (Error, Warning): Remove unneeded Tc argument.
17535
17536         * assign.cs, literal.cs, constant.cs: Update to new calling
17537         convention. 
17538
17539         * codegen.cs: EmitContext now contains a flag indicating whether
17540         code is being generated in a static method or not.
17541
17542         * cs-parser.jay: DecomposeQI, new function that replaces the old
17543         QualifiedIdentifier.  Now we always decompose the assembled
17544         strings from qualified_identifier productions into a group of
17545         memberaccesses.
17546
17547 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
17548
17549         * rootcontext.cs: Deal with field-less struct types correctly now
17550         by passing the size option to Define Type.
17551
17552         * class.cs: Removed hack that created one static field. 
17553
17554 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
17555
17556         * statement.cs: Moved most of the code generation here. 
17557
17558 2001-10-09  Ravi Pratap  <ravi@ximian.com>
17559
17560         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
17561         seem very right.
17562
17563         (ElementAccess): Remove useless bits for now - keep checks as the spec
17564         says.
17565
17566 2001-10-08  Ravi Pratap  <ravi@ximian.com>
17567
17568         * expression.cs (ElementAccess::DoResolve): Remove my crap code
17569         and start performing checks according to the spec.
17570
17571 2001-10-07  Ravi Pratap  <ravi@ximian.com>
17572
17573         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
17574         rank_specifiers instead.
17575
17576         (rank_specifiers): Change the order in which the rank specifiers are stored
17577
17578         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
17579
17580         * expression.cs (ElementAccess): Implement the LValue interface too.
17581
17582 2001-10-06  Ravi Pratap  <ravi@ximian.com>
17583
17584         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
17585         except that user defined conversions are not included.
17586
17587         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
17588         perform the conversion of the return type, if necessary.
17589
17590         (New::DoResolve): Check whether we are creating an array or an object
17591         and accordingly do the needful.
17592
17593         (New::Emit): Same here.
17594
17595         (New::DoResolve): Implement guts of array creation.
17596
17597         (New::FormLookupType): Helper function.
17598
17599 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
17600
17601         * codegen.cs: Removed most of the code generation here, and move the
17602         corresponding code generation bits to the statement classes. 
17603
17604         Added support for try/catch/finalize and throw.
17605
17606         * cs-parser.jay: Added support for try/catch/finalize.
17607
17608         * class.cs: Catch static methods having the flags override,
17609         virtual or abstract.
17610
17611         * expression.cs (UserCast): This user cast was not really doing
17612         what it was supposed to do.  Which is to be born in fully resolved
17613         state.  Parts of the resolution were being performed at Emit time! 
17614
17615         Fixed this code.
17616
17617 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
17618
17619         * expression.cs: Implicity convert the result from UserCast.
17620
17621 2001-10-05  Ravi Pratap  <ravi@ximian.com>
17622
17623         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
17624         prevented it from working correctly. 
17625
17626         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
17627         merely ConvertImplicit.
17628
17629 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
17630
17631         * typemanager.cs: Make the LookupTypeContainer function static,
17632         and not per-instance.  
17633
17634         * class.cs: Make static FindMembers (the one that takes a Type
17635         argument). 
17636
17637         * codegen.cs: Add EmitForeach here.
17638
17639         * cs-parser.jay: Make foreach a toplevel object instead of the
17640         inline expansion, as we need to perform semantic analysis on it. 
17641
17642 2001-10-05  Ravi Pratap  <ravi@ximian.com>
17643
17644         * expression.cs (Expression::ImplicitUserConversion): Rename to
17645         UserDefinedConversion.
17646
17647         (Expression::UserDefinedConversion): Take an extra argument specifying 
17648         whether we look for explicit user conversions too.
17649
17650         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
17651
17652         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
17653
17654         (ExplicitUserConversion): Make it a call to UserDefinedConversion
17655         with the appropriate arguments.
17656
17657         * cs-parser.jay (cast_expression): Record location too.
17658
17659         * expression.cs (Cast): Record location info.
17660
17661         (Expression::ConvertExplicit): Take location argument.
17662
17663         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
17664         to determine if we are doing explicit conversions.
17665
17666         (UserCast::Emit): Update accordingly.
17667
17668         (Expression::ConvertExplicit): Report an error if everything fails.
17669
17670         * ../errors/cs0030.cs : Add.
17671
17672 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
17673
17674         * modifiers.cs: If the ABSTRACT keyword is present, also set the
17675         virtual and newslot bits. 
17676
17677         * class.cs (TypeContainer::RegisterRequiredImplementations):
17678         Record methods we need.
17679
17680         (TypeContainer::MakeKey): Helper function to make keys for
17681         MethodBases, since the Methodbase key is useless.
17682
17683         (TypeContainer::Populate): Call RegisterRequiredImplementations
17684         before defining the methods.   
17685
17686         Create a mapping for method_builders_to_methods ahead of time
17687         instead of inside a tight loop.
17688
17689         (::RequireMethods):  Accept an object as the data to set into the
17690         hashtable so we can report interface vs abstract method mismatch.
17691
17692 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
17693
17694         * report.cs: Make all of it static.
17695
17696         * rootcontext.cs: Drop object_type and value_type computations, as
17697         we have those in the TypeManager anyways.
17698
17699         Drop report instance variable too, now it is a global.
17700
17701         * driver.cs: Use try/catch on command line handling.
17702
17703         Add --probe option to debug the error reporting system with a test
17704         suite. 
17705
17706         * report.cs: Add support for exiting program when a probe
17707         condition is reached.
17708
17709 2001-10-03  Ravi Pratap  <ravi@ximian.com>
17710
17711         * expression.cs (Binary::DoNumericPromotions): Fix the case when
17712         we do a forcible conversion regardless of type, to check if 
17713         ForceConversion returns a null.
17714
17715         (Binary::error19): Use location to report error.
17716
17717         (Unary::error23): Use location here too.
17718
17719         * ../errors/cs0019.cs : Check in.
17720
17721         * ../errors/cs0023.cs : Check in.
17722
17723         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
17724         case of a non-null MethodInfo object with a length of 0 !
17725
17726         (Binary::ResolveOperator): Flag error if overload resolution fails to find
17727         an applicable member - according to the spec :-)
17728         Also fix logic to find members in base types.
17729
17730         (Unary::ResolveOperator): Same here.
17731
17732         (Unary::report23): Change name to error23 and make first argument a TypeContainer
17733         as I was getting thoroughly confused between this and error19 :-)
17734
17735         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
17736         (::FindMostEncompassedType): Implement.
17737         (::FindMostEncompassingType): Implement.
17738         (::StandardConversionExists): Implement.
17739
17740         (UserImplicitCast): Re-vamp. We now need info about most specific
17741         source and target types so that we can do the necessary conversions.
17742
17743         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
17744         mathematical union with no duplicates.
17745
17746 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
17747
17748         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
17749         in order from base classes to child classes, so that we can in
17750         child classes look up in our parent for method names and
17751         attributes (required for handling abstract, virtual, new, override
17752         constructs: we need to instrospect our base class, and if we dont
17753         populate the classes in order, the introspection might be
17754         incorrect.  For example, a method could query its parent before
17755         the parent has any methods and would determine that the parent has
17756         no abstract methods (while it could have had them)).
17757
17758         (RootContext::CreateType): Record the order in which we define the
17759         classes.
17760
17761 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
17762
17763         * class.cs (TypeContainer::Populate): Also method definitions can
17764         fail now, keep track of this.
17765
17766         (TypeContainer::FindMembers): Implement support for
17767         DeclaredOnly/noDeclaredOnly flag.
17768
17769         (Constructor::Emit) Return the ConstructorBuilder.
17770
17771         (Method::Emit) Return the MethodBuilder. 
17772         Check for abstract or virtual methods to be public.
17773
17774         * rootcontext.cs (RootContext::CreateType): Register all the
17775         abstract methods required for the class to be complete and the
17776         interface methods that must be implemented. 
17777
17778         * cs-parser.jay: Report error 501 (method requires body if it is
17779         not marked abstract or extern).
17780
17781         * expression.cs (TypeOf::Emit): Implement.
17782
17783         * typemanager.cs: runtime_handle_type, new global type.
17784
17785         * class.cs (Property::Emit): Generate code for properties.
17786
17787 2001-10-02  Ravi Pratap  <ravi@ximian.com>
17788
17789         * expression.cs (Unary::ResolveOperator): Find operators on base type
17790         too - we now conform exactly to the spec.
17791
17792         (Binary::ResolveOperator): Same here.
17793
17794         * class.cs (Operator::Define): Fix minor quirk in the tests.
17795
17796         * ../errors/cs0215.cs : Added.
17797
17798         * ../errors/cs0556.cs : Added.
17799
17800         * ../errors/cs0555.cs : Added.
17801
17802 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
17803
17804         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
17805         single integer which is really efficient
17806
17807 2001-10-01  Ravi Pratap  <ravi@ximian.com>
17808
17809         *  expression.cs (Expression::ImplicitUserConversion): Use location
17810         even in the case when we are examining True operators.
17811  
17812         * class.cs (Operator::Define): Perform extensive checks to conform
17813         with the rules for operator overloading in the spec.
17814
17815         * expression.cs (Expression::ImplicitReferenceConversion): Implement
17816         some of the other conversions mentioned in the spec.
17817
17818         * typemanager.cs (array_type): New static member for the System.Array built-in
17819         type.
17820
17821         (cloneable_interface): For System.ICloneable interface.
17822
17823         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
17824         we start resolving the tree and populating types.
17825
17826         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
17827  
17828 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
17829
17830         * expression.cs (Expression::ExprClassFromMemberInfo,
17831         Expression::Literalize): Create literal expressions from
17832         FieldInfos which are literals.
17833
17834         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
17835         type casts, because they were wrong.  The test suite in tests
17836         caught these ones.
17837
17838         (ImplicitNumericConversion): ushort to ulong requires a widening
17839         cast. 
17840
17841         Int32 constant to long requires widening cast as well.
17842
17843         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
17844         for integers because the type on the stack is not i4.
17845
17846 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
17847
17848         * expression.cs (report118): require location argument. 
17849
17850         * parameter.cs: Do not dereference potential null value.
17851
17852         * class.cs: Catch methods that lack the `new' keyword when
17853         overriding a name.  Report warnings when `new' is used without
17854         anything being there to override.
17855
17856         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
17857
17858         * class.cs: Only add constructor to hashtable if it is non-null
17859         (as now constructors can fail on define).
17860
17861         (TypeManager, Class, Struct): Take location arguments.
17862
17863         Catch field instance initialization in structs as errors.
17864
17865         accepting_filter: a new filter for FindMembers that is static so
17866         that we dont create an instance per invocation.
17867
17868         (Constructor::Define): Catch errors where a struct constructor is
17869         parameterless 
17870
17871         * cs-parser.jay: Pass location information for various new
17872         constructs. 
17873
17874         * delegate.cs (Delegate): take a location argument.
17875
17876         * driver.cs: Do not call EmitCode if there were problesm in the
17877         Definition of the types, as many Builders wont be there. 
17878
17879         * decl.cs (Decl::Decl): Require a location argument.
17880
17881         * cs-tokenizer.cs: Handle properly hex constants that can not fit
17882         into integers, and find the most appropiate integer for it.
17883
17884         * literal.cs: Implement ULongLiteral.
17885
17886         * rootcontext.cs: Provide better information about the location of
17887         failure when CreateType fails.
17888
17889 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
17890
17891         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
17892         as well.
17893
17894         * expression.cs (Binary::CheckShiftArguments): Add missing type
17895         computation.
17896         (Binary::ResolveOperator): Add type to the logical and and logical
17897         or, Bitwise And/Or and Exclusive Or code paths, it was missing
17898         before.
17899
17900         (Binary::DoNumericPromotions): In the case where either argument
17901         is ulong (and most signed types combined with ulong cause an
17902         error) perform implicit integer constant conversions as well.
17903
17904 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
17905
17906         * expression.cs (UserImplicitCast): Method should always be
17907         non-null. 
17908         (Invocation::BetterConversion): Simplified test for IntLiteral.
17909
17910         (Expression::ImplicitNumericConversion): Split this routine out.
17911         Put the code that performs implicit constant integer conversions
17912         here. 
17913
17914         (Expression::Resolve): Become a wrapper around DoResolve so we can
17915         check eclass and type being set after resolve.
17916
17917         (Invocation::Badness): Remove this dead function
17918
17919         (Binary::ResolveOperator): Do not compute the expensive argumnets
17920         unless we have a union for it.
17921
17922         (Probe::Emit): Is needs to do an isinst and then
17923         compare against null.
17924
17925         (::CanConvert): Added Location argument.  If the Location argument
17926         is null (Location.Null), then we do not report errors.  This is
17927         used by the `probe' mechanism of the Explicit conversion.  We do
17928         not want to generate an error for something that the user
17929         explicitly requested to be casted.  But the pipeline for an
17930         explicit cast first tests for potential implicit casts.
17931
17932         So for now, if the Location is null, it means `Probe only' to
17933         avoid adding another argument.   Might have to revise this
17934         strategy later.
17935
17936         (ClassCast): New class used to type cast objects into arbitrary
17937         classes (used in Explicit Reference Conversions).
17938
17939         Implement `as' as well.
17940
17941         Reverted all the patches from Ravi below: they were broken:
17942
17943                 * The use of `level' as a mechanism to stop recursive
17944                   invocations is wrong.  That was there just to catch the
17945                   bug with a strack trace but not as a way of addressing
17946                   the problem.
17947
17948                   To fix the problem we have to *understand* what is going
17949                   on and the interactions and come up with a plan, not
17950                   just get things going.
17951
17952                 * The use of the type conversion cache that I proposed
17953                   last night had an open topic: How does this work across
17954                   protection domains.  A user defined conversion might not
17955                   be public in the location where we are applying the
17956                   conversion, a different conversion might be selected
17957                   (ie, private A->B (better) but public B->A (worse),
17958                   inside A, A->B applies, but outside it, B->A will
17959                   apply).
17960
17961                 * On top of that (ie, even if the above is solved),
17962                   conversions in a cache need to be abstract.  Ie, `To
17963                   convert from an Int to a Short use an OpcodeCast', not
17964                   `To convert from an Int to a Short use the OpcodeCast on
17965                   the variable 5' (which is what this patch was doing).
17966
17967 2001-09-28  Ravi Pratap  <ravi@ximian.com>
17968
17969         * expression.cs (Invocation::ConversionExists): Re-write to use
17970         the conversion cache
17971
17972         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
17973         cache all conversions done, not just user-defined ones.
17974
17975         (Invocation::BetterConversion): The real culprit. Use ConversionExists
17976         to determine if a conversion exists instead of acutually trying to 
17977         perform the conversion. It's faster too.
17978
17979         (Expression::ConvertExplicit): Modify to use ConversionExists to check
17980         and only then attempt the implicit conversion.
17981
17982 2001-09-28  Ravi Pratap  <ravi@ximian.com>
17983
17984         * expression.cs (ConvertImplicit): Use a cache for conversions
17985         already found. Check level of recursion and bail out if necessary.
17986
17987 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
17988
17989         * typemanager.cs (string_concat_string_string, string_concat_object_object):
17990         Export standard methods that we expect for string operations.
17991
17992         * statement.cs (Block::UsageWarning): Track usage of variables and
17993         report the errors for not used variables.
17994
17995         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
17996         operator. 
17997
17998 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
17999
18000         * codegen.cs: remove unnneded code 
18001
18002         * expression.cs: Removed BuiltinTypeAccess class
18003
18004         Fix the order in which implicit conversions are
18005         done.  
18006
18007         The previous fixed dropped support for boxed conversions (adding a
18008         test to the test suite now)
18009
18010         (UserImplicitCast::CanConvert): Remove test for source being null,
18011         that code is broken.  We should not feed a null to begin with, if
18012         we do, then we should track the bug where the problem originates
18013         and not try to cover it up here.
18014
18015         Return a resolved expression of type UserImplicitCast on success
18016         rather than true/false.  Ravi: this is what I was talking about,
18017         the pattern is to use a static method as a "constructor" for
18018         objects. 
18019
18020         Also, do not create arguments until the very last minute,
18021         otherwise we always create the arguments even for lookups that
18022         will never be performed. 
18023
18024         (UserImplicitCast::Resolve): Eliminate, objects of type
18025         UserImplicitCast are born in a fully resolved state. 
18026
18027         * typemanager.cs (InitCoreTypes): Init also value_type
18028         (System.ValueType). 
18029
18030         * expression.cs (Cast::Resolve): First resolve the child expression.
18031
18032         (LValue): Add new method AddressOf to be used by
18033         the `&' operator.  
18034
18035         Change the argument of Store to take an EmitContext instead of an
18036         ILGenerator, because things like FieldExpr need to be able to call
18037         their children expression to generate the instance code. 
18038
18039         (Expression::Error, Expression::Warning): Sugar functions for
18040         reporting errors.
18041
18042         (Expression::MemberLookup): Accept a TypeContainer instead of a
18043         Report as the first argument.
18044
18045         (Expression::ResolvePrimary): Killed.  I still want to improve
18046         this as currently the code is just not right.
18047
18048         (Expression::ResolveMemberAccess): Simplify, but it is still
18049         wrong. 
18050
18051         (Unary::Resolve): Catch errors in AddressOf operators.
18052
18053         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
18054         index to a byte for the short-version, or the compiler will choose
18055         the wrong Emit call, which generates the wrong data.
18056
18057         (ParameterReference::Emit, ::Store): same.
18058
18059         (FieldExpr::AddressOf): Implement.
18060
18061         * typemanager.cs: TypeManager: made public variable instead of
18062         property.
18063
18064         * driver.cs: document --fatal.
18065
18066         * report.cs (ErrorMessage, WarningMessage): new names for the old
18067         Error and Warning classes.
18068
18069         * cs-parser.jay (member_access): Turn built-in access to types
18070         into a normal simplename
18071
18072 2001-09-27  Ravi Pratap  <ravi@ximian.com>
18073
18074         * expression.cs (Invocation::BetterConversion): Fix to cope
18075         with q being null, since this was introducing a bug.
18076
18077         * expression.cs (ConvertImplicit): Do built-in conversions first.
18078
18079 2001-09-27  Ravi Pratap  <ravi@ximian.com>
18080
18081         * expression.cs (UserImplicitCast::Resolve): Fix bug.
18082
18083 2001-09-27  Ravi Pratap  <ravi@ximian.com>
18084
18085         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
18086         I had introduced long ago (what's new ?).
18087
18088         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
18089         the work of all the checking. 
18090         (ConvertImplicit): Call CanConvert and only then create object if necessary.
18091         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
18092
18093         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
18094         that is the right way. 
18095
18096         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
18097         overloading resolution. Use everywhere instead of cutting and pasting code.
18098
18099         (Binary::ResolveOperator): Use MakeUnionSet.
18100
18101         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
18102         we have to convert to bool types. Not complete yet.
18103
18104 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
18105
18106         * typemanager.cs (TypeManager::CSharpName): support ushort.
18107
18108         * expression.cs (Expression::TryImplicitIntConversion): Attempts
18109         to provide an expression that performsn an implicit constant int
18110         conversion (section 6.1.6).
18111         (Expression::ConvertImplicitRequired): Reworked to include
18112         implicit constant expression conversions.
18113
18114         (Expression::ConvertNumericExplicit): Finished.
18115
18116         (Invocation::Emit): If InstanceExpression is null, then it means
18117         that we perform a call on this.
18118
18119 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
18120
18121         * expression.cs (Unary::Emit): Remove some dead code.
18122         (Probe): Implement Resolve and Emit for `is'.
18123         (Expression::ConvertImplicitRequired): Attempt to do constant
18124         expression conversions here.  Maybe should be moved to
18125         ConvertImplicit, but I am not sure.
18126         (Expression::ImplicitLongConstantConversionPossible,
18127         Expression::ImplicitIntConstantConversionPossible): New functions
18128         that tell whether is it possible to apply an implicit constant
18129         expression conversion.
18130
18131         (ConvertNumericExplicit): Started work on explicit numeric
18132         conversions.
18133
18134         * cs-parser.jay: Update operator constants.
18135
18136         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
18137         (Parameters::GetSignature): Hook up VerifyArgs here.
18138         (Parameters::VerifyArgs): Verifies that no two arguments have the
18139         same name. 
18140
18141         * class.cs (Operator): Update the operator names to reflect the
18142         ones that the spec expects (as we are just stringizing the
18143         operator names).
18144
18145         * expression.cs (Unary::ResolveOperator): Fix bug: Use
18146         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
18147         previous usage did only work for our methods.
18148         (Expression::ConvertImplicit): Handle decimal implicit numeric
18149         conversions as well.
18150         (Expression::InternalTypeConstructor): Used to invoke constructors
18151         on internal types for default promotions.
18152
18153         (Unary::Emit): Implement special handling for the pre/post
18154         increment/decrement for overloaded operators, as they need to have
18155         the same semantics as the other operators.
18156
18157         (Binary::ResolveOperator): ditto.
18158         (Invocation::ConversionExists): ditto.
18159         (UserImplicitCast::Resolve): ditto.
18160
18161 2001-09-26  Ravi Pratap  <ravi@ximian.com>
18162
18163         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
18164         operator, return after emitting body. Regression tests pass again !
18165
18166         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
18167         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
18168         (Invocation::OverloadResolve): Ditto.
18169         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
18170
18171         * everywhere : update calls to the above methods accordingly.
18172
18173 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
18174
18175         * assign.cs (Assign): Make it inherit from ExpressionStatement.
18176
18177         * expression.cs (ExpressionStatement): New base class used for
18178         expressions that can appear in statements, so that we can provide
18179         an alternate path to generate expression that do not leave a value
18180         on the stack.
18181
18182         (Expression::Emit, and all the derivatives): We no longer return
18183         whether a value is left on the stack or not.  Every expression
18184         after being emitted leaves a single value on the stack.
18185
18186         * codegen.cs (EmitContext::EmitStatementExpression): Use the
18187         facilties of ExpressionStatement if possible.
18188
18189         * cs-parser.jay: Update statement_expression.
18190
18191 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
18192
18193         * driver.cs: Change the wording of message
18194
18195 2001-09-25  Ravi Pratap  <ravi@ximian.com>
18196
18197         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
18198         the type of the expression to the return type of the method if
18199         we have an overloaded operator match ! The regression tests pass again !
18200         (Unary::ResolveOperator): Ditto.
18201
18202         * expression.cs (Invocation::ConversionExists): Correct the member lookup
18203         to find "op_Implicit", not "implicit" ;-)
18204         (UserImplicitCast): New class to take care of user-defined implicit conversions.
18205         (ConvertImplicit, ForceConversion): Take TypeContainer argument
18206
18207         * everywhere : Correct calls to the above accordingly.
18208
18209         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
18210         (ConvertImplicit): Do user-defined conversion if it exists.
18211
18212 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
18213
18214         * assign.cs: track location.
18215         (Resolve): Use implicit conversions on assignment.
18216
18217         * literal.cs: Oops.  Not good, Emit of short access values should
18218         pass (Bytes) or the wrong argument will be selected.
18219
18220         * expression.cs (Unary::Emit): Emit code for -expr.
18221
18222         (Unary::ResolveOperator): Handle `Substract' for non-constants
18223         (substract from zero from the non-constants).
18224         Deal with Doubles as well. 
18225
18226         (Expression::ConvertImplicitRequired): New routine that reports an
18227         error if no implicit conversion exists. 
18228
18229         (Invocation::OverloadResolve): Store the converted implicit
18230         expressions if we make them
18231
18232 2001-09-24  Ravi Pratap  <ravi@ximian.com>
18233
18234         * class.cs (ConstructorInitializer): Take a Location argument.
18235         (ConstructorBaseInitializer): Same here.
18236         (ConstructorThisInitializer): Same here.
18237
18238         * cs-parser.jay : Update all calls accordingly.
18239
18240         * expression.cs (Unary, Binary, New): Take location argument.
18241         Update accordingly everywhere.
18242
18243         * cs-parser.jay : Update all calls to the above to take a location
18244         argument.
18245
18246         * class.cs : Ditto.
18247
18248 2001-09-24  Ravi Pratap  <ravi@ximian.com>
18249
18250         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
18251         (Invocation::BetterConversion): Same here
18252         (Invocation::ConversionExists): Ditto.
18253
18254         (Invocation::ConversionExists): Implement.
18255
18256 2001-09-22  Ravi Pratap  <ravi@ximian.com>
18257
18258         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
18259         Also take an additional TypeContainer argument.
18260
18261         * All over : Pass in TypeContainer as argument to OverloadResolve.
18262
18263         * typemanager.cs (CSharpName): Update to check for the string type and return
18264         that too.
18265
18266         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
18267         a given method.
18268
18269 2001-09-21  Ravi Pratap  <ravi@ximian.com>
18270
18271         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
18272         (Invocation::BetterFunction): Implement.
18273         (Invocation::BetterConversion): Implement.
18274         (Invocation::ConversionExists): Skeleton, no implementation yet.
18275
18276         Okay, things work fine !
18277
18278 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
18279
18280         * typemanager.cs: declare and load enum_type, delegate_type and
18281         void_type. 
18282
18283         * expression.cs (Expression::Emit): Now emit returns a value that
18284         tells whether a value is left on the stack or not.  This strategy
18285         might be reveted tomorrow with a mechanism that would address
18286         multiple assignments.
18287         (Expression::report118): Utility routine to report mismatches on
18288         the ExprClass.
18289
18290         (Unary::Report23): Report impossible type/operator combination
18291         utility function.
18292
18293         (Unary::IsIncrementableNumber): Whether the type can be
18294         incremented or decremented with add.
18295         (Unary::ResolveOperator): Also allow enumerations to be bitwise
18296         complemented. 
18297         (Unary::ResolveOperator): Implement ++, !, ~,
18298
18299         (Invocation::Emit): Deal with new Emit convetion.
18300
18301         * All Expression derivatives: Updated their Emit method to return
18302         whether they leave values on the stack or not.
18303
18304         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
18305         stack for expressions that are statements. 
18306
18307 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
18308
18309         * expression.cs (LValue): New interface.  Must be implemented by
18310         LValue objects.
18311         (LocalVariableReference, ParameterReference, FieldExpr): Implement
18312         LValue interface.
18313
18314         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
18315         interface for generating code, simplifies the code.
18316
18317 2001-09-20  Ravi Pratap  <ravi@ximian.com>
18318
18319         * expression.cs (everywhere): Comment out return statements in ::Resolve
18320         methods to avoid the warnings.
18321
18322 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
18323
18324         * driver.cs (parse): Report error 2001 if we can not open the
18325         source file.
18326
18327         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
18328         not resolve it.
18329
18330         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
18331         object. 
18332
18333         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
18334         otherwise nested blocks end up with the same index.
18335
18336         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
18337
18338         * expression.cs:  Instead of having FIXMEs in the Resolve
18339         functions, throw exceptions so it is obvious that we are facing a
18340         bug. 
18341
18342         * cs-parser.jay (invocation_expression): Pass Location information.
18343
18344         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
18345         Use a basename for those routines because .NET does not like paths
18346         on them. 
18347
18348         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
18349         already defined.
18350
18351 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
18352
18353         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
18354         are loading the correct data types (throws an exception if not).
18355         (TypeManager::InitCoreTypes): Use CoreLookupType
18356
18357         * expression.cs (Unary::ResolveOperator): return the child
18358         expression for expressions which are just +expr.
18359         (Unary::ResolveOperator): Return negative literals for -LITERAL
18360         expressions (otherwise they are Unary {Literal}).
18361         (Invocation::Badness): Take into account `Implicit constant
18362         expression conversions'.
18363
18364         * literal.cs (LongLiteral): Implement long literal class.
18365         (IntLiteral): export the `Value' of the intliteral. 
18366
18367 2001-09-19  Ravi Pratap  <ravi@ximian.com>
18368
18369         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
18370
18371         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
18372         instead of 'Operator'
18373
18374         * expression.cs (Binary::ResolveOperator): Update accordingly.
18375         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
18376         and 'Minus'
18377
18378         * cs-parser.jay (unary_expression): Update to use the new names.
18379
18380         * gen-treedump.cs (GetUnary): Same here.
18381
18382         * expression.cs (Unary::Resolve): Implement.
18383         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
18384         operators are found instead of making noise ;-)
18385         (Unary::ResolveOperator): New method to do precisely the same thing which
18386         Binary::ResolveOperator does for Binary expressions.
18387         (Unary.method, .Arguments): Add.
18388         (Unary::OperName): Implement.   
18389         (Unary::ForceConversion): Copy and Paste !
18390
18391         * class.cs (Operator::Define): Fix a small bug for the case when we have 
18392         a unary operator.
18393
18394         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
18395         for the inbuilt operators. Only overloading works for now ;-)
18396
18397 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
18398
18399         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
18400         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
18401
18402         * expression.cs (This::Emit): Implement. 
18403         (This::Resolve): Implement.
18404         (TypeOf:Resolve): Implement.
18405         (Expression::ResolveSimpleName): Add an implicit this to instance
18406         field references. 
18407         (MemberAccess::Resolve): Deal with Parameters and Fields. 
18408         Bind instance variable to Field expressions.
18409         (FieldExpr::Instance): New field used to track the expression that
18410         represents the object instance.
18411         (FieldExpr::Resolve): Track potential errors from MemberLookup not
18412         binding 
18413         (FieldExpr::Emit): Implement.
18414
18415         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
18416         the last instruction contains a return opcode to avoid generating
18417         the last `ret' instruction (this generates correct code, and it is
18418         nice to pass the peverify output).
18419
18420         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
18421         initializer for static and instance variables.
18422         (Constructor::Emit): Allow initializer to be null in the case of
18423         static constructors.  Only emit initializer for instance
18424         constructors. 
18425
18426         (TypeContainer::FindMembers): Return a null array if there are no
18427         matches.
18428
18429         Also fix the code for the MemberTypes.Method branch, as it was not
18430         scanning that for operators (or tried to access null variables before).
18431
18432         * assign.cs (Assign::Emit): Handle instance and static fields. 
18433
18434         * TODO: Updated.
18435
18436         * driver.cs: Stop compilation if there are parse errors.
18437
18438         * cs-parser.jay (constructor_declaration): Provide default base
18439         initializer for non-static constructors.
18440         (constructor_declarator): Do not provide a default base
18441         initializers if none was specified.
18442         Catch the fact that constructors should not have parameters.
18443
18444         * class.cs: Do not emit parent class initializers for static
18445         constructors, that should be flagged as an error.
18446
18447 2001-09-18  Ravi Pratap  <ravi@ximian.com>
18448
18449         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
18450         Move back code into TypeContainer::Populate.
18451
18452 2001-09-18  Ravi Pratap  <ravi@ximian.com>
18453
18454         * class.cs (TypeContainer::AddConstructor): Fix the check to
18455         compare against Name, not Basename. 
18456         (Operator::OpType): Change Plus and Minus to Add and Subtract.
18457
18458         * cs-parser.jay : Update accordingly.
18459
18460         * class.cs (TypeContainer::FindMembers): For the case where we are searching
18461         for methods, don't forget to look into the operators too.
18462         (RegisterMethodBuilder): Helper method to take care of this for
18463         methods, constructors and operators.
18464         (Operator::Define): Completely revamp.
18465         (Operator.OperatorMethod, MethodName): New fields.
18466         (TypeContainer::Populate): Move the registering of builders into
18467         RegisterMethodBuilder.
18468         (Operator::Emit): Re-write.
18469
18470         * expression.cs (Binary::Emit): Comment out code path to emit method
18471         invocation stuff for the case when we have a user defined operator. I am
18472         just not able to get it right !
18473
18474 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
18475
18476         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
18477         argument. 
18478
18479         (Expression::MemberLookup): Provide a version that allows to
18480         specify the MemberTypes and BindingFlags. 
18481
18482         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
18483         so it was not fetching variable information from outer blocks.
18484
18485         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
18486         Beforefieldinit as it was buggy.
18487
18488         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
18489         that Ravi put here.  
18490
18491         * class.cs (Constructor::Emit): Only emit if block is not null.
18492         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
18493         deal with this by semantically definining it as if the user had
18494         done it.
18495
18496         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
18497         constructors as we now "emit" them at a higher level.
18498
18499         (TypeContainer::DefineDefaultConstructor): Used to define the
18500         default constructors if none was provided.
18501
18502         (ConstructorInitializer): Add methods Resolve and Emit. 
18503
18504         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
18505
18506 2001-09-17  Ravi Pratap  <ravi@ximian.com>
18507
18508         * class.cs (TypeContainer::EmitDefaultConstructor): Register
18509         the default constructor builder with our hashtable for methodbuilders
18510         to methodcores.
18511
18512         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
18513         and argument_count is 0 in which case we have a match.
18514         (Binary::ResolveOperator): More null checking and miscellaneous coding
18515         style cleanup.
18516
18517 2001-09-17  Ravi Pratap  <ravi@ximian.com>
18518
18519         * rootcontext.cs (IsNameSpace): Compare against null.
18520
18521         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
18522
18523         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
18524         and Unary::Operator.
18525
18526         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
18527         accordingly.
18528
18529         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
18530         we have overloaded operators.
18531         (Binary::ResolveOperator): Implement the part which does the operator overload
18532         resolution.
18533
18534         * class.cs (Operator::Emit): Implement.
18535         (TypeContainer::Emit): Emit the operators we have too.
18536
18537         * expression.cs (Binary::Emit): Update to emit the appropriate code for
18538         the case when we have a user-defined operator.
18539
18540 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
18541
18542         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
18543
18544 2001-09-16  Ravi Pratap  <ravi@ximian.com>
18545
18546         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
18547         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
18548         (Constructor::Emit): Implement.
18549         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
18550         if we have no work to do. 
18551         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
18552         Emit method.
18553
18554         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
18555         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
18556
18557         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
18558         of parent.parent.
18559
18560 2001-09-15  Ravi Pratap  <ravi@ximian.com>
18561
18562         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
18563         in the source.
18564         (Tree::RecordNamespace): Method to do what the name says ;-)
18565         (Tree::Namespaces): Property to get at the namespaces hashtable.
18566
18567         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
18568         keep track.
18569
18570         * rootcontext.cs (IsNamespace): Fixed it :-)
18571
18572 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
18573
18574         * class.cs (TypeContainer::FindMembers): Add support for
18575         constructors. 
18576         (MethodCore): New class that encapsulates both the shared aspects
18577         of a Constructor and a Method.  
18578         (Method, Constructor): Factored pieces into MethodCore.
18579
18580         * driver.cs: Added --fatal which makes errors throw exceptions.
18581         Load System assembly as well as part of the standard library.
18582
18583         * report.cs: Allow throwing exceptions on errors for debugging.
18584
18585         * modifiers.cs: Do not use `parent', instead use the real type
18586         container to evaluate permission settings.
18587
18588         * class.cs: Put Ravi's patch back in.  He is right, and we will
18589         have to cope with the
18590
18591 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18592
18593         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
18594         FamORAssem, not FamANDAssem.
18595
18596 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
18597
18598         * driver.cs: Added --parse option that only parses its input files
18599         and terminates.
18600
18601         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
18602         incorrect.  IsTopLevel is not used to tell whether an object is
18603         root_types or not (that can be achieved by testing this ==
18604         root_types).  But to see if this is a top-level *class* (not
18605         necessarly our "toplevel" container). 
18606
18607 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18608
18609         * enum.cs (Enum::Define): Modify to call the Lookup method on the
18610         parent instead of a direct call to GetType.
18611
18612 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18613
18614         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
18615         Modifiers.TypeAttr. This should just be a call to that method.
18616
18617         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
18618         object so that we can determine if we are top-level or not.
18619
18620         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
18621         TypeContainer too.
18622
18623         * enum.cs (Enum::Define): Ditto.
18624
18625         * modifiers.cs (FieldAttr): Re-write.
18626
18627         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
18628         (TypeContainer::HaveStaticConstructor): New property to provide access
18629         to precisely that info.
18630
18631         * modifiers.cs (MethodAttr): Re-write.
18632         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
18633
18634         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
18635         of top-level types as claimed.
18636
18637 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
18638
18639         * expression.cs (MemberLookup): Fruitless attempt to lookup
18640         constructors.  Maybe I need to emit default constructors?  That
18641         might be it (currently .NET emits this for me automatically).
18642         (Invocation::OverloadResolve): Cope with Arguments == null.
18643         (Invocation::EmitArguments): new function, shared by the new
18644         constructor and us.
18645         (Invocation::Emit): Handle static and instance methods.  Emit
18646         proper call instruction for virtual or non-virtual invocations.
18647         (New::Emit): Implement.
18648         (New::Resolve): Implement.
18649         (MemberAccess:Resolve): Implement.
18650         (MethodGroupExpr::InstanceExpression): used conforming to the spec
18651         to track instances.
18652         (FieldExpr::Resolve): Set type.
18653
18654         * support.cs: Handle empty arguments.
18655                 
18656         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
18657         SimpleLookup): Auxiliary routines to help parse a qualifier
18658         identifier.  
18659
18660         Update qualifier_identifier rule.
18661
18662         * codegen.cs: Removed debugging messages.
18663
18664         * class.cs: Make this a global thing, this acts just as a "key" to
18665         objects that we might have around.
18666
18667         (Populate): Only initialize method_builders_to_methods once.
18668
18669         * expression.cs (PropertyExpr): Initialize type from the
18670         PropertyType. 
18671
18672         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
18673         Resolve pattern.  Attempt to implicitly convert value to boolean.
18674         Emit code.
18675
18676         * expression.cs: Set the type for the int32/int32 argument case.
18677         (Binary::ResolveOperator): Set the return type to boolean for
18678         comparission operators
18679
18680         * typemanager.cs: Remove debugging print code.
18681
18682         (Invocation::Resolve): resolve type.
18683
18684         * class.cs: Allocate a MemberInfo of the correct size, as the code
18685         elsewhere depends on the test to reflect the correct contents.
18686
18687         (Method::) Keep track of parameters, due to System.Reflection holes
18688
18689         (TypeContainer::Populate): Keep track of MethodBuilders to Method
18690         mapping here.
18691
18692         (TypeContainer::FindMembers): Use ArrayList and then copy an array
18693         of the exact size and return that.
18694
18695         (Class::LookupMethodByBuilder): New function that maps
18696         MethodBuilders to its methods.  Required to locate the information
18697         on methods because System.Reflection bit us again.
18698
18699         * support.cs: New file, contains an interface ParameterData and
18700         two implementations: ReflectionParameters and InternalParameters
18701         used to access Parameter information.  We will need to grow this
18702         as required.
18703
18704         * expression.cs (Invocation::GetParameterData): implement a cache
18705         and a wrapper around the ParameterData creation for methods. 
18706         (Invocation::OverloadResolve): Use new code.
18707
18708 2001-09-13  Ravi Pratap  <ravi@ximian.com>
18709
18710         * class.cs (TypeContainer::EmitField): Remove and move into 
18711         (Field::Define): here and modify accordingly.
18712         (Field.FieldBuilder): New member.
18713         (TypeContainer::Populate): Update accordingly.
18714         (TypeContainer::FindMembers): Implement.
18715
18716 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
18717
18718         * statement.cs: (VariableInfo::VariableType): New field to be
18719         initialized with the full type once it is resolved. 
18720
18721 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
18722
18723         * parameter.cs (GetParameterInfo): Use a type cache to compute
18724         things only once, and to reuse this information
18725
18726         * expression.cs (LocalVariableReference::Emit): Implement.
18727         (OpcodeCast::Emit): fix.
18728
18729         (ParameterReference::Resolve): Implement.
18730         (ParameterReference::Emit): Implement.
18731
18732         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
18733         that are expressions need to stay as Expressions.
18734
18735         * typemanager.cs (CSharpName): Returns the C# name of a type if
18736         possible. 
18737
18738         * expression.cs (Expression::ConvertImplicit): New function that
18739         implements implicit type conversions.
18740
18741         (Expression::ImplicitReferenceConversion): Implements implicit
18742         reference conversions.
18743
18744         (EmptyCast): New type for transparent casts.
18745
18746         (OpcodeCast): New type for casts of types that are performed with
18747         a sequence of bytecodes.
18748
18749         (BoxedCast): New type used for casting value types into reference
18750         types.  Emits a box opcode.
18751
18752         (Binary::DoNumericPromotions): Implements numeric promotions of
18753         and computation of the Binary::Type.
18754
18755         (Binary::EmitBranchable): Optimization.
18756
18757         (Binary::Emit): Implement code emission for expressions.
18758
18759         * typemanager.cs (TypeManager): Added two new core types: sbyte
18760         and byte.
18761
18762 2001-09-12  Ravi Pratap  <ravi@ximian.com>
18763
18764         * class.cs (TypeContainer::FindMembers): Method which does exactly
18765         what Type.FindMembers does, only we don't have to use reflection. No
18766         implementation yet.
18767
18768         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
18769         typecontainer objects as we need to get at them.
18770         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
18771
18772         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
18773         typecontainer object.
18774
18775         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
18776         of just a Report object.
18777
18778 2001-09-11  Ravi Pratap  <ravi@ximian.com>
18779
18780         * class.cs (Event::Define): Go back to using the prefixes "add_" and
18781         "remove_"
18782         (TypeContainer::Populate): Now define the delegates of the type too.
18783         (TypeContainer.Delegates): Property to access the list of delegates defined
18784         in the type.
18785
18786         * delegates.cs (Delegate::Define): Implement partially.
18787
18788         * modifiers.cs (TypeAttr): Handle more flags.
18789
18790 2001-09-11  Ravi Pratap  <ravi@ximian.com>
18791
18792         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
18793         and not <=
18794         (Operator::Define): Re-write logic to get types by using the LookupType method
18795         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
18796         (Indexer::Define): Ditto.
18797         (Event::Define): Ditto.
18798         (Property::Define): Ditto.
18799
18800 2001-09-10  Ravi Pratap  <ravi@ximian.com>
18801
18802         * class.cs (TypeContainer::Populate): Now define operators too. 
18803         (TypeContainer.Operators): New property to access the list of operators
18804         in a type.
18805         (Operator.OperatorMethodBuilder): New member to hold the method builder
18806         for the operator we are defining.
18807         (Operator::Define): Implement.
18808
18809 2001-09-10  Ravi Pratap  <ravi@ximian.com>
18810
18811         * class.cs (Event::Define): Make the prefixes of the accessor methods
18812         addOn_ and removeOn_ 
18813
18814         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
18815         of the location being passed in too. Ideally, this should go later since all
18816         error reporting should be done through the Report object.
18817
18818         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
18819         (Populate): Iterate thru the indexers we have and define them too.
18820         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
18821         for the get and set accessors.
18822         (Indexer::Define): Implement.
18823
18824 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
18825
18826         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
18827         my previous implementation, did not work.
18828
18829         * typemanager.cs: Add a couple of missing types (the longs).
18830
18831         * literal.cs: Use TypeManager.bool_type instead of getting it.
18832
18833         * expression.cs (EventExpr): New kind of expressions.
18834         (Expressio::ExprClassFromMemberInfo): finish
18835
18836 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
18837
18838         * assign.cs: Emit stores to static fields differently.
18839
18840 2001-09-08  Ravi Pratap  <ravi@ximian.com>
18841
18842         * Merge in changes and adjust code to tackle conflicts. Backed out my
18843         code in Assign::Resolve ;-) 
18844
18845 2001-09-08  Ravi Pratap  <ravi@ximian.com>
18846
18847         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
18848         instead Report.Error and also pass in the location.
18849         (CSharpParser::Lexer): New readonly property to return the reference
18850         to the Tokenizer object.
18851         (declare_local_variables): Use Report.Error with location instead of plain 
18852         old error.
18853         (CheckDef): Ditto.
18854
18855         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
18856         (Operator.CheckBinaryOperator): Ditto.
18857
18858         * cs-parser.jay (operator_declarator): Update accordingly.
18859
18860         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
18861         (CheckBinaryOperator): Same here.
18862
18863         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
18864         on the name without any prefixes of namespace names etc. This is because we
18865         already might have something already fully qualified like 
18866         'System.Console.WriteLine'
18867
18868         * assign.cs (Resolve): Begin implementation. Stuck ;-)
18869
18870 2001-09-07  Ravi Pratap  <ravi@ximian.com>
18871
18872         * cs-tokenizer.cs (location): Return a string which also contains
18873         the file name.
18874
18875         * expression.cs (ElementAccess): New class for expressions of the
18876         type 'element access.'
18877         (BaseAccess): New class for expressions of the type 'base access.'
18878         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
18879         respectively.
18880
18881         * cs-parser.jay (element_access): Implement action.
18882         (base_access): Implement actions.
18883         (checked_expression, unchecked_expression): Implement.
18884
18885         * cs-parser.jay (local_variable_type): Correct and implement.
18886         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
18887
18888         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
18889
18890         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
18891         name and the specifiers.
18892
18893         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
18894
18895         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
18896         making them all public ;-)
18897
18898         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
18899         class anyways.
18900
18901 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
18902
18903         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
18904         PropertyExprs.
18905         (FieldExpr, PropertyExprs): New resolved expressions.
18906         (SimpleName::MemberStaticCheck): Perform static checks for access
18907         to non-static fields on static methods. Maybe this should be
18908         generalized for MemberAccesses. 
18909         (SimpleName::ResolveSimpleName): More work on simple name
18910         resolution. 
18911
18912         * cs-parser.jay (primary_expression/qualified_identifier): track
18913         the parameter index.
18914
18915         * codegen.cs (CodeGen::Save): Catch save exception, report error.
18916         (EmitContext::EmitBoolExpression): Chain to expression generation
18917         instead of temporary hack.
18918         (::EmitStatementExpression): Put generic expression code generation.
18919
18920         * assign.cs (Assign::Emit): Implement variable assignments to
18921         local variables, parameters and fields.
18922
18923 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
18924
18925         * statement.cs (Block::GetVariableInfo): New method, returns the
18926         VariableInfo for a variable name in a block.
18927         (Block::GetVariableType): Implement in terms of GetVariableInfo
18928
18929         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
18930         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
18931
18932 2001-09-06  Ravi Pratap  <ravi@ximian.com>
18933
18934         * cs-parser.jay (operator_declaration): Continue on my quest : update
18935         to take attributes argument.
18936         (event_declaration): Ditto.
18937         (enum_declaration): Ditto.
18938         (indexer_declaration): Ditto.
18939
18940         * class.cs (Operator::Operator): Update constructor accordingly.
18941         (Event::Event): Ditto.
18942
18943         * delegate.cs (Delegate::Delegate): Same here.
18944
18945         * enum.cs (Enum::Enum): Same here.
18946
18947 2001-09-05  Ravi Pratap  <ravi@ximian.com>
18948
18949         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
18950
18951         * ../tests/cs0658.cs : New file to demonstrate error 0658.
18952
18953         * attribute.cs (Attributes): New class to encapsulate all attributes which were
18954         being passed around as an arraylist.
18955         (Attributes::AddAttribute): Method to add attribute sections.
18956
18957         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
18958         (struct_declaration): Update accordingly.
18959         (constant_declaration): Update.
18960         (field_declaration): Update.
18961         (method_header): Update.
18962         (fixed_parameter): Update.
18963         (parameter_array): Ditto.
18964         (property_declaration): Ditto.
18965         (destructor_declaration): Ditto.
18966
18967         * class.cs (Struct::Struct): Update constructors accordingly.
18968         (Class::Class): Ditto.
18969         (Field::Field): Ditto.
18970         (Method::Method): Ditto.
18971         (Property::Property): Ditto.
18972         (TypeContainer::OptAttribute): update property's return type.
18973
18974         * interface.cs (Interface.opt_attributes): New member.
18975         (Interface::Interface): Update to take the extra Attributes argument.
18976
18977         * parameter.cs (Parameter::Parameter): Ditto.
18978
18979         * constant.cs (Constant::Constant): Ditto.
18980
18981         * interface.cs (InterfaceMemberBase): New OptAttributes field.
18982         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
18983         the attributes as a parameter.
18984         (InterfaceProperty): Update constructor call.
18985         (InterfaceEvent): Ditto.
18986         (InterfaceMethod): Ditto.
18987         (InterfaceIndexer): Ditto.
18988
18989         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
18990         pass the attributes too.
18991         (interface_event_declaration): Ditto.
18992         (interface_property_declaration): Ditto.
18993         (interface_method_declaration): Ditto.
18994         (interface_declaration): Ditto.
18995
18996 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
18997
18998         * class.cs (Method::Define): Track the "static Main" definition to
18999         create an entry point. 
19000
19001         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
19002         EntryPoint if we find it. 
19003
19004         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
19005         (EmitContext::ig): Make this variable public.
19006
19007         * driver.cs: Make the default output file be the first file name
19008         with the .exe extension.  
19009
19010         Detect empty compilations
19011
19012         Handle various kinds of output targets.  Handle --target and
19013         rename -t to --dumper.
19014
19015         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
19016         methods inherited from Expression return now an Expression.  This
19017         will is used during the tree rewriting as we resolve them during
19018         semantic analysis.
19019
19020         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
19021         the spec.  Missing entirely is the information about
19022         accessability of elements of it.
19023
19024         (Expression::ExprClassFromMemberInfo): New constructor for
19025         Expressions that creates a fully initialized Expression based on
19026         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
19027         a Type.
19028
19029         (Invocation::Resolve): Begin implementing resolution of invocations.
19030
19031         * literal.cs (StringLiteral):  Implement Emit.
19032
19033 2001-09-05  Ravi Pratap  <ravi@ximian.com>
19034
19035         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
19036         member.
19037
19038 2001-09-04  Ravi Pratap  <ravi@ximian.com>
19039
19040         * cs-parser.jay (attribute_arguments): Implement actions.
19041         (attribute): Fix bug in production. Implement action.
19042         (attribute_list): Implement.
19043         (attribute_target): Implement.
19044         (attribute_target_specifier, opt_target_specifier): Implement
19045         (CheckAttributeTarget): New method to check if the attribute target
19046         is valid.
19047         (attribute_section): Implement.
19048         (opt_attributes): Implement.
19049
19050         * attribute.cs : New file to handle attributes.
19051         (Attribute): Class to hold attribute info.
19052
19053         * cs-parser.jay (opt_attribute_target_specifier): Remove production
19054         (attribute_section): Modify production to use 2 different rules to 
19055         achieve the same thing. 1 s/r conflict down !
19056         Clean out commented, useless, non-reducing dimension_separator rules.
19057
19058         * class.cs (TypeContainer.attributes): New member to hold list
19059         of attributes for a type.
19060         (Struct::Struct): Modify to take one more argument, the attribute list.
19061         (Class::Class): Ditto.
19062         (Field::Field): Ditto.
19063         (Method::Method): Ditto.
19064         (Property::Property): Ditto.
19065
19066         * cs-parser.jay (struct_declaration): Update constructor call to
19067         pass in the attributes too.
19068         (class_declaration): Ditto.
19069         (constant_declaration): Ditto.
19070         (field_declaration): Ditto.
19071         (method_header): Ditto.
19072         (fixed_parameter): Ditto.
19073         (parameter_array): Ditto.
19074         (property_declaration): Ditto.
19075
19076         * constant.cs (Constant::Constant): Update constructor similarly.
19077         Use System.Collections.
19078
19079         * parameter.cs (Parameter::Parameter): Update as above.
19080
19081 2001-09-02  Ravi Pratap  <ravi@ximian.com>
19082
19083         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
19084         (TypeContainer.delegates): New member to hold list of delegates.
19085
19086         * cs-parser.jay (delegate_declaration): Implement the action correctly 
19087         this time as I seem to be on crack ;-)
19088
19089 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
19090
19091         * rootcontext.cs (RootContext::IsNamespace): new function, used to
19092         tell whether an identifier represents a namespace.
19093
19094         * expression.cs (NamespaceExpr): A namespace expression, used only
19095         temporarly during expression resolution.
19096         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
19097         utility functions to resolve names on expressions.
19098
19099 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
19100
19101         * codegen.cs: Add hook for StatementExpressions. 
19102
19103         * class.cs: Fix inverted test for static flag in methods.
19104
19105 2001-09-02  Ravi Pratap  <ravi@ximian.com>
19106
19107         * class.cs (Operator::CheckUnaryOperator): Correct error number used
19108         to make it coincide with MS' number.
19109         (Operator::CheckBinaryOperator): Ditto.
19110
19111         * ../errors/errors.txt : Remove error numbers added earlier.
19112
19113         * ../errors/cs1019.cs : Test case for error # 1019
19114
19115         * ../errros/cs1020.cs : Test case for error # 1020
19116
19117         * cs-parser.jay : Clean out commented cruft.
19118         (dimension_separators, dimension_separator): Comment out. Ostensibly not
19119         used anywhere - non-reducing rule.
19120         (namespace_declarations): Non-reducing rule - comment out.
19121
19122         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
19123         with TypeContainer::AddEnum.
19124
19125         * delegate.cs : New file for delegate handling classes.
19126         (Delegate): Class for declaring delegates.
19127
19128         * makefile : Update.
19129
19130         * cs-parser.jay (delegate_declaration): Implement.
19131
19132 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
19133
19134         * class.cs (Event::Define): Implement.
19135         (Event.EventBuilder): New member.
19136
19137         * class.cs (TypeContainer::Populate): Update to define all enums and events
19138         we have.
19139         (Events): New property for the events arraylist we hold. Shouldn't we move to using
19140         readonly fields for all these cases ?
19141
19142 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
19143
19144         * class.cs (Property): Revamp to use the convention of making fields readonly.
19145         Accordingly modify code elsewhere.
19146
19147         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
19148         the Define method of the Property class.
19149
19150         * class.cs : Clean up applied patch and update references to variables etc. Fix 
19151         trivial bug.
19152         (TypeContainer::Populate): Update to define all the properties we have. Also
19153         define all enumerations.
19154
19155         * enum.cs (Define): Implement.
19156
19157 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
19158
19159         * cs-parser.jay (overloadable_operator): The semantic value is an
19160         enum of the Operator class.
19161         (operator_declarator): Implement actions.
19162         (operator_declaration): Implement.
19163
19164         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
19165         validity of definitions.
19166         (Operator::CheckBinaryOperator): Static method to check for binary operators
19167         (TypeContainer::AddOperator): New method to add an operator to a type.
19168
19169         * cs-parser.jay (indexer_declaration): Added line to actually call the
19170         AddIndexer method so it gets added ;-)
19171
19172         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
19173         already taken care of by the MS compiler ?  
19174
19175 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
19176
19177         * class.cs (Operator): New class for operator declarations.
19178         (Operator::OpType): Enum for the various operators.
19179
19180 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
19181
19182         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
19183         ostensibly handle this in semantic analysis.
19184
19185         * cs-parser.jay (general_catch_clause): Comment out
19186         (specific_catch_clauses, specific_catch_clause): Ditto.
19187         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
19188         (catch_args, opt_catch_args): New productions.
19189         (catch_clause): Rewrite to use the new productions above
19190         (catch_clauses): Modify accordingly.
19191         (opt_catch_clauses): New production to use in try_statement
19192         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
19193         and re-write the code in the actions to extract the specific and
19194         general catch clauses by being a little smart ;-)
19195
19196         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
19197         Hooray, try and catch statements parse fine !
19198
19199 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19200
19201         * statement.cs (Block::GetVariableType): Fix logic to extract the type
19202         string from the hashtable of variables.
19203
19204         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
19205         I end up making that mistake ;-)
19206         (catch_clauses): Fixed gross error which made Key and Value of the 
19207         DictionaryEntry the same : $1 !!
19208
19209 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19210
19211         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
19212
19213         * cs-parser.jay (event_declaration): Correct to remove the semicolon
19214         when the add and remove accessors are specified. 
19215
19216 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19217
19218         * cs-parser.jay (IndexerDeclaration): New helper class to hold
19219         information about indexer_declarator.
19220         (indexer_declarator): Implement actions.
19221         (parsing_indexer): New local boolean used to keep track of whether
19222         we are parsing indexers or properties. This is necessary because 
19223         implicit_parameters come into picture even for the get accessor in the 
19224         case of an indexer.
19225         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
19226
19227         * class.cs (Indexer): New class for indexer declarations.
19228         (TypeContainer::AddIndexer): New method to add an indexer to a type.
19229         (TypeContainer::indexers): New member to hold list of indexers for the
19230         type.
19231
19232 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
19233
19234         * cs-parser.jay (add_accessor_declaration): Implement action.
19235         (remove_accessor_declaration): Implement action.
19236         (event_accessors_declaration): Implement
19237         (variable_declarators): swap statements for first rule - trivial.
19238
19239         * class.cs (Event): New class to hold information about event
19240         declarations.
19241         (TypeContainer::AddEvent): New method to add an event to a type
19242         (TypeContainer::events): New member to hold list of events.
19243
19244         * cs-parser.jay (event_declaration): Implement actions.
19245
19246 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
19247
19248         * cs-parser.jay (dim_separators): Implement. Make it a string
19249         concatenating all the commas together, just as they appear.
19250         (opt_dim_separators): Modify accordingly
19251         (rank_specifiers): Update accordingly. Basically do the same
19252         thing - instead, collect the brackets here.
19253         (opt_rank_sepcifiers): Modify accordingly.
19254         (array_type): Modify to actually return the complete type string
19255         instead of ignoring the rank_specifiers.
19256         (expression_list): Implement to collect the expressions
19257         (variable_initializer): Implement. We make it a list of expressions
19258         essentially so that we can handle the array_initializer case neatly too.
19259         (variable_initializer_list): Implement.
19260         (array_initializer): Make it a list of variable_initializers
19261         (opt_array_initializer): Modify accordingly.
19262
19263         * expression.cs (New::NType): Add enumeration to help us
19264         keep track of whether we have an object/delegate creation
19265         or an array creation.
19266         (New:NewType, New::Rank, New::Indices, New::Initializers): New
19267         members to hold data about array creation.
19268         (New:New): Modify to update NewType
19269         (New:New): New Overloaded contructor for the array creation
19270         case.
19271
19272         * cs-parser.jay (array_creation_expression): Implement to call
19273         the overloaded New constructor.
19274
19275 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
19276
19277         * class.cs (TypeContainer::Constructors): Return member
19278         constructors instead of returning null.
19279
19280 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
19281
19282         * typemanager.cs (InitCoreTypes): Initialize the various core
19283         types after we have populated the type manager with the user
19284         defined types (this distinction will be important later while
19285         compiling corlib.dll)
19286
19287         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
19288         on Expression Classification.  Now all expressions have a method
19289         `Resolve' and a method `Emit'.
19290
19291         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
19292         generation from working.     Also add some temporary debugging
19293         code. 
19294
19295 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
19296
19297         * codegen.cs: Lots of code generation pieces.  This is only the
19298         beginning, will continue tomorrow with more touches of polish.  We
19299         handle the fundamentals of if, while, do, for, return.  Others are
19300         trickier and I need to start working on invocations soon.
19301
19302         * gen-treedump.cs: Bug fix, use s.Increment here instead of
19303         s.InitStatement. 
19304
19305         * codegen.cs (EmitContext): New struct, used during code
19306         emission to keep a context.   Most of the code generation will be
19307         here. 
19308
19309         * cs-parser.jay: Add embedded blocks to the list of statements of
19310         this block.  So code generation proceeds in a top down fashion.
19311
19312 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
19313
19314         * statement.cs: Add support for multiple child blocks.
19315
19316 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
19317
19318         * codegen.cs (EmitCode): New function, will emit the code for a
19319         Block of code given a TypeContainer and its ILGenerator. 
19320
19321         * statement.cs (Block): Standard public readonly optimization.
19322         (Block::Block constructors): Link children. 
19323         (Block::Child): Child Linker.
19324         (Block::EmitVariables): Emits IL variable declarations.
19325
19326         * class.cs: Drop support for MethodGroups here, delay until
19327         Semantic Analysis.
19328         (Method::): Applied the same simplification that I did before, and
19329         move from Properties to public readonly fields.
19330         (Method::ParameterTypes): Returns the parameter types for the
19331         function, and implements a cache that will be useful later when I
19332         do error checking and the semantic analysis on the methods is
19333         performed.
19334         (Constructor::GetCallingConvention): Renamed from CallingConvetion
19335         and made a method, optional argument tells whether this is a class
19336         or a structure to apply the `has-this' bit.
19337         (Method::GetCallingConvention): Implement, returns the calling
19338         convention. 
19339         (Method::Define): Defines the type, a second pass is performed
19340         later to populate the methods.
19341
19342         (Constructor::ParameterTypes): implement a cache similar to the
19343         one on Method::ParameterTypes, useful later when we do semantic
19344         analysis. 
19345
19346         (TypeContainer::EmitMethod):  New method.  Emits methods.
19347
19348         * expression.cs: Removed MethodGroup class from here.
19349
19350         * parameter.cs (Parameters::GetCallingConvention): new method.
19351
19352 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
19353
19354         * class.cs (TypeContainer::Populate): Drop RootContext from the
19355         argument. 
19356
19357         (Constructor::CallingConvention): Returns the calling convention.
19358         (Constructor::ParameterTypes): Returns the constructor parameter
19359         types. 
19360
19361         (TypeContainer::AddConstructor): Keep track of default constructor
19362         and the default static constructor.
19363
19364         (Constructor::) Another class that starts using `public readonly'
19365         instead of properties. 
19366
19367         (Constructor::IsDefault): Whether this is a default constructor. 
19368
19369         (Field::) use readonly public fields instead of properties also.
19370
19371         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
19372         track of static constructors;  If none is used, turn on
19373         BeforeFieldInit in the TypeAttributes. 
19374
19375         * cs-parser.jay (opt_argument_list): now the return can be null
19376         for the cases where there are no arguments. 
19377
19378         (constructor_declarator): If there is no implicit `base' or
19379         `this', then invoke the default parent constructor. 
19380
19381         * modifiers.cs (MethodAttr): New static function maps a set of
19382         modifiers flags into a MethodAttributes enum
19383         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
19384         MethodAttr, TypeAttr to represent the various mappings where the
19385         modifiers are used.
19386         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
19387
19388 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
19389
19390         * parameter.cs (GetParameterInfo): Fix bug where there would be no
19391         method arguments.
19392
19393         * interface.cs (PopulateIndexer): Implemented the code generator
19394         for interface indexers.
19395
19396 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
19397
19398         * interface.cs (InterfaceMemberBase): Now we track the new status
19399         here.  
19400
19401         (PopulateProperty): Implement property population.  Woohoo!  Got
19402         Methods and Properties going today. 
19403
19404         Removed all the properties for interfaces, and replaced them with
19405         `public readonly' fields. 
19406
19407 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
19408
19409         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
19410         initialize their hashtables/arraylists only when they are needed
19411         instead of doing this always.
19412
19413         * parameter.cs: Handle refs and out parameters.
19414
19415         * cs-parser.jay: Use an ArrayList to construct the arguments
19416         instead of the ParameterCollection, and then cast that to a
19417         Parameter[] array.
19418
19419         * parameter.cs: Drop the use of ParameterCollection and use
19420         instead arrays of Parameters.
19421
19422         (GetParameterInfo): Use the Type, not the Name when resolving
19423         types. 
19424
19425 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
19426
19427         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
19428         and instead use public readonly fields.
19429
19430         * class.cs: Put back walking code for type containers.
19431
19432 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
19433
19434         * class.cs (MakeConstant): Code to define constants.
19435
19436         * rootcontext.cs (LookupType): New function.  Used to locate types 
19437
19438
19439 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
19440
19441         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
19442         this System.Reflection code is.  Kudos to Microsoft
19443
19444         * typemanager.cs: Implement a type cache and avoid loading all
19445         types at boot time.  Wrap in LookupType the internals.  This made
19446         the compiler so much faster.  Wow.  I rule!
19447
19448         * driver.cs: Make sure we always load mscorlib first (for
19449         debugging purposes, nothing really important).
19450
19451         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
19452         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
19453
19454         * rootcontext.cs: Lookup types on their namespace;  Lookup types
19455         on namespaces that have been imported using the `using' keyword.
19456
19457         * class.cs (TypeContainer::TypeAttr): Virtualize.
19458         (Class::TypeAttr): Return attributes suitable for this bad boy.
19459         (Struct::TypeAttr): ditto.
19460         Handle nested classes.
19461         (TypeContainer::) Remove all the type visiting code, it is now
19462         replaced with the rootcontext.cs code
19463
19464         * rootcontext.cs (GetClassBases): Added support for structs. 
19465
19466 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
19467
19468         * interface.cs, statement.cs, class.cs, parameter.cs,
19469         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
19470         Drop use of TypeRefs, and use strings instead.
19471
19472 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
19473
19474         * rootcontext.cs: 
19475
19476         * class.cs (Struct::Struct): set the SEALED flags after
19477         checking the modifiers.
19478         (TypeContainer::TypeAttr): new property, returns the
19479         TypeAttributes for a class.  
19480
19481         * cs-parser.jay (type_list): Oops, list production was creating a
19482         new list of base types.
19483
19484         * rootcontext.cs (StdLib): New property.
19485         (GetInterfaceTypeByName): returns an interface by type name, and
19486         encapsulates error handling here.
19487         (GetInterfaces): simplified.
19488         (ResolveTree): Encapsulated all the tree resolution here.
19489         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
19490         types. 
19491
19492         * driver.cs: Add support for --nostdlib, to avoid loading the
19493         default assemblies.
19494         (Main): Do not put tree resolution here. 
19495
19496         * rootcontext.cs: Beginning of the class resolution.
19497
19498 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
19499
19500         * rootcontext.cs: Provide better error reporting. 
19501
19502         * cs-parser.jay (interface_base): set our $$ to be interfaces.
19503
19504         * rootcontext.cs (CreateInterface): Handle the case where there
19505         are no parent interfaces.
19506
19507         (CloseTypes): Routine to flush types at the end.
19508         (CreateInterface): Track types.
19509         (GetInterfaces): Returns an array of Types from the list of
19510         defined interfaces.
19511
19512         * typemanager.c (AddUserType): Mechanism to track user types (puts
19513         the type on the global type hash, and allows us to close it at the
19514         end). 
19515
19516 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
19517
19518         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
19519         RecordInterface instead.
19520
19521         * cs-parser.jay: Updated to reflect changes above.
19522
19523         * decl.cs (Definition): Keep track of the TypeBuilder type that
19524         represents this type here.  Not sure we will use it in the long
19525         run, but wont hurt for now.
19526
19527         * driver.cs: Smaller changes to accomodate the new code.
19528
19529         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
19530         when done. 
19531
19532         * rootcontext.cs (CreateInterface):  New method, used to create
19533         the System.TypeBuilder type for interfaces.
19534         (ResolveInterfaces): new entry point to resolve the interface
19535         hierarchy. 
19536         (CodeGen): Property, used to keep track of the code generator.
19537
19538 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
19539
19540         * cs-parser.jay: Add a second production for delegate_declaration
19541         with `VOID'.
19542
19543         (enum_body): Put an opt_comma here instead of putting it on
19544         enum_body or enum_member_declarations so we can handle trailing
19545         commas on enumeration members.  Gets rid of a shift/reduce.
19546
19547         (type_list): Need a COMMA in the middle.
19548
19549         (indexer_declaration): Tell tokenizer to recognize get/set
19550
19551         * Remove old targets.
19552
19553         * Re-add the parser target.
19554
19555 2001-07-13  Simon Cozens <simon@simon-cozens.org>
19556
19557         * cs-parser.jay: Add precendence rules for a number of operators
19558         ot reduce the number of shift/reduce conflicts in the grammar.
19559
19560 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
19561
19562         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
19563         and put it here.
19564
19565         Get rid of old crufty code.
19566
19567         * rootcontext.cs: Use this to keep track of the parsed
19568         representation and the defined types available to the program. 
19569
19570         * gen-treedump.cs: adjust for new convention.
19571
19572         * type.cs: Split out the type manager, and the assembly builder
19573         from here. 
19574
19575         * typemanager.cs: the type manager will live here now.
19576
19577         * cil-codegen.cs: And the code generator here. 
19578
19579 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
19580
19581         * makefile: Fixed up for easy making.
19582
19583 2001-07-13  Simon Cozens <simon@simon-cozens.org>
19584
19585         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
19586         the 
19587
19588         (unary_expression): Expand pre_increment_expression and
19589         post_decrement_expression to reduce a shift/reduce.
19590
19591 2001-07-11  Simon Cozens
19592
19593         * cs-tokenizer.cs: Hex numbers should begin with a 0.
19594
19595         Improve allow_keyword_as_indent name.
19596
19597 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
19598
19599         * Adjustments for Beta2. 
19600
19601 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
19602
19603         * decl.cs: Added `Define' abstract method.
19604         (InTransit): new property, used to catch recursive definitions. 
19605
19606         * interface.cs: Implement `Define'. 
19607
19608         * modifiers.cs: Map Modifiers.constants to
19609         System.Reflection.TypeAttribute flags.
19610
19611         * class.cs: Keep track of types and user-defined types.
19612         (BuilderInit): New method for creating an assembly
19613         (ResolveType): New function to launch the resolution process, only
19614         used by interfaces for now.
19615
19616         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
19617         that are inserted into the name space. 
19618
19619 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
19620
19621         * ARGH.  I have screwed up my tree so many times due to the use of
19622         rsync rather than using CVS.  Going to fix this at once. 
19623
19624         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
19625         load types.
19626
19627 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
19628
19629         * Experiment successful: Use System.Type rather that our own
19630         version of Type.  
19631
19632 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
19633
19634         * cs-parser.jay: Removed nsAliases from here.
19635
19636         Use new namespaces, handle `using XXX;' 
19637
19638         * namespace.cs: Reimplemented namespace handling, use a recursive
19639         definition of the class.  Now we can keep track of using clauses
19640         and catch invalid using clauses.
19641
19642 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
19643
19644         * gen-treedump.cs: Adapted for all the renaming.
19645
19646         * expression.cs (Expression): this class now has a Type property
19647         which returns an expression Type.
19648
19649         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
19650         `Type', as this has a different meaning now in the base
19651
19652 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
19653
19654         * interface.cs, class.cs: Removed from all the sources the
19655         references to signature computation, as we can not do method
19656         signature computation during the parsing time, as we are not
19657         trying to solve at that point distinguishing:
19658
19659         class X {
19660                 void a (Blah x) {}
19661                 void a (NS.Blah x) {}
19662         }
19663
19664         Which depending on the context might be valid or not, as we do not
19665         know if Blah is the same thing as NS.Blah at that point.
19666
19667         * Redid everything so the code uses TypeRefs now instead of
19668         Types.  TypeRefs are just temporary type placeholders, that need
19669         to be resolved.  They initially have a pointer to a string and the
19670         current scope in which they are used.  This is used later by the
19671         compiler to resolve the reference to an actual Type. 
19672
19673         * DeclSpace is no longer a CIR.Type, and neither are
19674         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
19675         are all DeclSpaces, but no Types. 
19676
19677         * type.cs (TypeRefManager): This implements the TypeRef manager,
19678         which keeps track of all the types that need to be resolved after
19679         the parsing has finished. 
19680
19681 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
19682
19683         * ARGH.  We are going to have to store `foreach' as a class rather
19684         than resolving it, as we need to verify error 1579 after name
19685         resolution.   *OR* we could keep a flag that says `This request to
19686         IEnumerator comes from a foreach statement' which we can then use
19687         to generate the error.
19688
19689 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
19690
19691         * class.cs (TypeContainer.AddMethod): we now add methods to the
19692         MethodGroup instead of the method hashtable.  
19693
19694         * expression.cs: Add MethodGroup abstraction, which gets us one
19695         step closer to the specification in the way we handle method
19696         declarations.  
19697
19698         * cs-parser.jay (primary_expression): qualified_identifier now
19699         tried to match up an identifier to a local variable reference or
19700         to a parameter reference.
19701
19702         current_local_parameters is now a parser global variable that
19703         points to the current parameters for the block, used during name
19704         lookup.
19705
19706         (property_declaration): Now creates an implicit `value' argument to
19707         the set accessor.
19708
19709 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
19710
19711         * parameter.cs: Do not use `param' arguments as part of the
19712         signature, per the spec.
19713
19714 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
19715
19716         * decl.cs: Base class for classes, structs and interfaces.  This
19717         is the "Declaration Space" 
19718
19719         * cs-parser.jay: Use CheckDef for checking declaration errors
19720         instead of having one on each function.
19721
19722         * class.cs: Factor out some code for handling error handling in
19723         accordance to the "Declarations" section in the "Basic Concepts"
19724         chapter in the ECMA C# spec.
19725
19726         * interface.cs: Make all interface member classes derive from
19727         InterfaceMemberBase.
19728
19729 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
19730
19731         * Many things: all interfaces are parsed and generated in
19732         gen-treedump.  Support for member variables, constructors,
19733         destructors, properties, constants is there.
19734
19735         Beginning of the IL backend, but very little done, just there for
19736         testing purposes. 
19737
19738 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
19739
19740         * cs-parser.jay: Fix labeled statement.
19741
19742         * cs-tokenizer.cs (escape): Escape " and ' always.
19743         ref_line, ref_name: keep track of the line/filename as instructed
19744         by #line by the compiler.
19745         Parse #line.
19746
19747 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
19748
19749         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
19750         to match the values in System.CodeDOM.
19751
19752         Divid renamed to Divide.
19753
19754         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
19755         statements. 
19756         (Statements.set): remove.
19757
19758         * System.CodeDOM/CodeCatchClause.cs: always have a valid
19759         statements. 
19760
19761         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
19762         falseStatements always have valid values. 
19763
19764         * cs-parser.jay: Use System.CodeDOM now.
19765