2005-01-29 Miguel de Icaza <miguel@novell.com>
[mono.git] / mcs / mcs / ChangeLog
1 2005-01-29  Miguel de Icaza  <miguel@novell.com>
2
3         * pending.cs: Produce better code (no nops produced by using Ldarg
4         + value).
5         
6         * pending.cs (PendingImplementation.DefineProxy): It was not `arg
7         i - 1' it should be arg + 1.
8
9         Fixes bug #71819.
10
11 2005-01-28  Raja R Harinath  <rharinath@novell.com>
12
13         * attribute.cs (Attribute.CheckAttributeType): Make private
14         non-virtual.
15         (Attribute.ResolveType): Make virtual.
16         (GlobalAttribute.ResolveType,GlobalAttribute.Resolve): Simplify
17         handling of RootContext.Tree.Types.
18
19 2005-01-27  Raja R Harinath  <rharinath@novell.com>
20
21         Update attribute-handling to use the SimpleName/MemberAccess
22         mechanisms.
23         * cs-parser.jay (attribute): Pass in an expression to the
24         constructors of Attribute and GlobalAttribute.
25         * attribute.cs (Attribute): Take an expression for the name.
26         (Attribute.ResolvePossibleAttributeTypes): New.  Resolves the
27         passed in attribute name expression.
28         (Attribute.CheckAttributeType): Use it.
29         * ecore.cs (FullNamedExpression.ResolveAsTypeStep): New.
30         * expression.cs (MemberAccess.ResolveAsTypeStep): Move body to ...
31         (MemberAccess.ResolveNamespaceOrType): ... here.  Add 'silent'
32         argument to prevent error messages if the lookup fails.
33
34 2005-01-27  Marek Safar  <marek.safar@seznam.cz>
35
36         * expression.cs (Indirection): Implemented IVariable interface
37         to support indirection in AddressOf operator.
38         (PointerArithmetic.Emit): Add optimalization for case where
39         result can be precomputed.
40
41 2005-01-26  Martin Baulig  <martin@ximian.com>
42
43         * class.cs (TypeContainer.AttributeTargets): Return the correct
44         AttributeTargets depending on our `Kind' instead of throwing an
45         exception; fixes #71632.
46
47 2005-01-26  Marek Safar  <marek.safar@seznam.cz>
48
49         Fix #71257
50         * expression.cs (MemberAccess.ResolveMemberAccess): Add CS0176 test for
51         constant members.
52
53 2005-01-25  Raja R Harinath  <rharinath@novell.com>
54
55         Fix #71602.
56         * expression.cs (MemberAccess.DoResolve): Don't complain with
57         cs0572 when the LHS of a member access has identical name and type
58         name.
59
60 2005-01-25  Marek Safar  <marek.safar@seznam.cz>
61
62         Fix #71651, #71675
63         * attribute.cs (ExtractSecurityPermissionSet): Catch exceptions from
64         CreatePermission.
65         Create custom PermissionSet only for PermissionSetAttribute.
66
67 2005-01-24  Marek Safar  <marek.safar@seznam.cz>
68
69         Fix #71649
70         * class.cs (StaticClass.DefineContainerMembers): Enable enums and
71         delegates in static class.
72
73 2005-01-24  Martin Baulig  <martin@ximian.com>
74
75         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
76         merging an implicit block, just use its reachability.
77
78         * statement.cs (Block.Resolve): Make the unreachable code check
79         work wrt. implicit blocks; see test-337 from #63842.
80
81 2005-01-21  Alp Toker  <alp@atoker.com>
82  
83         * cs-parser.jay: destructor_declaration's container is PartialContainer
84         not Class when partial types are used, so use Kind prop instead of
85         'is'.
86         
87 2005-01-22  Miguel de Icaza  <miguel@ximian.com>
88
89         * cs-parser.jay: Improve error reporting when an interface
90         declares new types.
91
92 2005-01-20  Dick Porter  <dick@ximian.com>
93
94         * support.cs: SeekableStreamReader fix from Sandor Dobos
95         (dobos_s@ibcnet.hu) to cope with Position setting when multibyte
96         chars are read.  Fixes bug 70369.
97
98 2005-01-20  Raja R Harinath  <rharinath@novell.com>
99
100         * cs-parser.jay (catch_clause): Simplify current_block handling
101         somewhat.
102
103 2005-01-17  Miguel de Icaza  <miguel@ximian.com>
104
105         * convert.cs (ImplicitStandardConversionExists): Synchronize the
106         code with ImplicitStandardConversion to handle the implicit
107         conversion of method groups into valid delegate invocations. 
108
109         The problem is that in parameter handling we were using this code
110         path.  Fixes bug #64698
111
112 2005-01-19  Raja R Harinath  <rharinath@novell.com>
113
114         * cs-parser.jay: Fix several infelicities.
115         - Avoid assigning to the parser value stack.  Code like 
116           '$3 = null' is unclean.  Synthesize a value for the code block
117           instead. 
118         - Avoid using oob_stack for storing location information.  Use ...
119         (_mark_): ... this.  New (empty) rule.  Saves the current location
120         in $$.
121         (foreach_statement): Avoid using oob_stack for current_block
122         handling.  Use technique used in for_statement and
123         using_statement.  Synthesize a value for the code block to store
124         additional intermediate information.
125
126 2005-01-13  Miguel de Icaza  <miguel@ximian.com>
127
128         * ecore.cs (IsAccessorAccessible): Accessibility to private fields
129         of a different type is only allowed to private fields of a
130         containing type, not on fields of a base class.
131
132         See test-174.cs and error cs0122-9.cs
133
134 2005-01-13  Raja R Harinath  <rharinath@novell.com>
135
136         Fix test-335.cs (bug #58126).
137         * cs-parser.jay (argument): Split out non-expression parts of the
138         rule into 'non_simple_argument'.
139         (invocation_expression): Support parenthesized invocations with
140         multiple arguments, and with single non-simple arguments.
141
142 2005-01-13  Raja R Harinath  <rharinath@novell.com>
143
144         * cs-tokenizer.cs (xtoken): Reset 'comments_seen' in a couple more
145         places.
146
147 2005-01-12  Raja R Harinath  <rharinath@novell.com>
148
149         Fix cs0038-1.cs, cs1640-6.cs.
150         * ecore.cs (Expression.Resolve): Remove special-case for
151         SimpleName in error-handling.
152         (Expression.almostMatchedMembers): Relax access permission to
153         protected.
154         (Expression.MemberLookupFailed): Handle duplicates in
155         almostMatchedMembers list.
156         (SimpleName.DoSimpleNameResolve): Catch CS0038 errors earlier.
157         * expression.cs (New.DoResolve): Report CS1540 for more cases.
158         * typemanager.cs (GetFullNameSignature): Use the MethodBase
159         overload if the passed in MemberInfo is a MethodBase.
160
161 2005-01-12  Marek Safar  <marek.safar@seznam.cz>
162
163         Fix #70749
164         * attribute.cs (ExtractSecurityPermissionSet): Don't report error
165         for non-CAS & merge permission sets properly.
166
167 2005-01-11  Raja R Harinath  <rharinath@novell.com>
168
169         Improve standard-compliance of simple name and member access 
170         resolution.  Fixes bugs #52697, #57200, #67520, #69519.
171         * ecore.cs (FullNamedExpression): New abstract base class 
172         for Namespaces and TypeExpressions.
173         (ResolveFlags.SimpleName): Remove.
174         (SimpleName): Remove support for dotted names.
175         (SimpleName.ResolveAsTypeStep): Simplify.  Now just a wrapper to 
176         DeclSpace.FindType and DeclSpace.LookupType.
177         (SimpleName.DoSimpleNameResolve): Remove support for dotted names.
178         (Expression.ExprClassName): Make member function.
179         * expression.cs (MemberAccess.ResolveAsTypeStep): Support LHS being
180         a namespace.  Remove creation of dotted "SimpleName"s.
181         (MemberAccess.DoResolve): Likewise.
182         * decl.cs (DeclSpace.Cache): Make private.
183         (DeclSpace.LookupInterfaceOrClass): Return a FullNamedExpression.
184         (DeclSpace.FindType): Update.
185         (DeclSpace.LookupType): Move here from RootContext.  Return a 
186         FullNamedExpression.
187         * namespace.cs (Namespace): Derive from FullNamedExpression
188         so that it can be part of expression resolution.
189         (Namespace.Lookup): Return an FullNamedExpression.
190         (NamespaceEntry.LookupAlias): Lookup aliases only in current
191         namespace.
192         * rootcontext.cs (NamespaceLookup): Remove.
193         (LookupType): Move to DeclSpace.
194         * attribute.cs (CheckAttributeType): Update.
195         * doc.cs (FindDocumentedType): Remove allowAlias argument.
196         (FindDocumentedTypeNonArray): Likewise.
197
198 2005-01-11  Raja R Harinath  <rharinath@novell.com>
199
200         Fix cs0509.cs, cs1632.cs.
201         * class.cs (TypeContainer.GetNormalBases): Don't assume !IsClass
202         is the same as IsInterface.
203         (TypeContainer.GetClassBases): Likewise.
204         * statement.cs (LabeledStatement.ig): New field.
205         (LabeledStatement.LabelTarget): Save ILGenerator which created the
206         label.
207         (LabeledStatement.DoEmit): Check that the label was created with
208         the same ILGenerator.
209
210 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
211
212         Fix #71058
213         * attribute.cs (GetMethodObsoleteAttribute): Need to transform
214         accessors to its properties.
215
216         * ecore.cs (PropertyExpr): Add AccessorTable to help track back
217         from accessors to property.
218         
219 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
220
221         Fix #70722
222         * class.cs (MethodCore.CheckBase): Test base method obsoleteness
223         only for overrides.
224         
225 2005-01-08  Miguel de Icaza  <miguel@ximian.com>
226
227         * attribute.cs: Check for null and empty strings.  
228
229         I have lost another battle to Paolo.
230
231 2005-01-07  Marek Safar  <marek.safar@seznam.cz>
232
233         Fix #70942
234         * class.cs (PropertyMethod): Set Parent field in ctors.
235         (SetMethod.InternalParameters): Add unsafe switch hack.
236         Override MarkForDuplicationCheck where it is appropriate.
237
238         * decl.cs (MemberCore.MarkForDuplicationCheck): New method.
239         It says whether container allows members with the same name.
240         Base default is no.
241         (DeclSpace.AddToContainer): Use MarkForDuplicationCheck.
242         Removed is_method parameter.
243
244 2005-01-06  Duncan Mak  <duncan@ximian.com>
245
246         * cs-tokenizer.cs (xtoken): Redo the work for signaling CS1040
247         because the previous change led to incorrect reporting of CS1032
248         ("Cannot define/undefine preprocessor symbols after first token in
249         file"). Instead of using `tokens_seen' as the only flag that
250         triggers CS1040, introduce `comments_seen'. This new flag is used
251         to signify having seen comments on the current line, so it is
252         unset after a newline.
253
254 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
255
256         * doc.cs : When searching for a type, find nested type too.
257           This fixes bug #71040.
258
259 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
260
261         * doc.cs :
262           - Warn missing member comment on those classes which also does not
263             have doc comments. Fixed bug #71041.
264           - Don't warn missing doc comment on default constructor.
265             Fixed bug #71042.
266
267 2005-01-06  Duncan Mak  <duncan@ximian.com>
268
269         * cs-tokenizer.cs (xtoken): After handling traditional C-style
270         comments, set `tokens_seen' to true. This allows us to detect
271         misplaced preprocessor directives (i.e. not at the beginning of
272         the a line, nor after whitespaces). In that case, report error
273         CS1040. This fixes bug #56460.
274
275         * cs-parser.jay (interface_member_declaration): Add checks for
276         IsExplicitImpl, and report CS0541 error if an interface member is
277         defined as an explicit interface declaration.
278
279 2005-01-06  Marek Safar  <marek.safar@seznam.cz>
280
281         Fix #70817
282         * class.cs (PropertyMethod): Set Parent field in ctors.
283         (SetMethod.InternalParameters): Add unsafe switch hack.
284         
285         * decl.cs (MemberCore.Parent): Cannot be readonly.
286
287 2005-01-06  Raja R Harinath  <rharinath@novell.com>
288
289         * decl.cs (DeclSpace.ResolveType): Remove.
290         (DeclSpace.ResolveBaseTypeExpr): Rename from ResolveTypeExpr.
291         Merge in code from ...
292         (DeclSpace.GetTypeResolvingEmitContext): ... here.  Remove.
293         * class.cs, enum.cs: Update to changes.
294
295 2005-01-06  Miguel de Icaza  <miguel@ximian.com>
296
297         * anonymous.cs: Ensure that we init the scope of our parent if it
298         has not been initialized yet.
299
300 2004-12-30  Duncan Mak  <duncan@ximian.com>
301
302         * typemanager.cs (TypeManager.CheckStructCycles): Don't crash here
303         if field.FieldBuilder is null. Fixes #70758.
304
305         * convert.cs: Fixed some typos and updated some of the comments.
306         (ImplicitStandardConversionExists):
307         (TryImplicitIntConversion): If `target_type' is an interface and
308         the type of `ic' implements this interface, return true or a new
309         BoxedCast instead of null. This fixes #70468.
310
311 2004-12-29  Duncan Mak  <duncan@ximian.com>
312
313         * expression.cs (Argument.Emit): Check that Expr is
314         IMemoryLocation before casting to it, and report CS1510 otherwise.
315
316         This fixes #70402.
317
318 2004-12-21  Ben Maurer  <bmaurer@ximian.com>
319
320         * statement.cs (Block.ThisVariable): remove the recursion here, to
321         make the --profile more sane.
322
323 2004-12-17  Carlos Cortez <calberto.cortez@gmail.com>
324
325         * driver.cs: Patch to handle a xsp bug that prevents to reference an .exe
326         assembly, by JB Evain.
327
328 2004-12-17  Raja R Harinath  <rharinath@novell.com>
329
330         * class.cs, decl.cs, ecore.cs, iterators.cs, pending.cs, 
331           rootcontext.cs, typemanager.cs: Make nomenclature consistent.
332         "parent" refers to enclosing type/class.  "base" refers to superclass.
333
334 2004-12-17  Raja R Harinath  <rharinath@novell.com>
335
336         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
337         Ensure that we only have GlobalAttributes.
338         * attribute.cs (Attribute.Emit): Make non-virtual.
339         (GlobalAttribute.Emit): Remove.
340         (Attribute.Resolve): Make virtual.
341         (GlobalAttribute.Resolve): New.  Set Rootcontext.Tree.Types.NamespaceEntry.
342         (Attribute.GetConditionalAttributeValue): Take an EmitContext as
343         the argument. Don't create one.
344         (Attribute.GetObsoleteAttribute): Likewise.
345         (Attribute.GetClsCompliantAttributeValue): Likewise.
346         * class.cs, decl.cs: Update to changes.
347
348 2004-12-17  Marek Safar  <marek.safar@seznam.cz>
349
350         * delegate.cs (NewDelegate.DoResolve): Add error 149 report.
351         
352         * ecore.cs (Expression.MemberLookupFailed): Fixed error 143.
353         
354         * statement.cs (Foreach.Resolve): Add error 186 report.
355
356 2004-12-16  Marek Safar  <marek.safar@seznam.cz>
357
358         * expression.cs (Conditional.DoResolve): Add warning 429.
359         
360         * statement.cs (If.Resolve): Add warning 665.
361
362 2004-12-16  Raja R Harinath  <rharinath@novell.com>
363
364         New invariant: RootContext.Tree.Types.NamespaceEntry == null
365         except when in the parser, and in GlobalAttribute.
366         * driver.cs (MainDriver): Reset RootContext.Tree.Types.NamespaceEntry.
367         * attribute.cs (GlobalAttribute.CheckAttributeType): Reset
368         RootContext.Tree.Types.NamespaceEntry once work is done.
369         (GlobalAttribute.Emit): New.  Wrapper for Attribute.Emit, but sets
370         and resets RootContext.Tree.Types.NamespaceEntry.
371
372 2004-12-15  Marek Safar  <marek.safar@seznam.cz>
373
374         * cs-parser.jay: Don't create a block for every variable.
375
376 2004-12-14  Miguel de Icaza  <miguel@ximian.com>
377
378         * location.cs: Provide extra information.
379
380         * statement.cs: The instance is not `ldarg_0.THIS' when accessing
381         variables from the captured environment, it is the ldarg_0.
382
383 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
384
385         * cs-parser.jay: Changed warning level for 642 to 4 until Miguel
386         find a conclusion.
387         
388         * class.cs: Changed warning level for 169 to avoid developer
389         displeasure from warning flooding. It will be changed back when they
390         fix most of current BCL warnings.
391         
392         * RootContext.cs: Pushed default WarningLevel to 3.
393         
394         * statement.cs: Removed unused variable.
395
396 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
397
398         * class.cs (TypeContainer.GetClassBases): Add error 1521 report.
399         (TypeContainer.MethodModifiersValid): Refactored to use MemberCore.
400         Add error 502 report.
401         (StaticClass.DefineType): Add error 441 report.
402         (Class.AllowedModifiersProp): New virtual property as temporary
403         extension to AllowedModifiers.
404         (Class.DefineType): Add error 418 report. Moved ModFlags check here
405         to share implementation with StaticClass and don't call virtual
406         methods from ctor.
407         
408         * driver.cs (MainDriver): Add error 1558 test.
409
410         * parameter.cs (Parameter.ApplyAttributeBuilder): Add error 662
411         report. Moved error 36 test here.
412
413         * statement.cs (Throw.Resolve): Add error 724 report.
414
415         * typemanager.cs: Add out_attribute_type core type.
416         
417 2004-12-13  Marek Safar  <marek.safar@seznam.cz>
418
419         * class.cs (TypeContainer.VerifyClsCompliance): Add error
420         3018 report.
421         (PropertyBase.VerifyClsCompliance): Add errror 3025 report.
422
423         * codegen.cs (ModuleClass.ApplyAttributeBuilder): Add error
424         3017 report.
425         
426         * decl.cs (MemberCore.VerifyClsCompliance): Add warning 3021.
427
428         * parameter.cs (ReturnParameter.ApplyAttributeBuilder): 
429         Add error 3023 report.
430         (Parameter.ApplyAttributeBuilder): Add error 3022 report.
431
432         * tree.cs (RootTypes.IsClsCompliaceRequired): Add fake
433         implementation.
434
435 2004-12-12  John Luke  <john.luke@gmail.com>
436
437         * driver.cs (AddArgs): take -- into account when
438         adding arguments, fixes bug 65710 
439
440 2004-12-12  Martin Baulig  <martin@ximian.com>
441
442         * expression.cs (Unary.TryReduceNegative): Added support for
443         SByteConstant and ByteConstant.
444         (Unary.Reduce): Check error values from TryReduceNegative().
445
446 2004-12-10  Marek Safar  <marek.safar@seznam.cz>
447
448         * attributes.cs (Attribute.Resolve): Avoid multiple error report
449         and report exception as error 182.
450
451 2004-12-10  Raja R Harinath  <rharinath@novell.com>
452
453         * driver.cs (Main): Fix message when there are warnings.
454
455 2004-12-09  Miguel de Icaza  <miguel@ximian.com>
456
457         * delegate.cs: Fixed my fix from yesterday, sorry about that.
458
459 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
460
461         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
462         Reduced number of warnings.
463         
464         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
465
466 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
467
468         * driver.cs: Removed message.
469
470         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
471
472 2004-12-08    <vargaz@freemail.hu>
473
474         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
475
476 2004-12-08  Martin Baulig  <martin@ximian.com>
477
478         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
479         instead of a CS3002 for properties and indexer.
480
481 2004-12-08  Martin Baulig  <martin@ximian.com>
482
483         * decl.cs (MemberName.ToString): Make this work again.
484
485 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
486
487         * attribute.cs (Resolve): Add error 591 detection.
488
489         * class.cs (FieldMember.Define): Add error 1547 detection.
490         (Indexer.Define): Add error 620 detection.
491         (Operator.Define): Add error 590 detection.
492
493         * ecore.cs: Missing argument for error 79.
494
495         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
496         detection.
497
498 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
499
500         Fix #70106
501         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
502         only.
503
504 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
505
506         * cs-parser.jay : handle doc comments on implicit/explicit operators.
507           Some operator comments were suppressed.
508         * doc.cs : Implicit/explicit operator name in doc comments are like
509           "op_Explicit(type)~returnType", so added suffix handling.
510
511 2004-12-07  Martin Baulig  <martin@ximian.com>
512
513         * decl.cs
514         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
515         (MemberCore.GetClsCompliantAttributeValue): Likewise.
516         (DeclSpace.ec): New protected field; store the EmitContext here.
517         (DeclSpace.EmitContext): New public property; moved here from
518         `TypeContainer'.
519         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
520         EmitContext.
521
522         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
523         (Enum.Emit): Don't create a new EmitContext.
524
525         * delegate.cs (Delegate.DefineType): Always create the
526         EmitContext.
527
528         * iterators.cs (Iterators.DefineIterator): Create a new
529         EmitContext and store it in `ec'.
530
531 2004-08-24  Martin Baulig  <martin@ximian.com>
532
533         * typemanager.cs
534         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
535         this for accessibility checks.
536         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
537         IsNestedFamilyAccessible.
538         (TypeManager.IsSubclassOf): New method, do what the name actually
539         says.   
540
541 2004-12-06  Raja R Harinath  <rharinath@novell.com>
542
543         Fix crash on cs0657-17.cs.
544         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
545         Use RootContext.Tree.Types, not 'new RootTypes ()'.
546         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
547         the case where the NamespaceEntry gets overwritten.
548
549 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
550
551         Fixed #69195, #56821
552         * ecore.cs (ResolveBoolean): Tiny refactoring.
553
554         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
555         of right expression resolving when left is false constant and
556         operator is LogicalAnd OR true constant and operator is LogicalOr.
557
558         * statement.cs (ResolveUnreachable): Always reports warning.
559
560 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
561
562         * class.cs: Distinguish between 1721 and 1722 (just a little help
563         for the programmer).
564
565 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
566
567         * delegate.cs: Only allow this on new versions of the language. 
568
569 2004-12-02  Duncan Mak  <duncan@ximian.com>
570
571         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
572         Expression class.
573         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
574         here as a static method. Take an additional bool out parameter
575         `must_do_cs1540_check' for signaling to InstanceResolve.
576         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
577         member field from PropertyExpr class and made it an argument of
578         the method instead.
579         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
580         check for MarshalByRefObject, and report CS0122 instead of CS1540.
581         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
582         and `remove_accessor' as well as InstanceResolve: report CS0122
583         where applicable.
584
585         Fixes #70129.
586
587 2004-12-03  Raja R Harinath  <rharinath@novell.com>
588
589         Fix test-327.cs, test-328.cs, and put in early infrastructure
590         for eventually fixing #52697.
591         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
592         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
593         from other methods.
594         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
595         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
596         (VerifyUsing, error246): Update.
597         * rootcontext.cs (RootContext.NamespaceLookup): Just use
598         'NamespaceEntry.LookupNamespaceOrType'.
599
600 2004-12-03  Martin Baulig  <martin@ximian.com>
601
602         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
603         method as our child, call AnonymousMethod.Compatible() on it.
604
605 2004-12-03  Raja R Harinath  <rharinath@novell.com>
606
607         Disable XML documentation support in 'basic' profile.
608         * decl.cs, class.cs [BOOTSTRAP_WITH_OLDLIB]: Don't import System.Xml.
609         Redirect XmlElement to System.Object.
610         * driver.cs, enum.cs, rootcontext.cs: Don't reference System.Xml.
611         * doc.cs [BOOTSTRAP_WITH_OLDLIB]: Disable compile.
612         * mcs.exe.sources: Add doc-bootstrap.cs.
613         * doc-bootstrap.cs: New file.  Contains empty stub implementation
614         of doc.cs.
615
616 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
617
618         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
619           comments are allowed.
620
621 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
622
623         * delegate.cs: Add checks for subtypes in paramaters and return values
624         in VerifyMethod () to add support for Covariance/Contravariance
625         in delegates.
626         
627 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
628
629         * report.cs: Remove extra closing parenthesis.
630
631         * convert.cs (Error_CannotImplicitConversion): If the name of the
632         types are the same, provide some extra information.
633
634         * class.cs (FieldBase): Use an unused bit field from the field to
635         encode the `has_offset' property from the FieldMember.  This saves
636         a couple of Ks on bootstrap compilation.
637
638         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
639         method as our child, return the AnonymousMethod resolved
640         expression.
641
642         * expression.cs (New.DoResolve): Allow return values from
643         NewDelegate to also include AnonymousMethods.
644
645         Fixes #70150.
646
647 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
648
649         Fix bug #70102
650         * attribute.cs (Resolve): Improved implementation of params
651         attribute arguments.
652
653         * support.cs (ParameterData): Add HasParams to be faster.
654
655 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
656
657         all things are for /doc support:
658
659         * doc.cs: new file that supports XML documentation generation.
660         * mcs.exe.sources: added doc.cs.
661         * driver.cs:
662           Handle /doc command line option.
663           Report error 2006 instead of 5 for missing file name for /doc.
664           Generate XML documentation when required, after type resolution.
665         * cs-tokenizer.cs:
666           Added support for picking up documentation (/// and /** ... */),
667           including a new XmlCommentState enumeration.
668         * cs-parser.jay:
669           Added lines to fill Documentation element for field, constant,
670           property, indexer, method, constructor, destructor, operator, event
671           and class, struct, interface, delegate, enum.
672           Added lines to warn incorrect comment.
673         * rootcontext.cs :
674           Added Documentation field (passed only when /doc was specified).
675         * decl.cs:
676           Added DocComment, DocCommentHeader, GenerateDocComment() and
677           OnGenerateDocComment() and some supporting private members for
678           /doc feature to MemberCore.
679         * class.cs:
680           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
681         * delegate.cs:
682           Added overriden DocCommentHeader.
683         * enum.cs:
684           Added overriden DocCommentHeader and GenerateDocComment().
685
686 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
687
688         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
689         unwrapping the enumeration values, chain to
690         DoConstantNumericPromotions again, so we can promote things to the
691         fundamental types (takes care of enums that are bytes, sbytes).
692
693         Fixes bug #62054.
694
695 2004-12-01  Raja R Harinath  <rharinath@novell.com>
696
697         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
698         Fix long-standing bug in type-lookup.  Use FindType instead of
699         LookupType when ec.ResolvingTypeTree.
700         (Attribute.ResolveType, Attribute.Resolve)
701         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
702         Update to changes.
703         (Attributes.Search): Remove internal version.  Update.
704         (Attributes.SearchMulti): Update.
705         (Attributes.GetClsCompliantAttribute): Remove.
706         (Attributes.GetIndexerNameAttribute): Remove.
707         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
708         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
709         * class.cs (Indexer.Define): Likewise.
710
711 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
712
713         Fix bug #68790
714         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
715         MarshallByReference members access.
716
717         * expression.cs: Use CheckMarshallByRefAccess;
718         Better error CS0197 message.
719
720         * report.cs: Print whole related error message.
721
722 2004-11-30  Raja R Harinath  <rharinath@novell.com>
723
724         * Makefile (mcs.exe) [PROFILE=default]: Keep a copy of mcs.exe in
725         the current directory to help debugging.
726
727 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
728
729         * class (GetClassBases): Better error 60 report.
730         (EventProperty): Disabled warning 67 detection.
731
732 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
733
734         Fix bug #60324
735         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
736
737         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
738         precise values.
739
740 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
741
742         Fix bug #49488
743         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
744
745         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
746
747 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
748
749         * attribute.cs (Attribute.Resolve): Refine error reporting and
750         report a cs0117 if the identifier does not exist, to distinguish
751         from 0617 which is a miss-use of the actual identifier.
752
753         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
754         between cs0070 and cs0079.
755
756         * class.cs (MemberBase.DoDefine): When reporting a wrong
757         accessibility level, we use MethodCore to compare instead of
758         Method (this was a regression in some refactoring effort).
759
760         So now we correctly report cs0056 again.
761
762         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
763         testing the target_type (which was known to be object_type) and
764         not the source type (which is anonymous_method).
765
766         Fixed reporting of error cs1660.
767
768         * expression.cs (UserCast.Source): Expose the underlying cast.
769
770         * statement.cs (Switch.SwitchGoverningType): Sort the list of
771         allowed types to find a match to int32 first (most common).
772
773         In addition, it ignores any ImplicitUserConversions that did an
774         internal implicit conversion (as the switch statement allows only
775         one integral conversion to exist).
776
777         * class.cs (PartialContainer.Create): rename `name' to
778         `member_name' for clarity.  Then replace the string calls with a
779         call to MemberName.GetPartialName, as now using
780         MemberName.ToString is an error (this is due to the side effects
781         it had, that were fixed in the past).
782
783         This will restore the error reporting on a number of partial class
784         errors that were missusing this (and getting an exception as a
785         results, which is now just a plain textual warning, because
786         yyparse debug output would crash otherwise).
787
788 2004-11-26  Raja R Harinath  <rharinath@novell.com>
789
790         * Makefile (PROGRAM_INSTALL_DIR): Remove.
791
792 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
793
794         * rootcontext.cs (LookupType): Make sure to cache lookups that
795         don't give us a negative result. This saves about 5% of corlib
796         compilation time.
797
798 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
799
800         * report.cs (AbstractMessage.Print): messages are sent to stderr
801
802         * class.cs (TypeContainer.GetClassBases): It is an error to have a
803         non-interface in the list of interfaces (at this point, either
804         parent was properly set, or a base class is being listed in the
805         interfaces section).
806
807         This flags error 1722, and resolves the crash from bug 69259.
808
809 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
810
811         * statement.cs (Using.EmitExpressionFinally): make this work right
812         for valuetypes. Fixes 69926.
813
814 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
815
816         * const.cs (Const.ChangeType): Cope with the "0 literal can be
817         converted to an enum" here, before we try to change the underlying
818         type.  This code exists, but it is a different code path than the
819         one used while encoding constants.
820
821         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
822         old bug: when converting from the null literal to a pointer,
823         return an EmptyCast, not the NullLiteral.
824
825         This fixes #69921, the recent null_type changes probably made this
826         bug more prominent.
827
828         (ImplicitReferenceConversionExists): In addition, resynchronized
829         the code here, so it matches the same code in
830         ImplicitReferenceConversionExists for the `from any class-type S
831         to any interface-type T'.
832         
833
834 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
835
836         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
837
838 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
839
840         * cs-parser.jay: Use verbosity accordingly. 
841
842 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
843
844         * expression.cs (Unary.ResolveOperator): Do not report warning;
845         AddressOf reads from variable.
846         
847         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
848
849 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
850
851         Fix bug #69462
852
853         * attribute.cs (Attributable): Removed CheckTargets.
854         (Attributes.Emit): Explicit attribute targets are tested here.
855
856         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
857         not enabled for interfaces.
858
859         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
860         (GetAssemblyName): Ouch next bug there.
861
862 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
863
864         * expression.cs: Error 275 added.
865         
866 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
867
868         Fix bug #69177 (Implemented decimal constant support)
869
870         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
871         (BinaryFold): Add DecimalConstant.
872
873         * const.cs (Define): Decimal constant 
874         (is not constant.
875         (ChangeType): Add decimal type handling.
876         (LookupConstantValue): Don't set value for decimal type but
877         emit DecimalConstantAttribute. Needed for constant optimization.
878
879         * constant.cs (ToDecimal): New method.
880         (ConvertToDecimal): New method.
881         (IntConstant): Implemented ConvertToDecimal.
882         (DecimalConstant.Emit): Emit optimized version for decimals in
883         int range.
884
885         * expression.cs (ResolveOperator): Changed order of constant
886         reduction to work correctly with native types which have
887         overloaded operators.
888         (ResolveMemberAccess): Extract constant value from attribute
889         for decimal type.
890
891         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
892
893         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
894         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
895         (ChangeType): Decimal is special.
896         (TypeToCoreType): Add decimal type.
897
898 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
899
900         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
901         decimal types.
902
903 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
904
905         * class.cs (EventField.ApplyAttributeBuilder): Fix error
906         test cs1667-5.cs.
907
908 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
909
910         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
911
912         * pending.cs (PendingImplementation): Grab only interfaces.
913
914 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
915
916         * statement.cs (ForeachHelperMethods): Add location member and
917         error 202 detection.
918
919 2004-11-19  Raja R Harinath  <rharinath@novell.com>
920
921         * Makefile (EXTRA_DISTFILES): Remove mcs.exe.config.  It's
922         automatically handled by executable.make.
923         (PROGRAM): Make profile-specific.
924
925 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
926
927         * expression.cs (DoResolveBase): Fixed wrong warning for out
928         variables.
929
930 2004-11-18  Martin Baulig  <martin@ximian.com>
931
932         Merged latest changes into gmcs.  Please keep this comment in
933         here, it makes it easier for me to see what changed in MCS since
934         the last time I merged.
935
936 2004-11-17  Raja R Harinath  <rharinath@novell.com>
937
938         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
939         (TypeHandle.GetMemberCache): New.
940         (TypeHandle.TypeHandle): Update.
941         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
942         (TypeManager.LookupParentInterfacesCache):
943         Rename from LookupInterfaceCache.  Optimize slightly.
944         (TypeManager.MemberLookup_FindMembers): Update.
945         * decl.cs (MemberCache.MemberCache): Set Container to null in the
946         multi-type variant.
947         (AddCacheContents): Rename from AddHashtable.
948         * class.cs (TypeContainer.parent_container): Remove.
949         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
950         (TypeContainer.DoDefineMembers): Don't initialize it.
951         Update to name changes.
952         
953 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
954
955         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
956         that factors the code to check access modifiers on override.  
957
958         (PropertyBase): Use the code here.
959
960         Patch from Lluis S'anchez, fixes bug #69361.
961
962 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
963
964         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
965         routine that is used to report the use of a captured variable
966         whose address has been taken.
967
968         There are two checks: one when variables are being captured and
969         the other check is when the address of a variable is taken. 
970         
971         (because an anonymous methods might be resolved before *or* after
972         the address has been taken) and 
973
974         * expression.cs (Conditional.DoResolve): Remove the special
975         casing that Martin added to trueExpr and falseExpr being both
976         NullLiteral.  We get the right behavior now just by introducing
977         the null_type into the compiler. 
978
979         * convert.cs (ExplicitConversion): Change the code to use
980         null_type instead of testing `expr is NullLiteral'.
981         (ImplicitConversionStandard): use null_type too.
982         (ImplicitReferenceConversionExists): use null_type too.
983         (ImplicitReferenceConversion): use null_type too.
984
985         * literal.cs: The type of `NullLiteral' is now null_type instead
986         of object_type. 
987         (Resolve): Set the type here.
988
989         * typemanager.cs: Introduce null_type.
990
991 2004-11-17  Martin Baulig  <martin@ximian.com>
992
993         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
994         direction, like FindMembers() does.  Fixes #69546, testcase is in
995         test-315.cs.    
996
997 2004-11-16  Martin Baulig  <martin@ximian.com>
998
999         This is based on a patch from Marek Safar, see bug #69082.
1000         Fixes bugs #63705 and #67130.
1001
1002         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
1003         method; create a MemberCache for an interface type and cache the
1004         result.
1005
1006         * decl.cs (IMemberContainer.ParentContainer): Removed.
1007         (IMemberContainer.ParentCache): New property.
1008         (MemberCache.SetupCacheForInterface): Removed.
1009         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
1010         to create a cache for an interface's "parent".
1011
1012         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
1013         interfaces too.
1014
1015 2004-11-16  Martin Baulig  <martin@ximian.com>
1016
1017         Merged back from gmcs; these changes already went into gmcs a
1018         couple of weeks ago.
1019
1020         * typemanager.cs
1021         (TypeManager.AddUserType): Removed the `ifaces' argument.
1022         (TypeManager.RegisterBuilder): Take a `Type []' instead of a
1023         `TypeExpr []'.
1024         (TypeManager.AddUserInterface): Removed.
1025         (TypeManager.ExpandInterfaces): Return a `Type []' instead of a
1026         `TypeExpr []'.
1027         (TypeManager.GetInterfaces): Likewise.
1028         (TypeManager.GetExplicitInterfaces): Likewise.
1029
1030         * ecore.cs (TypeExpr.GetInterfaces): Removed.
1031
1032         * class.cs (TypeContainer.base_class_type): Replaced with `ptype'.
1033         (TypeContainer.base_inteface_types): Replaced with `ifaces'.
1034
1035 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
1036
1037         * statement.cs: Avoid adding bools to a hashtable.
1038
1039 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
1040
1041         * expression.cs (Invocation.OverloadResolve): Flag error if we are
1042         calling an unsafe method from a safe location.
1043
1044 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
1045
1046         Fix #69167
1047         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
1048
1049 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
1050
1051         * namespace.cs (VerifyUsing): use GetPartialName instead of
1052         ToString. 
1053
1054 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
1055
1056         * statement.cs (Return.Resolve): Fix regression in typo: if
1057         `in_exc', we have to request a NeedReturnLabel, this was a typo
1058         introduced in the anonymous method check-in.  Fixes #69131.
1059
1060         * Indexers were using the ShortName when defining themselves,
1061         causing a regression in the compiler bootstrap when applying the
1062         patch from 2004-11-02 (first part), now they use their full name
1063         and the bug is gone.
1064
1065 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
1066
1067         * driver.cs: Strip the path from the names of embedded resources. Fixes
1068         #68519.
1069
1070 2004-11-04  Raja R Harinath  <rharinath@novell.com>
1071
1072         Fix error message regression: cs0104-2.cs.
1073         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
1074         (AliasEntry.Resolve): Update.
1075         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
1076         'silent' flag.
1077         (RootContext.LookupType): Update.
1078
1079 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
1080
1081         * cs-parser.jay: Add support for handling accessor modifiers
1082         * class: Add support port accessor modifiers and error checking,
1083         define PropertyMethod.Define as virtual (not abstract anymore)
1084         * ecore.cs: Add checking for proeprties access with access modifiers
1085         * iterators.cs: Modify Accessor constructor call based in the modified
1086         constructor
1087 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
1088
1089         * expression.cs (StringConcat): Handle being called twice,
1090         as when we have a concat in a field init with more than two
1091         ctors in the class
1092
1093 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
1094
1095         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
1096         special case explicit implementations, we should always produce
1097         the .property or .event declaration.
1098         
1099         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
1100         since it will not return correct data if people use this
1101         unresolved in the presence of using statements (see test-313).
1102
1103         * class.cs (MethodData.Define): If we are an explicit interface
1104         implementation, set the method name to the full name of the
1105         interface plus the name of the method.  
1106
1107         Notice that using the method.MethodName.GetFullName() does not
1108         work, as it will only contain the name as declared on the source
1109         file (it can be a shorthand in the presence of using statements)
1110         and not the fully qualifed type name, for example:
1111
1112         using System;
1113
1114         class D : ICloneable {
1115                 object ICloneable.Clone ()  {
1116                 }
1117         }
1118
1119         Would produce a method called `ICloneable.Clone' instead of
1120         `System.ICloneable.Clone'.
1121
1122         * namespace.cs (Alias.Resolve): Use GetPartialName.
1123         
1124 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
1125
1126         * cs-parser.jay: Add error 1055 report.
1127
1128 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
1129
1130         * assign.cs (Assign.DoResolve): Only do the transform of
1131         assignment into a New if the types are compatible, if not, fall
1132         through and let the implicit code deal with the errors and with
1133         the necessary conversions. 
1134
1135 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
1136
1137         * cs-parser.jay: Add error 1031 report.
1138
1139         * cs-tokenizer.cs: Add location for error 1038.
1140
1141 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1142
1143         * cs-parser.jay: Add error 1016 report.
1144
1145 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1146
1147         * cs-parser.jay: Add errors 1575,1611 report.
1148
1149 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1150
1151         * cs-parser.jay: Add error 1001 report.
1152
1153 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1154
1155         Fix #68850
1156         * attribute.cs (GetMarshal): Add method argument for
1157         caller identification.
1158
1159         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
1160         agument for GetMarshal and RuntimeMissingSupport.
1161
1162 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1163
1164         * attribute.cs (ExtractSecurityPermissionSet): Removed
1165         TypeManager.code_access_permission_type.
1166
1167         * typemanager.cs: Removed TypeManager.code_access_permission_type.
1168
1169 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
1170
1171         * expression.cs (LocalVariableReference.DoResolveLValue): Check
1172         for obsolete use of a variable here.   Fixes regression on errors
1173         cs0619-25 and cs0619-26.
1174
1175 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
1176
1177         Fix #62358, implemented security attribute encoding.
1178
1179         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
1180         Tests permitted SecurityAction for assembly or other types.
1181         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
1182         data from SecurityPermissionAttribute to PermisionSet class.
1183
1184         * class.cs (ApplyAttributeBuilder): Added special handling
1185         for System.Security.Permissions.SecurityAttribute based types.
1186
1187         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
1188         special handling for System.Security.Permissions.SecurityAttribute
1189         based types.
1190
1191         * enum.cs (ApplyAttributeBuilder): Added special handling
1192         for System.Security.Permissions.SecurityAttribute based types.
1193
1194         * parameter.cs (ApplyAttributeBuilder): Added special handling
1195         for System.Security.Permissions.SecurityAttribute based types.
1196
1197         * rootcontext.cs: Next 2 core types.
1198
1199         * typemanager.cs (TypeManager.security_permission_attr_type):
1200         Built in type for the SecurityPermission Attribute.
1201         (code_access_permission_type): Build in type.
1202
1203 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
1204
1205         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
1206         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
1207         all of this information into
1208         EmitContext.EmitCapturedVariableInstance.
1209         
1210         * codegen.cs (EmitCapturedVariableInstance): move here the
1211         funcionality of emitting an ldarg.0 in the presence of a
1212         remapping.   This centralizes the instance emit code.
1213
1214         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
1215         then emit a load of this: it means that we have reached the
1216         topmost ScopeInfo: the one that contains the pointer to the
1217         instance of the class hosting the anonymous method.
1218
1219         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
1220         captures to the topmost CaptureContext.
1221
1222 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
1223
1224         * expression.cs (LocalVariableReference): Move the knowledge about
1225         the iterators into codegen's EmitCapturedVariableInstance.
1226
1227 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
1228
1229         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
1230         all code paths return a value from an anonymous method (it is the
1231         same as the 161 error, but for anonymous methods).
1232
1233 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
1234
1235         The introduction of anonymous methods in the compiler changed
1236         various ways of doing things in the compiler.  The most
1237         significant one is the hard split between the resolution phase
1238         and the emission phases of the compiler.
1239
1240         For instance, routines that referenced local variables no
1241         longer can safely create temporary variables during the
1242         resolution phase: they must do so from the emission phase,
1243         since the variable might have been "captured", hence access to
1244         it can not be done with the local-variable operations from the runtime.
1245         
1246         * statement.cs 
1247
1248         (Block.Flags): New flag `IsTopLevel' to indicate that this block
1249         is a toplevel block.
1250
1251         (ToplevelBlock): A new kind of Block, these are the blocks that
1252         are created by the parser for all toplevel method bodies.  These
1253         include methods, accessors and anonymous methods.
1254
1255         These contain some extra information not found in regular blocks:
1256         A pointer to an optional CaptureContext (for tracking captured
1257         local variables and parameters).  A pointer to the parent
1258         ToplevelBlock.
1259         
1260         (Return.Resolve): Catch missmatches when returning a value from an
1261         anonymous method (error 1662).
1262         Invoke NeedReturnLabel from the Resolve phase instead of the emit
1263         phase.
1264
1265         (Break.Resolve): ditto.
1266
1267         (SwitchLabel): instead of defining the labels during the
1268         resolution phase, we now turned the public ILLabel and ILLabelCode
1269         labels into methods called GetILLabelCode() and GetILLabel() that
1270         only define the label during the Emit phase.
1271
1272         (GotoCase): Track the SwitchLabel instead of the computed label
1273         (its contained therein).  Emit the code by using
1274         SwitchLabel.GetILLabelCode ().
1275
1276         (LocalInfo.Flags.Captured): A new flag has been introduce to track
1277         whether the Local has been captured or not.
1278
1279         (LocalInfo.IsCaptured): New property, used to tell whether the
1280         local has been captured.
1281         
1282         * anonymous.cs: Vastly updated to contain the anonymous method
1283         support.
1284
1285         The main classes here are: CaptureContext which tracks any
1286         captured information for a toplevel block and ScopeInfo used to
1287         track the activation frames for various local variables.   
1288
1289         Each toplevel block has an optional capture context associated
1290         with it.  When a method contains an anonymous method both the
1291         toplevel method and the anonymous method will create a capture
1292         context.   When variables or parameters are captured, they are
1293         recorded on the CaptureContext that owns them, for example:
1294
1295         void Demo () {
1296              int a;
1297              MyDelegate d = delegate {
1298                  a = 1;
1299              }
1300         }
1301
1302         Here `a' will be recorded as captured on the toplevel
1303         CapturedContext, the inner captured context will not have anything
1304         (it will only have data if local variables or parameters from it
1305         are captured in a nested anonymous method.
1306
1307         The ScopeInfo is used to track the activation frames for local
1308         variables, for example:
1309
1310         for (int i = 0; i < 10; i++)
1311                 for (int j = 0; j < 10; j++){
1312                    MyDelegate d = delegate {
1313                         call (i, j);
1314                    }
1315                 }
1316
1317         At runtime this captures a single captured variable `i', but it
1318         captures 10 different versions of the variable `j'.  The variable
1319         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
1320         recorded on a child.  
1321
1322         The toplevel ScopeInfo will also track information like the `this'
1323         pointer if instance variables were referenced (this is necessary
1324         as the anonymous method lives inside a nested class in the host
1325         type of the method). 
1326
1327         (AnonymousMethod): Expanded to track the Toplevel, implement
1328         `AnonymousMethod.Compatible' to tell whether an anonymous method
1329         can be converted to a target delegate type. 
1330
1331         The routine now also produces the anonymous method content
1332
1333         (AnonymousDelegate): A helper class that derives from
1334         DelegateCreation, this is used to generate the code necessary to
1335         produce the delegate for the anonymous method that was created. 
1336
1337         * assign.cs: API adjustments for new changes in
1338         Convert.ImplicitStandardConversionExists.
1339
1340         * class.cs: Adjustments to cope with the fact that now toplevel
1341         blocks are of type `ToplevelBlock'. 
1342
1343         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
1344         insteda of standard blocks.
1345
1346         Flag errors if params arguments are passed to anonymous methods.
1347
1348         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
1349         `CurrentAnonymousMethod' which points to the current Anonymous
1350         Method.  The variable points to the AnonymousMethod class that
1351         holds the code being compiled.  It is set in the new EmitContext
1352         created for the anonymous method.
1353
1354         (EmitContext.Phase): Introduce a variable and an enumeration to
1355         assist in enforcing some rules about when and where we are allowed
1356         to invoke certain methods (EmitContext.NeedsReturnLabel is the
1357         only one that enfonces this right now).
1358
1359         (EmitContext.HaveCaptureInfo): new helper method that returns
1360         whether we have a CapturedContext initialized.
1361
1362         (EmitContext.CaptureVariable): New method used to register that a
1363         LocalInfo must be flagged for capturing. 
1364
1365         (EmitContext.CapturedParameter): New method used to register that a
1366         parameters must be flagged for capturing. 
1367         
1368         (EmitContext.CapturedField): New method used to register that a
1369         field must be flagged for capturing. 
1370
1371         (EmitContext.HaveCapturedVariables,
1372         EmitContext.HaveCapturedFields): Return whether there are captured
1373         variables or fields. 
1374
1375         (EmitContext.EmitMethodHostInstance): This is used to emit the
1376         instance for the anonymous method.  The instance might be null
1377         (static methods), this (for anonymous methods that capture nothing
1378         and happen to live side-by-side with the current method body) or a
1379         more complicated expression if the method has a CaptureContext.
1380
1381         (EmitContext.EmitTopBlock): Routine that drives the emission of
1382         code: it will first resolve the top block, then emit any metadata
1383         and then emit the code.  The split is done so that we can extract
1384         any anonymous methods and flag any captured variables/parameters.
1385         
1386         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
1387         during this phase, the ILGenerator should not be used as labels
1388         and local variables declared here might not be accessible to any
1389         code that is part of an anonymous method.  
1390
1391         Exceptions to this include the temporary variables that are
1392         created by some statements internally for holding temporary
1393         variables. 
1394         
1395         (EmitContext.EmitMeta): New routine, in charge of emitting all the
1396         metadata for a cb
1397
1398         (EmitContext.TemporaryReturn): This method is typically called
1399         from the Emit phase, and its the only place where we allow the
1400         ReturnLabel to be defined other than the EmitMeta.  The reason is
1401         that otherwise we would have to duplicate a lot of logic in the
1402         Resolve phases of various methods that today is on the Emit
1403         phase. 
1404
1405         (EmitContext.NeedReturnLabel): This no longer creates the label,
1406         as the ILGenerator is not valid during the resolve phase.
1407
1408         (EmitContext.EmitThis): Extended the knowledge in this class to
1409         work in anonymous methods in addition to iterators. 
1410
1411         (EmitContext.EmitCapturedVariableInstance): This emits whatever
1412         code is necessary on the stack to access the instance to a local
1413         variable (the variable will be accessed as a field).
1414
1415         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
1416         EmitContext.EmitAddressOfParameter): Routines to support
1417         parameters (not completed at this point). 
1418         
1419         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
1420         will also remove the parameters.
1421
1422         * convert.cs (Convert): Define a `ConstantEC' which points to a
1423         null.  This is just to prefity some code that uses
1424         ImplicitStandardConversion code and do not have an EmitContext
1425         handy.
1426
1427         The idea is to flag explicitly that at that point in time, it is
1428         known that the conversion will not trigger the delegate checking
1429         code in implicit conversions (which requires a valid
1430         EmitContext). 
1431
1432         Everywhere: pass new EmitContext parameter since
1433         ImplicitStandardConversionExists now requires it to check for
1434         anonymous method conversions. 
1435
1436         (Convert.ImplicitStandardConversionExists): If the type of an
1437         expression is the anonymous_method_type, and the type is a
1438         delegate, we invoke the AnonymousMethod.Compatible method to check
1439         whether an implicit conversion is possible. 
1440
1441         (Convert.ImplicitConversionStandard): Only do implicit method
1442         group conversions if the language level is not ISO_1.
1443
1444         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
1445         MethodInfo for the Invoke method.  used by Delegate and
1446         AnonymousDelegate.
1447
1448         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
1449         method conversions if the target type is a delegate.
1450
1451         Removed extra debugging nops.
1452
1453         (LocalVariableReference): Turn the `local_info' into a public
1454         field. 
1455
1456         Add `prepared' field, the same hack used for FieldExprs to cope
1457         with composed assignments, as Local variables do not necessarily
1458         operate purely on the stack as they used to: they can be captured
1459         fields. 
1460
1461         Add `temp' for a temporary result, like fields.
1462
1463         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1464
1465         It now copes with Local variables that are captured and emits the
1466         proper instance variable to load it from a field in the captured
1467         case. 
1468
1469         (ParameterReference.DoResolveBase): During the resolve phase,
1470         capture parameters if we are in an anonymous method.
1471
1472         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1473         anonymous method, use the EmitContext helper routines to emit the
1474         parameter reference.
1475
1476         * iterators.cs: Set RemapToProxy to true/false during the
1477         EmitDispose class.
1478
1479         * parameters.cs (GetParameterByName): New helper method. 
1480
1481         * typemanager.cs (anonymous_method_type) a new type that
1482         represents an anonyous method.  This is always an internal type,
1483         used as a fencepost to test against the anonymous-methodness of an
1484         expression. 
1485         
1486 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
1487
1488         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
1489         561 report.
1490         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
1491
1492 2004-10-18  Martin Baulig  <martin@ximian.com>
1493
1494         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
1495         `Type' directly, but call ResolveType() on it.
1496         (Catch.Resolve): Likewise.
1497         (Foreach.Resolve): Likewise.
1498
1499 2004-10-18  Martin Baulig  <martin@ximian.com>
1500
1501         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
1502         `Type' directly, but call ResolveType() on it.
1503         (Probe.DoResolve): Likewise.
1504         (ArrayCreation.LookupType): Likewise.
1505         (TypeOf.DoResolve): Likewise.
1506         (SizeOf.DoResolve): Likewise.
1507
1508 2004-10-18  Martin Baulig  <martin@ximian.com>
1509
1510         * expression.cs (Invocation.BetterFunction): Put back
1511         TypeManager.TypeToCoreType().
1512
1513 2004-10-18  Raja R Harinath  <rharinath@novell.com>
1514
1515         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
1516         the ResolveType.
1517
1518 2004-10-18  Martin Baulig  <martin@ximian.com>
1519
1520         * parameter.cs (Parameter.Resolve):  Don't access the TypeExpr's
1521         `Type' directly, but call ResolveType() on it.
1522
1523 2004-10-18  Martin Baulig  <martin@ximian.com>
1524
1525         * class.cs (FieldMember.Define): Don't access the TypeExpr's
1526         `Type' directly, but call ResolveType() on it.
1527         (MemberBase.DoDefine): Likewise.
1528
1529         * expression.cs (New.DoResolve): Don't access the TypeExpr's
1530         `Type' directly, but call ResolveType() on it.
1531         (ComposedCast.DoResolveAsTypeStep): Likewise.
1532
1533         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
1534         `Type' directly, but call ResolveType() on it.
1535
1536 2004-10-17  John Luke  <john.luke@gmail.com>
1537
1538         * class.cs (Operator.GetSignatureForError): use CSharpName
1539
1540         * parameter.cs (Parameter.GetSignatureForError): Returns
1541         correct name even if was not defined.
1542
1543 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1544
1545         Fix #65816.
1546         * class.cs (TypeContainer.EmitContext): New property.
1547         (DefineNestedTypes): Create an emitcontext for each part.
1548         (MethodCore.DoDefineParameters): Use container's emitcontext.
1549         Pass type array to InternalParameters.
1550         (MemberBase.DoDefine): Use container's emitcontext.
1551         (FieldMember.Define): Likewise.
1552         (Event.Define): Likewise.
1553         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1554         Pass type array to InternalParameters.
1555         (SetIndexerMethod.GetParameterInfo): Likewise.
1556         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1557         * delegate.cs (Define): Pass emitcontext to
1558         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1559         array to InternalParameters.
1560         * expression.cs (ParameterReference.DoResolveBase): Pass
1561         emitcontext to GetParameterInfo.
1562         (ComposedCast.DoResolveAsTypeStep): Remove check on
1563         ec.ResolvingTypeTree.
1564         * parameter.cs (Parameter.Resolve): Change argument to
1565         EmitContext.  Use ResolveAsTypeTerminal.
1566         (Parameter.GetSignature): Change argument to EmitContext.
1567         (Parameters.ComputeSignature): Likewise.
1568         (Parameters.ComputeParameterTypes): Likewise.
1569         (Parameters.GetParameterInfo): Likewise.
1570         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1571         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1572         * support.cs (InternalParameters..ctor): Remove variant that takes
1573         a DeclSpace.
1574         * typemanager.cs (system_intptr_expr): New.
1575         (InitExpressionTypes): Initialize it.
1576
1577 2004-10-12  Chris Toshok  <toshok@ximian.com>
1578
1579         * cs-parser.jay: fix location for try_statement and catch_clause.
1580
1581 2004-10-11  Martin Baulig  <martin@ximian.com>
1582
1583         * report.cs: Don't make --fatal abort on warnings, we have
1584         -warnaserror for that.
1585
1586 2004-10-07  Raja R Harinath  <rharinath@novell.com>
1587
1588         More DeclSpace.ResolveType avoidance.
1589         * decl.cs (MemberCore.InUnsafe): New property.
1590         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
1591         with newly created EmitContext.
1592         (FieldMember.Define): Likewise.
1593         * delegate.cs (Delegate.Define): Likewise.
1594         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
1595         only if normal name-lookup fails.
1596         (TypeExpr.DoResolve): Enable error-checking.
1597         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
1598         (SizeOf.DoResolve): Likewise.
1599         (ComposedCast.DoResolveAsTypeStep): Likewise.
1600         (StackAlloc.DoResolve): Likewise.
1601         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
1602         (Block.Unsafe): New property.
1603         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
1604         (Unsafe): Set 'unsafe' flag of contained block.
1605         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
1606         (Fixed.Resolve): Likewise.
1607         (Catch.Resolve): Likewise.
1608         (Using.ResolveLocalVariableDecls): Likewise.
1609         (Foreach.Resolve): Likewise.
1610
1611 2004-10-05  John Luke <john.luke@gmail.com>
1612
1613         * cs-parser.jay: add location to error CS0175
1614
1615 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
1616
1617         * ecore.cs (Expression.Constantity): Add support for turning null
1618         into a constant.
1619
1620         * const.cs (Const.Define): Allow constants to be reference types
1621         as long as the value is Null.
1622
1623 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
1624
1625         * namespace.cs (NamespaceEntry.Using): No matter which warning
1626         level is set, check if this namespace name has already been added.
1627
1628 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
1629
1630         * expression.cs: reftype [!=]= null should always use br[true,false].
1631         # 67410
1632
1633 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
1634
1635         Fix #67108
1636         * attribute.cs: Enum conversion moved to 
1637         GetAttributeArgumentExpression to be applied to the all
1638         expressions.
1639
1640 2004-10-01  Raja R Harinath  <rharinath@novell.com>
1641
1642         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
1643         * class.c (TypeContainer.DefineType): Flag error if
1644         base types aren't accessible due to access permissions.
1645         * decl.cs (DeclSpace.ResolveType): Move logic to
1646         Expression.ResolveAsTypeTerminal.
1647         (DeclSpace.ResolveTypeExpr): Thin layer over
1648         Expression.ResolveAsTypeTerminal.
1649         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
1650         Refactor code into NestedAccess.  Use it.
1651         (DeclSpace.NestedAccess): New.
1652         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
1653         argument to silence errors.  Check access permissions.
1654         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
1655         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
1656         (Cast.DoResolve): Likewise.
1657         (New.DoResolve): Likewise.
1658         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
1659         (TypeOf.DoResolve): Likewise.
1660
1661         * expression.cs (Invocation.BetterConversion): Return the Type of
1662         the better conversion.  Implement section 14.4.2.3 more faithfully.
1663         (Invocation.BetterFunction): Make boolean.  Make correspondence to
1664         section 14.4.2.2 explicit.
1665         (Invocation.OverloadResolve): Update.
1666         (Invocation): Remove is_base field.
1667         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
1668         (Invocation.Emit): Likewise.
1669
1670 2004-09-27  Raja R Harinath  <rharinath@novell.com>
1671
1672         * README: Update to changes.
1673
1674 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
1675
1676         * cs-parser.jay: Reverted 642 warning fix.
1677
1678 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1679
1680         Fix bug #66615
1681         * decl.cs (FindMemberWithSameName): Indexer can have more than
1682         1 argument.
1683
1684 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1685
1686         * expression.cs (LocalVariableReference.DoResolveLValue):
1687         Do not report warning 219 for out values.
1688         (EmptyExpression.Null): New member to avoid extra allocations.
1689
1690 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1691
1692         * cs-parser.jay: Fix wrong warning 642 report.
1693
1694         * cs-tokenizer.cs (CheckNextToken): New helper;
1695         Inspect next character if is same as expected.
1696
1697 2004-09-23  Martin Baulig  <martin@ximian.com>
1698
1699         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1700         (Convert.ImplicitReferenceConversionExists): Likewise.
1701
1702 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1703
1704         * class.cs (Operator.Define): Add error 448 and 559 report.
1705
1706 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1707
1708         * class.cs (MemberBase.IsTypePermitted): New protected
1709         method for checking error CS0610.
1710
1711 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1712
1713         * class.cs (TypeContainer.HasExplicitLayout): New property
1714         Returns whether container has StructLayout attribute set Explicit.
1715         (FieldMember): New abstract class for consts and fields.
1716         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
1717         (Field): Reuse FieldMember.
1718
1719         * const.cs (Const): Reuse FieldMember.
1720
1721         * rootcontext.cs: EmitConstants call moved to class.
1722
1723 2004-09-22  Martin Baulig  <martin@ximian.com>
1724
1725         Thanks to Peter Sestoft for this bug report.
1726
1727         * expression.cs (Conditional): If both the `trueExpr' and the
1728         `falseExpr' is a NullLiteral, return a NullLiteral.
1729
1730 2004-09-22  Martin Baulig  <martin@ximian.com>
1731
1732         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
1733         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
1734         for the "get_Current" call.
1735
1736 2004-09-22  Martin Baulig  <martin@ximian.com>
1737
1738         Marek and me just fixed one of our oldest bugs: #28562 :-)
1739
1740         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
1741
1742         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
1743         we're an EnumConstant, just return that.
1744         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
1745         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
1746         to get the value which'll actually be written into the attribute.
1747         However, we have to use GetValue() to access the attribute's value
1748         in the compiler.        
1749
1750 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1751
1752         * constant.cs (Constant.IsNegative): New abstract property
1753         IsNegative.
1754
1755         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
1756         (StackAlloc.DoResolve): Reused IsNegative.
1757
1758 2004-09-21  Martin Baulig  <martin@ximian.com>
1759
1760         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
1761         if we're used in an iterator, we may be called from different
1762         methods.
1763
1764         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
1765         we actually have an exception block.
1766
1767 2004-09-20  John Luke <jluke@cfl.rr.com>
1768
1769         * class.cs, cs-parser.jay: Improve the error report for 1520:
1770         report the actual line where the error happens, not where the
1771         class was declared.
1772
1773         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
1774         Pass location information that was available elsewhere.
1775
1776 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
1777
1778         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
1779         runtime to delay sign assemblies.
1780
1781 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1782
1783         * cs-parser.jay: Do not report the stack trace, this is barely
1784         used nowadays.
1785
1786 2004-08-22  John Luke  <john.luke@gmail.com>
1787  
1788         * driver.cs : check that a resource id is not already used
1789         before adding it, report CS1508 if it is, bug #63637
1790
1791 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
1792
1793         * ecore.cs: Removed dead code.
1794
1795 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
1796
1797         * class.cs: Do not report warning CS0067 on the interfaces.
1798
1799 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1800
1801         * cs-parser.jay: Add error 504 report.
1802
1803 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1804
1805         * rootcontext.cs: WarningLevel is 4 by default now.
1806
1807         * statement.cs (Fixed.Resolve): Do not null
1808         VariableInfo.
1809
1810 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
1811
1812         Fixed bug #55780
1813         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
1814         deep search when property is not virtual.
1815         (PropertyExpr.ResolveAccessors): Make one call for both
1816         accessors.
1817
1818 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1819
1820         Fixed bug #65766
1821         * statement.cs: Error 152 report constains also location.
1822
1823 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1824
1825         Fixed bug #65766
1826         * const.cs: Explicitly set constant as static.
1827
1828 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1829
1830         Fixed bug #64226
1831         * cs-parser.jay: Add error 1017 report.
1832
1833 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
1834
1835         Fixed bug #59980, #64224
1836         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
1837
1838         * typemanager.cs (IsSpecialMethod): Simplified
1839
1840 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1841
1842         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
1843         condition with better params.
1844
1845 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1846
1847         Fixed bug #65238
1848         * attribute.cs (Resolve): Property has to have both
1849         accessors.
1850
1851 2004-09-14  Martin Baulig  <martin@ximian.com>
1852
1853         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
1854
1855 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
1856
1857         Fixed bug #61902
1858         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
1859         called and is obsolete then this member suppress message
1860         when call is inside next [Obsolete] method or type.
1861
1862         * expression.cs: Use TestObsoleteMethodUsage member.
1863
1864 2004-09-14  Martin Baulig  <martin@ximian.com>
1865
1866         * cs-parser.jay: Sync a bit with the GMCS version.
1867
1868 2004-09-14  Martin Baulig  <martin@ximian.com>
1869
1870         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
1871         (CSharpParser.yacc_verbose_flag): New public field.
1872
1873         * genericparser.cs: Removed.
1874
1875 2004-09-14  Raja R Harinath  <rharinath@novell.com>
1876
1877         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
1878
1879 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
1880
1881         * class.cs (MethodCore.CheckBase): Fix bug #65757.
1882
1883 2004-09-10  Martin Baulig  <martin@ximian.com>
1884
1885         Backported my MemberName changes from GMCS into MCS.
1886
1887         - we are now using a special `MemberName' class instead of using
1888         strings; in GMCS, the `MemberName' also contains the type
1889         arguments.
1890
1891         - changed the grammar rules a bit:
1892           * the old `member_name' is now a `namespace_or_type_name':
1893             The rule is that we use `namespace_or_type_name' everywhere
1894             where we expect either a "member name" (GetEnumerator) or a
1895             "member name" with an explicit interface name
1896             (IEnumerable.GetEnumerator).
1897             In GMCS, the explicit interface name may include type arguments
1898             (IEnumerable<T>.GetEnumerator).
1899           * we use `member_name' instead of just `IDENTIFIER' for
1900             "member names":
1901             The rule is that we use `member_name' wherever a member may
1902             have type parameters in GMCS.       
1903
1904         * decl.cs (MemberName): New public class.
1905         (MemberCore.MemberName): New public readonly field.
1906         (MemberCore.ctor): Take a `MemberName' argument, not a string.
1907         (DeclSpace): Likewise.
1908
1909         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
1910         * enum.cs (Enum.ctor): Likewise.
1911
1912         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
1913         MemberName.     
1914         (AliasEntry.ctor): Take a MemberName, not an Expression.
1915         (AliasEntry.UsingAlias): Likewise.
1916
1917         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
1918         (IMethodData.MemberName): Changed type from string to MemberName.
1919         (MemberBase.ExplicitInterfaceName): Likewise.
1920         (AbstractPropertyEventMethod.SetupName): Make this private.
1921         (AbstractPropertyEventMethod.ctor): Added `string prefix'
1922         argument; compute the member name here.
1923         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
1924         on the `member.MemberName' and the `prefix'.
1925
1926         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
1927         not `type_name'.
1928         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
1929         thus, we get a `MemberName' instead of a `string'.  These
1930         declarations may have type parameters in GMCS.
1931         (interface_method_declaration, delegate_declaration): Likewise.
1932         (class_declaration, interface_declaration): Likewise.
1933         (method_header): Use `namespace_or_type_name' instead of
1934         `member_name'.  We may be an explicit interface implementation.
1935         (property_declaration, event_declaration): Likewise.
1936         (member_name): This is now just an `IDENTIFIER', not a
1937         `namespace_or_type_name'.
1938         (type_name, interface_type): Removed.
1939         (namespace_or_type_name): Return a MemberName, not an Expression.
1940         (primary_expression): Use `member_name' instead of `IDENTIFIER';
1941         call GetTypeExpression() on the MemberName to get an expression.
1942         (IndexerDeclaration.interface_type): Changed type from string to
1943         MemberName.
1944         (MakeName): Operate on MemberName's instead of string's.
1945
1946 2004-09-13  Raja R Harinath  <rharinath@novell.com>
1947
1948         Fix bug #55770.
1949         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
1950         (NamespaceEntry.Lookup): Add new argument to flag if we want the
1951         lookup to avoid symbols introduced by 'using'.
1952         * rootcontext.cs (NamespaceLookup): Update.
1953
1954 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1955
1956         * class.cs (TypeContainer.DoDefineMembers): Do not call
1957         DefineDefaultConstructor for static classes.
1958
1959 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
1960
1961         * attribute.cs (Attribute.Resolve): Add error 653 report.
1962
1963         * class.cs (Class.ApplyAttributeBuilder): Add error 641
1964         report.
1965         (Method.ApplyAttributeBuilder): Add error 685 report.
1966         (Operator.Define): Add error 564 report.
1967
1968         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
1969
1970         * expression.cs (Invocation.DoResolve): Add error
1971         245 and 250 report.
1972
1973         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
1974         error 674 report.
1975
1976 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1977
1978         * class.cs (ConstructorInitializer.Resolve):
1979         Wrong error number (515->516).
1980
1981 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1982
1983         * class.cs (Indexer.Define): Add error 631 report.
1984
1985 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1986
1987         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
1988
1989 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
1990
1991         * expression.cs (Probe.DoResolve): Add error CS0241 report.
1992
1993 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
1994
1995         * cs-parser.jay: Added error CS0241 report.
1996
1997 2004-09-10  Raja R Harinath  <rharinath@novell.com>
1998
1999         * cs-parser.jay (fixed_statement): Introduce a scope for the
2000         declaration in the 'fixed' statement.
2001
2002 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2003
2004         * cs-parser.jay: Added CS0230 error report.
2005
2006 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2007
2008         * cs-parser.jay: Added errors CS0231 and CS0257 report.
2009
2010 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2011
2012         * expression.cs (Argument.Resolve): Added error CS0192 and
2013         CS0199 report.
2014
2015 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2016
2017         C# 2.0 #pragma warning feature
2018
2019         * cs-tokenizer.cs (PreProcessPragma): New method; 
2020         Handles #pragma directive.
2021
2022         * report.cs (WarningRegions): New class; Support
2023         class for #pragma warning directive. It tests whether
2024         warning is enabled for a given line.
2025
2026 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
2027
2028         * const.cs: Add more descriptive error report, tahnks to
2029         Sebastien. 
2030
2031 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
2032
2033         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
2034
2035 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
2036
2037         * expression.cs: Apply patch from Ben: Remove dead code from
2038         ArrayCreation, and remove the TurnintoConstant call in const.cs,
2039         as that code just threw an exception anwyays.
2040
2041         * const.cs: Remove the call to the turnintoconstant, for details
2042         see bug: #63144
2043         
2044         * literal.cs: The type of the null-literal is the null type;  So
2045         we use a placeholder type (literal.cs:System.Null, defined here)
2046         for it.
2047
2048         * expression.cs (Conditional.DoResolve): Remove some old code that
2049         is no longer needed, conversions have been fixed.
2050
2051         (ArrayCreationExpression.DoResolve): Return false if we fail to
2052         resolve the inner expression.
2053
2054 2004-09-07  Raja R Harinath  <rharinath@novell.com>
2055
2056         Fix test-290.cs.
2057         * cs-parser.jay (delegate_declaration): Record a delegate
2058         declaration as a type declaration.
2059         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
2060
2061 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
2062
2063         * parameter.cs: Do not crash if the type can not be resolved. 
2064
2065         * expression.cs: Report errors with unsafe pointers, fixes #64896
2066
2067 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2068
2069         * expression.cs: Pointer arith always needs to do a conv.i
2070         if the operand is a long. fix 65320
2071
2072 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
2073
2074         Fixed cs0619-37.cs, cs0619-38.cs
2075
2076         * enum.cs (GetObsoleteAttribute): Removed.
2077
2078         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
2079         on Enum member is double staged. The first is tested member
2080         and then enum.
2081
2082 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
2083
2084         Fixed #56986, #63631, #65231
2085
2086         * class.cs: (TypeContainer.AddToMemberContainer): New method,
2087         adds member to name container.
2088         (TypeContainer.AddToTypeContainer): New method, adds type to
2089         name container.
2090         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
2091         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
2092         AddOperator): Simplified by reusing AddToMemberContainer.
2093         (TypeContainer.UserDefinedStaticConstructor): Changed to property
2094         instead of field.
2095         (Method.CheckForDuplications): Fixed implementation to test all
2096         possibilities.
2097         (MemberBase): Detection whether member is explicit interface
2098         implementation is now in constructor.
2099         (MemberBase.UpdateMemberName): Handles IndexerName.
2100         (Accessor): Changed to keep also location information.
2101         (AbstractPropertyEventMethod): Is derived from MemberCore.
2102         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
2103         will be emited or not.
2104         (PropertyBase.AreAccessorsDuplicateImplementation):
2105         Tests whether accessors are not in collision with some method.
2106         (Operator): Is derived from MethodCore to simplify common
2107         operations.
2108
2109         * decl.cs (Flags.TestMethodDuplication): Test for duplication
2110         must be performed.
2111         (DeclSpace.AddToContainer): Adds the member to defined_names
2112         table. It tests for duplications and enclosing name conflicts.
2113
2114         * enum.cs (EnumMember): Clean up to reuse the base structures
2115
2116 2004-09-03  Martin Baulig  <martin@ximian.com>
2117
2118         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
2119         into TypeContainer, to make partial classes work again.
2120
2121 2004-09-03  Martin Baulig  <martin@ximian.com>
2122
2123         * rootcontext.cs (RootContext.V2): Removed.
2124
2125 2004-03-23  Martin Baulig  <martin@ximian.com>
2126
2127         * expression.cs (Invocation.OverloadResolve): Added `bool
2128         may_fail' argument and use it instead of the Location.IsNull() hack.
2129
2130 2004-09-03  Martin Baulig  <martin@ximian.com>
2131
2132         Merged latest changes into gmcs.  Please keep this comment in
2133         here, it makes it easier for me to see what changed in MCS since
2134         the last time I merged.
2135
2136 2004-09-03  Raja R Harinath  <rharinath@novell.com>
2137
2138         Fix #61128.
2139         * expression.cs (BetterConversion): Don't allow either conversion 
2140         to be null.  Remove redundant implicit conversion test when 'q ==
2141         null' -- when this function is invoked, we already know that the
2142         implicit conversion exists.
2143         (BetterFunction): Assume that 'best' is non-null.  Remove
2144         redundant reimplementation of IsApplicable when 'best' is null.
2145         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
2146         number of arguments.
2147         (IsAncestralType): Extract from OverloadResolve.
2148         (OverloadResolve): Make robust to the MethodGroupExpr being
2149         unsorted.  Implement all the logic of Section 14.5.5.1, and
2150         support overloading of methods from multiple applicable types.
2151         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
2152
2153         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
2154         (RealError, Warning): Append type of report to related symbol.
2155
2156 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
2157
2158         * enum.cs: Fixed CLS-Compliance checks for enum members.
2159         Error tests cs3008-8.cs, cs3014-8.cs
2160
2161 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
2162
2163         Fixed bug #62342, #63102
2164         * class.cs: ImplementIndexer uses member.IsExplicitImpl
2165         like ImplementMethod.
2166
2167 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
2168
2169         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2170         Fixed bug #65170.
2171
2172 2004-09-02  Martin Baulig  <martin@ximian.com>
2173
2174         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
2175         TypeManager.GetArgumentTypes() rather than calling GetParameters()
2176         on the MethodBase.
2177
2178 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
2179
2180         C# 2.0 Static classes implemented
2181
2182         * class.cs (TypeContainer): instance_constructors,
2183         initialized_fields, initialized_static_fields,
2184         default_constructor, base_inteface_types are protected to be
2185         accessible from StaticClass.
2186         (TypeContainer.DefineDefaultConstructor): New virtual method
2187         for custom default constructor generating
2188         (StaticClass): New class to handle "Static classes" feature.
2189
2190         * cs-parser.jay: Handle static keyword on class like instance
2191         of StaticClass.
2192
2193         * driver.cs: Added "/langversion" command line switch with two
2194         options (iso-1, default).
2195
2196 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
2197
2198         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
2199
2200 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
2201
2202         * delegate.cs: Style.
2203
2204 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2205
2206         * delegate.cs: Add seperate instance expr field for miguel.
2207
2208 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2209
2210         * PointerArithmetic (Resolve): make sure we are not doing
2211         pointer arith on void*. Also, make sure we are resolved
2212         by not setting eclass until resolve.
2213
2214         All callers: Make sure that PointerArithmetic gets resolved.
2215
2216 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2217
2218         * ArrayCreation (LookupType): If the type does not resolve 
2219         to an array, give an error.
2220
2221 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
2222
2223         * statement.cs (Try.Resolve): Fixed bug #64222
2224
2225 2004-08-27  Martin Baulig  <martin@ximian.com>
2226
2227         * class.cs
2228         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
2229         crash here.     
2230
2231 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2232
2233         * ecore.cs (Constantify): Get underlying type via
2234         System.Enum.GetUnderlyingType to avoid StackOverflow on the
2235         Windows in special cases.
2236
2237 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2238
2239         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
2240         for obtaining also private methods.
2241         (GetRemoveMethod): Used GetRemoveMethod (true)
2242         for obtaining also private methods.
2243
2244 2004-08-24  Martin Baulig  <martin@ximian.com>
2245
2246         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
2247         MethodAttributes.HideBySig for operators.
2248
2249 2004-08-23  Martin Baulig  <martin@ximian.com>
2250
2251         Back to the old error reporting system :-)
2252
2253         * report.cs (Message): Removed.
2254         (Report.MessageData, ErrorData, WarningData): Removed.
2255         (Report.Error, Warning): Back to the old system.
2256
2257 2004-08-23  Martin Baulig  <martin@ximian.com>
2258
2259         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
2260
2261         * class.cs (TypeContainer.ParentContainer): New public virtual
2262         method; replaces the explicit interface implementation.
2263         (ClassPart.ParentContainer): Override.
2264
2265 2004-08-23  Martin Baulig  <martin@ximian.com>
2266
2267         * statement.cs (Switch): Added support for constant switches; see
2268         #59428 or test-285.cs.
2269
2270 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2271
2272         Fixed bug #62740.
2273         * statement.cs (GetEnumeratorFilter): Removed useless
2274         logic because C# specs is strict. GetEnumerator must be
2275         public.
2276
2277 2004-08-22  Martin Baulig  <martin@ximian.com>
2278
2279         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2280         a switch and may break, reset the barrier.  Fixes #59867.
2281
2282 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2283
2284         CLS-Compliance speed up (~5% for corlib)
2285
2286         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
2287         New method. Tests container for CLS-Compliant names
2288
2289         * class.cs (TypeContainer.VerifyClsName): New method.
2290         Checks whether container name is CLS Compliant.
2291         (Constructor): Implements IMethodData.
2292
2293         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
2294         low-case table for CLS Compliance test.
2295         (MemberCache.VerifyClsParameterConflict): New method.
2296         Checks method parameters for CS3006 error.
2297
2298         * enum.cs (EnumMember): Is derived from MemberCore.
2299         (Enum.VerifyClsName): Optimized for better performance.
2300
2301 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2302
2303         * report.cs: Renamed Error_T to Error and changed all
2304         references.
2305
2306 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2307
2308         * class.cs (TypeContainer.IndexerArrayList): New inner class
2309         container for indexers.
2310         (TypeContainer.DefaultIndexerName): New constant for default
2311         indexer name. Replaced all "Item" with this constant.
2312         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
2313
2314         * typemanager.cs (TypeManager.default_member_ctor): Cache here
2315         DefaultMemberAttribute constructor.
2316
2317 2004-08-05  Martin Baulig  <martin@ximian.com>
2318
2319         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
2320         Fix bug #59429.
2321
2322 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
2323
2324         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
2325         multi platforms problem.
2326
2327         * compiler.csproj: Included shared files.
2328
2329 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2330
2331         Fix bug 60333, 55971 in the more general way
2332         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2333         Added arg_type argument for constant conversion.
2334         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
2335
2336 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2337
2338         Fix bug #59760
2339         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
2340         OperatorArrayList, MethodCoreArrayList for typecontainer
2341         containers. Changed class member types to these new types.
2342         (MethodArrayList.DefineMembers): Added test for CS0659.
2343
2344 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
2345
2346         * cfold.cs: Synchronize the folding with the code in expression.cs
2347         Binary.DoNumericPromotions for uint operands.
2348
2349         * attribute.cs: Revert patch from Raja, it introduced a regression
2350         while building Blam-1.2.1 (hard to isolate a test case).
2351
2352 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2353
2354         Fix for #55382
2355         * class.cs:
2356         (TypeContainer.Define): Renamed to DefineContainerMembers because of
2357         name collision.
2358         (MethodCore.parent_method): New member. The method we're overriding
2359         if this is an override method.
2360         (MethodCore.CheckBase): Moved from Method class and made common.
2361         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
2362         private.
2363         (MethodCore.CheckForDuplications): New abstract method. For custom
2364         member duplication search in a container
2365         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
2366         method and its return type.
2367         (Event.conflict_symbol): New member. Symbol with same name in the
2368         parent class.
2369
2370         * decl.cs:
2371         (MemberCache.FindMemberWithSameName): New method. The method
2372         is looking for conflict with inherited symbols.
2373
2374 2004-08-04  Martin Baulig  <martin@ximian.com>
2375
2376         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
2377
2378         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
2379
2380 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2381
2382         * report.cs (Message): New enum for better error, warning reference in
2383         the code.
2384         (MessageData): New inner abstract class. It generally handles printing of
2385         error and warning messages.
2386         Removed unused Error, Warning, Message methods.
2387
2388 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2389
2390         Fix for cs0592-8.cs test
2391         * attribute.cs
2392         (Attributable.ValidAttributeTargets): Made public.
2393         (Attribute.ExplicitTarget): New member for explicit target value.
2394         (Attribute.CheckTargets): Now we translate explicit attribute
2395         target to Target here.
2396
2397 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
2398
2399         * ecore.cs (MethodGroupExpr): new IsBase property.
2400
2401         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
2402
2403         * delegate.cs (DelegateCreation): store a MethodGroupExpr
2404         rather than an instance expr.
2405
2406         (DelegateCreation.Emit): Use the method group rather than
2407         the instance expression. Also, if you have base.Foo as the
2408         method for a delegate, make sure to emit ldftn, not ldftnvirt.
2409
2410         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
2411
2412         (NewDelegate.DoResolve): Only check for the existance of Invoke
2413         if the method is going to be needed. Use MethodGroupExpr.
2414
2415         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
2416
2417         * expression.cs: For pointer arith., make sure to use
2418         the size of the type, not the size of the pointer to
2419         the type.
2420
2421 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2422
2423         Fix for #60722
2424         * class.cs (Class): Added error CS0502 test.
2425
2426 2004-08-03  John Luke  <jluke@cfl.rr.com>
2427             Raja R Harinath  <rharinath@novell.com>
2428
2429         Fix for #60997.
2430         * attribute.cs (Attribute.complained_before): New flag.
2431         (Attribute.ResolveType, Attribute.Resolve),
2432         (Attribute.DefinePInvokeMethod): Set it.
2433         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
2434         
2435 2004-08-03  Martin Baulig  <martin@ximian.com>
2436
2437         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
2438         use a user-defined operator; we still need to do numeric
2439         promotions in case one argument is a builtin type and the other
2440         one has an implicit conversion to that type.  Fixes #62322.
2441
2442 2004-08-02  Martin Baulig  <martin@ximian.com>
2443
2444         * statement.cs (LocalInfo.Flags): Added `IsThis'.
2445         (LocalInfo.IsThis): New public property.
2446         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
2447
2448 2004-08-01  Martin Baulig  <martin@ximian.com>
2449
2450         * class.cs (TypeContainer.GetClassBases): Don't set the default
2451         here since we may get called from GetPartialBases().
2452         (TypeContainer.DefineType): If GetClassBases() didn't return a
2453         parent, use the default one.
2454
2455 2004-07-30  Duncan Mak  <duncan@ximian.com>
2456
2457         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
2458
2459 2004-07-30  Martin Baulig  <martin@ximian.com>
2460
2461         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
2462
2463         * class.cs (SourceMethod): New public class, derive from the
2464         symbol writer's ISourceMethod.
2465         (Method): Use the new symbol writer API.
2466
2467         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
2468         as argument and use the new symbol writer.
2469
2470         * location.cs
2471         (SourceFile): Implement the symbol writer's ISourceFile.
2472         (Location.SymbolDocument): Removed.
2473         (Location.SourceFile): New public property.
2474
2475         * symbolwriter.cs: Use the new symbol writer API.
2476
2477 2004-07-30  Raja R Harinath  <rharinath@novell.com>
2478
2479         * Makefile (install-local): Remove.  Functionality moved to
2480         executable.make.
2481
2482 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
2483
2484         * Makefile: Install mcs.exe.config file together with mcs.exe.
2485         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
2486         correct runtime version.
2487         
2488 2004-07-25  Martin Baulig  <martin@ximian.com>
2489
2490         * class.cs
2491         (TypeContainer.RegisterOrder): Removed, this was unused.
2492         (TypeContainer, interface_order): Removed.
2493         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
2494         TypeContainer as argument since we can also be called with a
2495         `PartialContainer' for a partial class/struct/interface.
2496         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
2497         of checking whether we're an `Interface' - we could be a
2498         `PartialContainer'.
2499         (PartialContainer.Register): Override; call
2500         AddClass()/AddStruct()/AddInterface() on our parent.
2501
2502         * cs-parser.jay (interface_member_declaration): Add things to the
2503         `current_container', not the `current_class'.
2504
2505         * rootcontext.cs (RegisterOrder): The overloaded version which
2506         takes an `Interface' was unused, removed.
2507
2508         * typemanager.cs (TypeManager.LookupInterface): Return a
2509         `TypeContainer', not an `Interface'.
2510         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
2511         contain a `PartialContainer' for an interface, so check it's
2512         `Kind' to figure out what it is.
2513
2514 2004-07-25  Martin Baulig  <martin@ximian.com>
2515
2516         * class.cs (Class.DefaultTypeAttributes): New public constant.
2517         (Struct.DefaultTypeAttributes): Likewise.
2518         (Interface.DefaultTypeAttributes): Likewise.
2519         (PartialContainer.TypeAttr): Override this and add the
2520         DefaultTypeAttributes.
2521
2522 2004-07-25  Martin Baulig  <martin@ximian.com>
2523
2524         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
2525         we can just use the `Parent' field instead.
2526
2527 2004-07-25  Martin Baulig  <martin@ximian.com>
2528
2529         * class.cs (TypeContainer.Emit): Renamed to EmitType().
2530
2531 2004-07-25  Martin Baulig  <martin@ximian.com>
2532
2533         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
2534         our parts before defining any methods.
2535         (TypeContainer.VerifyImplements): Make this virtual.
2536         (ClassPart.VerifyImplements): Override and call VerifyImplements()
2537         on our PartialContainer.
2538
2539 2004-07-25  Martin Baulig  <martin@ximian.com>
2540
2541         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
2542
2543         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
2544         argument, we can just use the `Parent' field instead.
2545
2546         * class.cs
2547         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
2548         (MemberBase.DoDefine): Likewise.
2549
2550 2004-07-24  Martin Baulig  <martin@ximian.com>
2551
2552         * decl.cs (MemberCore.Parent): New public field.
2553         (DeclSpace.Parent): Moved to MemberCore.
2554
2555         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
2556         (MemberBase.ctor): Added TypeContainer argument, pass it to our
2557         parent's .ctor.
2558         (FieldBase, Field, Operator): Likewise.
2559         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
2560         (EventField, Event): Likewise.
2561
2562 2004-07-23  Martin Baulig  <martin@ximian.com>
2563
2564         * class.cs (PartialContainer): New public class.
2565         (ClassPart): New public class.
2566         (TypeContainer): Added support for partial classes.
2567         (TypeContainer.GetClassBases): Splitted some of the functionality
2568         out into GetNormalBases() and GetPartialBases().
2569
2570         * cs-tokenizer.cs (Token.PARTIAL): New token.
2571         (Tokenizer.consume_identifier): Added some hacks to recognize
2572         `partial', but only if it's immediately followed by `class',
2573         `struct' or `interface'.
2574
2575         * cs-parser.jay: Added support for partial clases.
2576
2577 2004-07-23  Martin Baulig  <martin@ximian.com>
2578
2579         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
2580         a `DeclSpace' and also made it readonly.
2581         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
2582         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
2583         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
2584
2585         * cs-parser.jay: Pass the `current_class', not the
2586         `current_container' (at the moment, this is still the same thing)
2587         to a new Method, Property, Event, Indexer or Constructor.
2588
2589 2004-07-23  Martin Baulig  <martin@ximian.com>
2590
2591         * cs-parser.jay (CSharpParser): Added a new `current_class' field
2592         and removed the `current_interface' one.
2593         (struct_declaration, class_declaration, interface_declaration):
2594         Set `current_class' to the newly created class/struct/interface;
2595         set their `Bases' and call Register() before parsing their body.
2596
2597 2004-07-23  Martin Baulig  <martin@ximian.com>
2598
2599         * class.cs (Kind): New public enum.
2600         (TypeContainer): Made this class abstract.
2601         (TypeContainer.Kind): New public readonly field.
2602         (TypeContainer.CheckDef): New public method; moved here from
2603         cs-parser.jay.
2604         (TypeContainer.Register): New public abstract method.
2605         (TypeContainer.GetPendingImplementations): New public abstract
2606         method.
2607         (TypeContainer.GetClassBases): Removed the `is_class' and
2608         `is_iface' parameters.
2609         (TypeContainer.DefineNestedTypes): Formerly known as
2610         DoDefineType().
2611         (ClassOrStruct): Made this class abstract.
2612
2613         * tree.cs (RootTypes): New public type. 
2614
2615 2004-07-20  Martin Baulig  <martin@ximian.com>
2616
2617         * tree.cs (Tree.RecordNamespace): Removed.
2618         (Tree.Namespaces): Removed.
2619
2620         * rootcontext.cs (RootContext.IsNamespace): Removed.
2621
2622         * cs-parser.jay (namespace_declaration): Just create a new
2623         NamespaceEntry here.
2624
2625 2004-07-20  Martin Baulig  <martin@ximian.com>
2626
2627         * statement.cs (ExceptionStatement): New abstract class.  This is
2628         now used as a base class for everyone who's using `finally'.
2629         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
2630         our local variables before using them.
2631
2632         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
2633         virtual method.  This is used by Yield.Resolve() to "steal" an
2634         outer block's `finally' clauses.
2635         (FlowBranchingException): The .ctor now takes an ExceptionStatement
2636         argument.
2637
2638         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
2639         version which takes an ExceptionStatement.  This version must be
2640         used to create exception branchings.
2641
2642         * iterator.cs
2643         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
2644         (Iterator.EmitMoveNext): Added exception support; protect the
2645         block with a `fault' clause, properly handle 'finally' clauses.
2646         (Iterator.EmitDispose): Run all the `finally' clauses here.
2647
2648 2004-07-20  Martin Baulig  <martin@ximian.com>
2649
2650         * iterator.cs: This is the first of a set of changes in the
2651         iterator code.  Match the spec more closely: if we're an
2652         IEnumerable, then GetEnumerator() must be called.  The first time
2653         GetEnumerator() is called, it returns the current instance; all
2654         subsequent invocations (if any) must create a copy.
2655
2656 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
2657
2658         * expression.cs: Resolve the constant expression before returning
2659         it. 
2660
2661 2004-07-19  Martin Baulig  <martin@ximian.com>
2662
2663         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
2664         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
2665         the return type of the new EmitContext.
2666
2667 2004-07-18  Martin Baulig  <martin@ximian.com>
2668
2669         * class.cs (Property.Define): Fix iterators.
2670
2671         * iterators.cs (Iterator.Define): Moved the
2672         `container.AddInterator (this)' call here from the .ctor; only do
2673         it if we resolved successfully.
2674
2675 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
2676
2677         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
2678         `true' for preprocessing directives that we parse.  The return
2679         value indicates whether we should return to regular tokenizing or
2680         not, not whether it was parsed successfully.
2681
2682         In the past if we were in: #if false ... #line #endif, we would
2683         resume parsing after `#line'.  See bug 61604.
2684
2685         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
2686         building: IsEnumType should return true only for enums, not for
2687         enums or System.Enum itself.  This fixes #61593.
2688
2689         Likely what happened is that corlib was wrong: mcs depended on
2690         this bug in some places.  The bug got fixed, we had to add the
2691         hack, which caused bug 61593.
2692
2693         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
2694         that was a workaround for the older conditions.
2695
2696 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
2697
2698         * assign.cs: IAssignMethod has a new interface, as documented
2699         inline. All assignment code now uses this new api.
2700
2701         * ecore.cs, expression.cs: All classes which implement
2702         IAssignMethod now use the new interface.
2703
2704         * expression.cs (Invocation): add a hack to EmitCall so that
2705         IndexerAccess can be the target of a compound assignment without
2706         evaluating its arguments twice.
2707
2708         * statement.cs: Handle changes in Invocation api.
2709
2710 2004-07-16  Martin Baulig  <martin@ximian.com>
2711
2712         * iterators.cs: Rewrote this.  We're now using one single Proxy
2713         class for both the IEnumerable and the IEnumerator interface and
2714         `Iterator' derives from Class so we can use the high-level API.
2715
2716         * class.cs (TypeContainer.AddIterator): New method.
2717         (TypeContainer.DoDefineType): New protected virtual method, which
2718         is called from DefineType().
2719         (TypeContainer.DoDefineMembers): Call DefineType() and
2720         DefineMembers() on all our iterators.
2721         (TypeContainer.Emit): Call Emit() on all our iterators.
2722         (TypeContainer.CloseType): Call CloseType() on all our iterators.
2723
2724         * codegen.cs (EmitContext.CurrentIterator): New public field.
2725
2726 2004-07-15  Martin Baulig  <martin@ximian.com>
2727
2728         * typemanager.cs
2729         (TypeManager.not_supported_exception_type): New type.   
2730
2731 2004-07-14  Martin Baulig  <martin@ximian.com>
2732
2733         * iterators.cs: Use real error numbers.
2734
2735 2004-07-14  Martin Baulig  <martin@ximian.com>
2736
2737         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
2738         requires this to be a System.Collection.IEnumerable and not a
2739         class implementing that interface.
2740         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
2741
2742 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
2743
2744         * class.cs: Fixed previous fix, it broke some error tests.
2745
2746 2004-07-12  Martin Baulig  <martin@ximian.com>
2747
2748         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
2749         Fixes #61293.
2750
2751 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
2752
2753         * assign.cs (LocalTemporary): Add new argument: is_address,If
2754         `is_address' is true, then the value that we store is the address
2755         to the real value, and not the value itself.
2756         
2757         * ecore.cs (PropertyExpr): use the new local temporary
2758         stuff to allow us to handle X.Y += z (where X is a struct)
2759
2760 2004-07-08  Martin Baulig  <martin@ximian.com>
2761
2762         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
2763         not always return, just like we're doing in Using.Resolve().
2764
2765 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
2766
2767         * cs-parser.jay (fixed_statement): flag this as Pinned.
2768
2769 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
2770
2771         * typemanager.cs (TypeManager): Removed MakePinned method, this
2772         mechanism is replaced with the .NET 2.x compatible mechanism of
2773         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
2774
2775         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
2776         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
2777         `IsFixed' property which has a different meaning.
2778
2779 2004-07-02  Raja R Harinath  <rharinath@novell.com>
2780
2781         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
2782         visible from inside a nested class, not just the names of the
2783         immediately enclosing class.
2784         Fix for bug #60730.
2785
2786 2004-06-24  Raja R Harinath  <rharinath@novell.com>
2787
2788         * expression.cs (BetterConversion): Remove buggy special-case
2789         handling of "implicit constant expression conversions".  At this
2790         point, we already know that the conversion is possible -- we're
2791         only checking to see which is better.
2792
2793 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2794
2795         * cs-parser.jay: Added error CS0210 test.
2796
2797 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2798
2799         * cs-parser.jay: Added error CS0134 test.
2800
2801 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2802
2803         Fix bug #52507
2804         * cs-parser.jay: Added error CS0145 test.
2805
2806 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
2807
2808         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
2809
2810 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
2811         
2812         * expression.cs (StackAlloc.Resolve): The argument may not
2813         be a constant; deal with this case.
2814         
2815 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
2816
2817         * attribute.cs (IndexerName_GetIndexerName): Renamed to
2818         GetIndexerAttributeValue.
2819         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
2820
2821         * class.cs (Indexer.Define): Added error tests for CS0415,
2822         CS0609.
2823
2824 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
2825
2826         * attribute.cs (Attribute.Resolve): Keep field code in sync with
2827         property code.
2828
2829 2004-06-23  Martin Baulig  <martin@ximian.com>
2830
2831         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
2832         neither return nor throw, reset the barrier as well.  Fixes #60457.
2833
2834 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
2835
2836         * class.cs : EventAttributes is now set to None by default.
2837           This fixes bug #60459.
2838
2839 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2840
2841         Fix bug #60219
2842         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
2843         Don't throw exception but return null (it's sufficient now).
2844
2845 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
2846
2847         * typemanager.cs (GetArgumentTypes): Faster implementation.
2848
2849 2004-06-18  Martin Baulig  <martin@ximian.com>
2850
2851         * attribute.cs (Attribute.Resolve): Check whether we're an
2852         EmptyCast which a Constant child.  Fixes #60333.
2853
2854 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
2855
2856         * statement.cs (EmitCollectionForeach): Account for the fact that
2857         not all valuetypes are in areas which we can take the address of.
2858         For these variables, we store to a temporary variable. Also, make
2859         sure that we dont emit a `callvirt' on a valuetype method.
2860
2861 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2862
2863         * expression.cs (StackAlloc.DoReSolve): Added test for
2864         negative parameter (CS0247).
2865
2866 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2867
2868         Fix bug #59792
2869         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
2870
2871 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
2872
2873         Fix bug #59781
2874         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
2875         ulong.
2876
2877 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2878
2879         Fix bug #58254 & cs1555.cs, cs1556.cs
2880         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
2881
2882 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
2883
2884         * cs-parser.jay: Added error CS1669 test for indexers.
2885
2886 2004-06-11  Martin Baulig  <martin@ximian.com>
2887
2888         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
2889         call this twice: for params and varargs methods.
2890
2891 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2892
2893         * class.cs:
2894         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
2895
2896 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2897
2898         * attribute.cs (Attribute.GetValidTargets): Made public.
2899
2900         * class.cs: 
2901         (AbstractPropertyEventMethod): New class for better code sharing.
2902         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
2903         CS1667 report.
2904         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
2905
2906 2004-06-11  Raja R Harinath  <rharinath@novell.com>
2907
2908         Fix bug #59477.
2909         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
2910         that the call to Resolve is part of a MemberAccess.
2911         (Expression.Resolve): Use it for SimpleName resolution.
2912         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
2913         Add 'intermediate' boolean argument.
2914         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
2915         error message when the SimpleName can be resolved ambiguously
2916         between an expression and a type.
2917         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
2918         public.
2919         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
2920         call on the left-side.
2921
2922 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2923
2924         * class.cs:
2925         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
2926
2927 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2928
2929         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
2930
2931 2004-06-11  Martin Baulig  <martin@ximian.com>
2932
2933         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
2934         varargs methods if applicable.
2935
2936 2004-06-11  Martin Baulig  <martin@ximian.com>
2937
2938         * expression.cs (Invocation.EmitCall): Don't use
2939         `method.CallingConvention == CallingConventions.VarArgs' since the
2940         method could also have `CallingConventions.HasThis'.
2941
2942 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
2943
2944         * class.cs (Event.GetSignatureForError): Implemented.
2945         Fixed crash in error test cs3010.cs
2946
2947 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
2948
2949         * cs-tokenizer.cs: Change the way we track __arglist to be
2950         consistent with the other keywords.
2951
2952 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
2953
2954         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
2955         tomorrow.
2956
2957 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
2958
2959         * codegen.cs: Check that all referenced assemblies have a strongname
2960         before strongnaming the compiled assembly. If not report error CS1577.
2961         Fix bug #56563. Patch by Jackson Harper.
2962         * typemanager.cs: Added a method to return all referenced assemblies.
2963         Fix bug #56563. Patch by Jackson Harper.
2964
2965 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2966
2967         * class.cs:
2968         (Method.ApplyAttributeBuilder): Moved and added conditional
2969         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
2970
2971         * delegate.cs:
2972         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
2973
2974 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
2975
2976         Fixed #59640
2977         * class.cs: (EventField.attribute_targets): Changed default target.
2978
2979 2004-06-08  Martin Baulig  <martin@ximian.com>
2980
2981         * expression.cs (Invocation.EmitCall): Enable varargs methods.
2982
2983 2004-06-08  Martin Baulig  <martin@ximian.com>
2984
2985         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
2986
2987 2004-06-07  Martin Baulig  <martin@ximian.com>
2988
2989         Added support for varargs methods.
2990
2991         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
2992         keyword.
2993
2994         * cs-parser.jay: Added support for `__arglist'.
2995
2996         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
2997
2998         * expression.cs (Argument.AType): Added `ArgList'.
2999         (Invocation): Added support for varargs methods.
3000         (ArglistAccess): New public class.
3001         (Arglist): New public class.
3002
3003         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
3004
3005         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
3006         a method's top-level block if the method has varargs.
3007
3008         * support.cs (ReflectionParameters, InternalParameters): Added
3009         support for varargs methods.    
3010
3011 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
3012
3013         * class.cs: Provide location in indexer error report.
3014
3015         * driver.cs: Use standard names.
3016
3017         * namespace.cs: Catch the use of using after a namespace has been
3018         declared also on using aliases.
3019
3020 2004-06-03  Raja R Harinath  <rharinath@novell.com>
3021
3022         Bug #50820.
3023         * typemanager.cs (closure_private_ok, closure_invocation_type)
3024         (closure_qualifier_type, closure_invocation_assembly)
3025         (FilterWithClosure): Move to ...
3026         (Closure): New internal nested class.
3027         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
3028         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
3029         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
3030         (MemberLookup, MemberLookupFailed): Use it.
3031         * expression.cs (New.DoResolve): Treat the lookup for the
3032         constructor as being qualified by the 'new'ed type.
3033         (Indexers.GetIndexersForTypeOrInterface): Update.
3034
3035 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
3036
3037         * attribute.cs
3038         (GetConditionalAttributeValue): New method. Returns
3039         condition of ConditionalAttribute.
3040         (SearchMulti): New method.  Returns all attributes of type 't'.
3041         Use it when attribute is AllowMultiple = true.
3042         (IsConditionalMethodExcluded): New method.
3043
3044         * class.cs
3045         (Method.IsExcluded): Implemented. Returns true if method has conditional
3046         attribute and the conditions is not defined (method is excluded).
3047         (IMethodData): Extended interface for ConditionalAttribute support.
3048         (PropertyMethod.IsExcluded): Implemented.
3049
3050         * decl.cs
3051         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
3052
3053         * expression.cs
3054         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
3055         on the method.
3056
3057 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
3058
3059         * expression.cs (ArrayCreationExpression): Make this just an
3060         `expression'. It can't be a statement, so the code here was
3061         dead.
3062
3063 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
3064
3065         Fixed #59072
3066         * typemanager.cs (GetFullNameSignature): New method for
3067         MethodBase types.
3068
3069 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
3070
3071         Fixed #56452
3072         * class.cs (MemberBase.GetSignatureForError): New virtual method.
3073         Use this method when MethodBuilder is null.
3074         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
3075         Added test for error CS0626 (MONO reports error for this situation).
3076         (IMethodData.GetSignatureForError): Extended interface.
3077
3078 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
3079
3080         * attribute.cs
3081         (AttributeTester.GetObsoleteAttribute): Returns instance of
3082         ObsoleteAttribute when type is obsolete.
3083
3084         * class.cs
3085         (TypeContainer.VerifyObsoleteAttribute): Override.
3086         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
3087         (MethodCode.VerifyObsoleteAttribute): Override.
3088         (MemberBase.VerifyObsoleteAttribute): Override.
3089
3090         * decl.cs
3091         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
3092         and report proper error.
3093
3094         *delegate.cs
3095         Delegate.VerifyObsoleteAttribute): Override.
3096
3097         * ecore.cs
3098         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
3099         and report proper error.
3100         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
3101
3102         * enum.cs
3103         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
3104         and enum member.
3105
3106         * expression.cs
3107         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
3108         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
3109         Added test for ObsoleteAttribute.
3110
3111         * statement.cs
3112         (Catch): Derived from Statement.
3113
3114 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
3115  
3116         Fixed bug #59071 & cs0160.cs
3117  
3118         * statement.cs (Try.Resolve): Check here whether order of catch
3119         clauses matches their dependencies.
3120
3121 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
3122
3123         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
3124         caused a regression: #59343.  Referencing nested classes from an
3125         assembly stopped working.
3126
3127 2004-05-31  Martin Baulig  <martin@ximian.com>
3128
3129         MCS is now frozen for beta 2.
3130
3131 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3132
3133         * convert.cs: add a trivial cache for overload operator resolution.
3134
3135 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3136
3137         * decl.cs: If possible, use lookuptypedirect here. We can only do
3138         this if there is no `.' after the namespace. Avoids using
3139         LookupType, which does lots of slow processing.
3140         (FindNestedType) New method, does what it says :-).
3141         * namespace.cs: use LookupTypeDirect.
3142         * rootcontext.cs: use membercache, if possible.
3143         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
3144
3145 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3146
3147         * expression.cs:
3148         According to the spec, 
3149
3150         In a member access of the form E.I, if E is a single identifier,
3151         and if the meaning of E as a simple-name (§7.5.2) is a constant,
3152         field, property, localvariable, or parameter with the same type as
3153         the meaning of E as a type-name (§3.8), then both possible
3154         meanings of E are permitted.
3155
3156         We did not check that E as a simple-name had the same type as E as
3157         a type name.
3158
3159         This trivial check gives us 5-7% on bootstrap time.
3160
3161 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3162
3163         * expression.cs (Invocation.OverloadResolve): Avoid the
3164         use of hashtables and boxing here by allocating on demand.
3165
3166 2004-05-30  Martin Baulig  <martin@ximian.com>
3167
3168         * rootcontext.cs (RootContext.LookupType): Don't cache things if
3169         we're doing a silent lookup.  Don't try to lookup nested types in
3170         TypeManager.object_type (thanks to Ben Maurer).
3171
3172 2004-05-30  Martin Baulig  <martin@ximian.com>
3173
3174         Committing a patch from Ben Maurer.
3175
3176         * rootcontext.cs (RootContext.LookupType): Cache negative results.
3177
3178 2004-05-29  Martin Baulig  <martin@ximian.com>
3179
3180         * class.cs (IMethodData.ShouldIgnore): New method.
3181
3182         * typemanager.cs (TypeManager.MethodFlags): Don't take a
3183         `Location' argument, we don't need it anywhere.  Use
3184         `IMethodData.ShouldIgnore ()' instead of
3185         `MethodData.GetMethodFlags ()'.
3186         (TypeManager.AddMethod): Removed.
3187         (TypeManager.AddMethod2): Renamed to AddMethod.
3188
3189 2004-05-29  Martin Baulig  <martin@ximian.com>
3190
3191         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
3192
3193         * convert.cs (Convert.ImplicitReferenceConversion): If we're
3194         converting from a class type S to an interface type and we already
3195         have an object on the stack, don't box it again.  Fixes #52578.
3196
3197 2004-05-29  Martin Baulig  <martin@ximian.com>
3198
3199         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
3200         Added support for `params' parameters.  Fixes #59267.
3201
3202 2004-05-29  Martin Baulig  <martin@ximian.com>
3203
3204         * literal.cs (NullPointer): Provide a private .ctor which sets
3205         `type' to TypeManager.object_type.  Fixes #59048.
3206
3207 2004-05-29  Martin Baulig  <martin@ximian.com>
3208
3209         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
3210         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
3211
3212         * ecore.cs (EventExpr.instance_expr): Make the field private.
3213
3214 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
3215
3216         Fixed bug #50080 & cs0214-2.cs
3217         * expression.cs (Cast.DoResolve): Check unsafe context here.
3218         
3219         * statement.cs (Resolve.DoResolve): Likewise.
3220
3221 2004-05-26  Martin Baulig  <martin@ximian.com>
3222
3223         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
3224
3225         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
3226         (RootContext.LookupType): Pass down the `silent' flag.
3227
3228 2004-05-25  Martin Baulig  <martin@ximian.com>
3229
3230         * expression.cs
3231         (MethodGroupExpr.IdenticalTypeName): New public property.
3232         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
3233         expression actually refers to a type.
3234
3235 2004-05-25  Martin Baulig  <martin@ximian.com>
3236
3237         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
3238         for #56176 and made it actually work.
3239
3240 2004-05-25  Martin Baulig  <martin@ximian.com>
3241
3242         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
3243         (FieldExpr, PropertyExpr): Override and implement
3244         CacheTemporaries.  Fixes #52279.
3245
3246 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
3247
3248         * location.cs: In the new compiler listing a file twice is a
3249         warning, not an error.
3250
3251 2004-05-24  Martin Baulig  <martin@ximian.com>
3252
3253         * enum.cs (Enum.DefineType): For the `BaseType' to be a
3254         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
3255
3256 2004-05-24  Martin Baulig  <martin@ximian.com>
3257
3258         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
3259         walking the `using' list.  Fixes #53921.
3260
3261 2004-05-24  Martin Baulig  <martin@ximian.com>
3262
3263         * const.cs (Const.LookupConstantValue): Added support for
3264         EmptyCast's; fixes #55251.
3265
3266 2004-05-24  Martin Baulig  <martin@ximian.com>
3267
3268         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
3269         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
3270         which does the CS0135 check.  The reason is that we first need to
3271         check whether the variable actually exists.
3272
3273 2004-05-24  Martin Baulig  <martin@ximian.com>
3274
3275         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
3276         than RootContext.LookupType() to find the explicit interface
3277         type.  Fixes #58584.
3278
3279 2004-05-24  Raja R Harinath  <rharinath@novell.com>
3280
3281         * Makefile: Simplify.  Use executable.make.
3282         * mcs.exe.sources: New file.  List of sources of mcs.exe.
3283
3284 2004-05-24  Anders Carlsson  <andersca@gnome.org>
3285
3286         * decl.cs:
3287         * enum.cs:
3288         Use the invariant culture when doing String.Compare for CLS case
3289         sensitivity.
3290         
3291 2004-05-23  Martin Baulig  <martin@ximian.com>
3292
3293         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
3294         don't have any dots.  Fixes #52622, added cs0246-8.cs.
3295
3296         * namespace.cs (NamespaceEntry.Lookup): Likewise.
3297         
3298 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3299
3300         * class.cs (MemberBase.Define): Reuse MemberType member for 
3301         resolved type. Other methods can use it too.
3302
3303 2004-05-23  Martin Baulig  <martin@ximian.com>
3304
3305         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
3306         the variable also exists in the current block (otherwise, we need
3307         to report a CS0103).  Fixes #58670.
3308
3309 2004-05-23  Martin Baulig  <martin@ximian.com>
3310
3311         * flowanalysis.cs (Reachability.Reachable): Compute this
3312         on-the-fly rather than storing it as a field.
3313
3314 2004-05-23  Martin Baulig  <martin@ximian.com>
3315
3316         * flowanalysis.cs (Reachability.And): Manually compute the
3317         resulting `barrier' from the reachability.      
3318        
3319 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3320
3321         Fix bug #57835
3322         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
3323         instance of ObsoleteAttribute when symbol is obsolete.
3324
3325         * class.cs
3326         (IMethodData): Extended interface for ObsoleteAttribute support.
3327
3328 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3329
3330         * attribute.cs: Fix bug #55970
3331
3332 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3333
3334         Fix bug #52705
3335         * attribute.cs
3336         (GetObsoleteAttribute): New method. Creates the instance of
3337         ObsoleteAttribute.
3338         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
3339         ObsoleteAttribute when member is obsolete.
3340         (AttributeTester.Report_ObsoleteMessage): Common method for
3341         Obsolete error/warning reporting.
3342
3343         * class.cs
3344         (TypeContainer.base_classs_type): New member for storing parent type.
3345
3346         * decl.cs
3347         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
3348         for this MemberCore.
3349
3350 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3351
3352         * attribute.cs, const.cs: Fix bug #58590
3353
3354 2004-05-21  Martin Baulig  <martin@ximian.com>
3355
3356         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
3357         out parameters if the end of the method is unreachable.  Fixes
3358         #58098. 
3359
3360 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3361
3362         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
3363         Hari was right, why extra method.
3364
3365 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3366
3367         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
3368
3369 2004-05-20  Martin Baulig  <martin@ximian.com>
3370
3371         Merged this back from gmcs to keep the differences to a minumum.
3372
3373         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
3374         instead of a Declspace.
3375         (Attribute.ResolveType): Likewise.
3376         (Attributes.Search): Likewise.
3377         (Attributes.Contains): Likewise.
3378         (Attributes.GetClsCompliantAttribute): Likewise.
3379
3380         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
3381         argument.
3382         (MethodData.ApplyAttributes): Take an EmitContext instead of a
3383         DeclSpace.
3384
3385 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
3386
3387         Fix bug #58688 (MCS does not report error when the same attribute
3388         is assigned twice)
3389
3390         * attribute.cs (Attribute.Emit): Distinction between null and default.
3391
3392 2004-05-19  Raja R Harinath  <rharinath@novell.com>
3393
3394         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
3395         of a top-level attribute without an attribute target.
3396         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
3397         Make non-static.
3398         (Attribute.Conditional_GetConditionName), 
3399         (Attribute.Obsolete_GetObsoleteMessage): Update.
3400         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
3401         part of ScanForIndexerName.
3402         (Attribute.CanIgnoreInvalidAttribute): New function.
3403         (Attribute.ScanForIndexerName): Move to ...
3404         (Attributes.ScanForIndexerName): ... here.
3405         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
3406         (Attributes.Search): New internal variant that can choose not to
3407         complain if types aren't resolved.  The original signature now
3408         complains.
3409         (Attributes.GetClsCompliantAttribute): Use internal variant, with
3410         complaints suppressed.
3411         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
3412         only if it not useful.
3413         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
3414         top-level for attributes that are shared between the assembly
3415         and a top-level class.
3416         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
3417         * class.cs: Update to reflect changes.
3418         (DefineIndexers): Fuse loops.
3419         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
3420         a couple more variants of attribute names.
3421
3422 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
3423
3424         Fix bug #52585 (Implemented explicit attribute declaration)
3425
3426         * attribute.cs:
3427         (Attributable.ValidAttributeTargets): New abstract method. It gets
3428         list of valid attribute targets for explicit target declaration.
3429         (Attribute.Target): It holds target itself.
3430         (AttributeSection): Removed.
3431         (Attribute.CheckTargets): New method. It checks whether attribute
3432         target is valid for the current element.
3433
3434         * class.cs:
3435         (EventProperty): New class. For events that are declared like
3436         property (with add and remove accessors).
3437         (EventField): New class. For events that are declared like field.
3438         class.cs
3439
3440         * cs-parser.jay: Implemented explicit attribute target declaration.
3441
3442         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
3443         Override ValidAttributeTargets.
3444
3445         * parameter.cs:
3446         (ReturnParameter): Class for applying custom attributes on 
3447         the return type.
3448         (ParameterAtribute): New class. Class for applying custom
3449         attributes on the parameter type.
3450
3451 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
3452
3453         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
3454         definitions. 
3455
3456         (Method): Allow UNSAFE here.
3457
3458         * modifiers.cs: Support unsafe reporting.
3459
3460 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
3461
3462         * decl.cs: Fix bug #58478.
3463
3464 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3465
3466         * statement.cs: When checking for unreachable code on an EmptyStatement,
3467         set the location. Fixes bug #58488.
3468
3469 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
3470
3471         * driver.cs: Add -pkg handling.
3472
3473         From Gonzalo: UseShelLExecute=false
3474
3475 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
3476
3477         * attribute.cs:
3478         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
3479         for attribute.
3480         (Attribute.IsClsCompliaceRequired): Moved to base for better
3481         accesibility.
3482         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
3483         when attribute is AttributeUsageAttribute.
3484         (Attribute.GetValidTargets): Simplified.
3485         (Attribute.GetAttributeUsage): New method returns AttributeUsage
3486         attribute for this type.
3487         (Attribute.ApplyAttributes): Method renamed to Emit and make
3488         non-static.
3489         (GlobalAttributeSection): New class for special handling of global
3490         attributes (assembly, module).
3491         (AttributeSection.Emit): New method.
3492
3493         * class.cs: Implemented Attributable abstract methods.
3494         (MethodCore.LabelParameters): Moved to Parameter class.
3495         (Accessor): Is back simple class.
3496         (PropertyMethod): Implemented Attributable abstract class.
3497         (DelegateMethod): Implemented Attributable abstract class.
3498         (Event): New constructor for disctintion between normal Event
3499         and Event with accessors.
3500
3501         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
3502
3503         * codegen.cs, const.cs, decl.cs, delegate.cs:
3504         (CommonAssemblyModulClass): Implemented Attributable abstract class
3505         and simplified.
3506
3507         * enum.cs: Implement IAttributeSupport interface.
3508         (EnumMember): New class for emum members. Implemented Attributable
3509         abstract class
3510
3511         * parameter.cs:
3512         (ParameterBase): Is abstract.
3513         (ReturnParameter): New class for easier [return:] attribute handling.
3514
3515         * typemanager.cs: Removed builder_to_attr.
3516
3517 2004-05-11  Raja R Harinath  <rharinath@novell.com>
3518
3519         Fix bug #57151.
3520         * attribute.cs (Attribute.GetPositionalValue): New function.
3521         * class.cs (TypeContainer.VerifyMembers): New function.
3522         (TypeContainer.Emit): Use it.
3523         (ClassOrStruct): New base class for Class and Struct.
3524         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
3525         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
3526         class.
3527         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
3528         then each non-static field should have a FieldOffset attribute.
3529         Otherwise, none of the fields should have a FieldOffset attribute.
3530         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
3531         and FieldOffset attributes.
3532         * typemanager.cs (TypeManager.struct_layout_attribute_type)
3533         (TypeManager.field_offset_attribute_type): New core types.
3534         (TypeManager.InitCoreTypes): Initialize them.
3535
3536 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
3537
3538         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
3539         Return correct type.
3540         From bug #58270.
3541
3542 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
3543
3544         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
3545         be implicitly converted to ulong.
3546         
3547         * expression.cs: The logic for allowing operator &, | and ^ worked
3548         was wrong, it worked before because we did not report an error in
3549         an else branch.  Fixes 57895.
3550
3551         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
3552         allow volatile fields to be reference types.
3553
3554 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
3555
3556         * driver.cs: Add support for /debug-
3557
3558 2004-05-07  Raja R Harinath  <rharinath@novell.com>
3559
3560         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
3561         Add a 'complain' parameter to silence errors.
3562         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
3563         silently overlooked type-resolutions.
3564         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
3565         to reflect changes.
3566         (Attributes.Search): New function.
3567         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
3568         (Attributes.GetAttributeFullName): Remove hack.
3569         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
3570         Update to reflect changes.
3571         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
3572         Use Attributes.Search instead of nested loops.
3573
3574 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
3575
3576         * decl.cs:
3577         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
3578         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
3579         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
3580
3581         * report.cs: (Report.Warning): Renamed to Warning_T because of
3582         parameter collision.
3583
3584 2004-05-05  Raja R Harinath  <rharinath@novell.com>
3585
3586         * expression.cs (MemberAccess.ResolveMemberAccess):
3587         Exit with non-zero status after Report.Error.
3588         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
3589         Likewise.
3590         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
3591
3592 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3593
3594         * support.cs: Don't hang when the file is empty.
3595
3596 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3597
3598         * support.cs: In SeekableStreamReader, compute the preamble size of the
3599           underlying stream. Position changes should take into account that initial
3600           count of bytes.
3601
3602 2004-05-03  Todd Berman  <tberman@sevenl.net>
3603
3604         * driver.cs: remove unused GetSysVersion function.
3605
3606 2004-05-03  Todd Berman  <tberman@sevenl.net>
3607
3608         * driver.cs: Remove the hack from saturday, as well as the hack
3609         from jackson (LoadAssemblyFromGac), also adds the CWD to the
3610         link_paths to get that bit proper.
3611
3612 2004-05-01  Todd Berman  <tberman@sevenl.net>
3613
3614         * driver.cs: Try a LoadFrom before a Load, this checks the current
3615         path. This is currently a bug in mono that is be fixed, however, this
3616         provides a workaround for now. This will be removed when the bug
3617         is fixed.
3618
3619 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
3620
3621         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3622         incomplete key pairs (#57941).
3623
3624 2004-05-01  Todd Berman  <tberman@sevenl.net>
3625
3626         * driver.cs: Remove '.' from path_chars, now System.* loads properly
3627         from the GAC
3628
3629 2004-04-30  Jackson Harper  <jackson@ximian.com>
3630
3631         * codegen.cs: Open keys readonly.
3632         
3633 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3634
3635         * typemanager.cs: don't report cyclic struct layout when a struct
3636         contains 2 or more fields of the same type. Failed for Pango.AttrShape
3637         which has 2 Pango.Rectangle fields.
3638
3639 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3640
3641         * expression.cs: Handle IntPtr comparisons with IL code
3642         rather than a method call.
3643
3644 2004-04-29  Martin Baulig  <martin@ximian.com>
3645
3646         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
3647         the list of PropertyInfo's in class hierarchy and find the
3648         accessor.  Fixes #56013.
3649
3650 2004-04-29  Martin Baulig  <martin@ximian.com>
3651
3652         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
3653
3654 2004-04-29  Martin Baulig  <martin@ximian.com>
3655
3656         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3657
3658         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
3659
3660 2004-04-29  Martin Baulig  <martin@ximian.com>
3661
3662         * class.cs (ConstructorInitializer.Resolve): Check whether the
3663         parent .ctor is accessible.  Fixes #52146.
3664
3665 2004-04-29  Martin Baulig  <martin@ximian.com>
3666
3667         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3668
3669         * statement.cs (Using.EmitLocalVariableDecls): Use
3670         TypeManager.idisposable_type, not typeof (IDisposable).
3671         (Foreach.EmitCollectionForeach): Added support for valuetypes.
3672
3673 2004-04-29  Martin Baulig  <martin@ximian.com>
3674
3675         * class.cs (Event.Define): Don't emit the field and don't set
3676         RTSpecialName and SpecialName for events on interfaces.  Fixes
3677         #57703. 
3678
3679 2004-04-29  Raja R Harinath  <rharinath@novell.com>
3680
3681         Refactor Attribute.ApplyAttributes.
3682         * attribute.cs (Attributable): New base class for objects that can
3683         have Attributes applied on them.
3684         (Attribute): Make AttributeUsage fields public.
3685         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
3686         (Attribute.IsInternalCall): New property.
3687         (Attribute.UsageAttr): Convert to a public read-only property.
3688         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
3689         (Attribute.ResolveType, Attribute.Resolve)
3690         (Attribute.ScanForIndexerName): Update to reflect changes.
3691         (Attribute.CheckAttributeTarget): Re-format.
3692         (Attribute.ApplyAttributes): Refactor, to various
3693         Attributable.ApplyAttributeBuilder methods.
3694         * decl.cs (MemberCore): Make Attributable.
3695         * class.cs (Accessor): Make Attributable.
3696         (MethodData.ApplyAttributes): Use proper attribute types, not
3697         attribute names.
3698         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
3699         (TypeContainer.ApplyAttributeBuilder)
3700         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
3701         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
3702         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
3703         (Operator.ApplyAttributeBuilder): New factored-out methods.
3704         * const.cs (Const.ApplyAttributeBuilder): Likewise.
3705         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
3706         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
3707         * parameter.cs (ParameterBase): New Attributable base class
3708         that can also represent Return types.
3709         (Parameter): Update to the changes.
3710
3711 2004-04-29  Jackson Harper  <jackson@ximian.com>
3712
3713         * driver.cs: Prefer the corlib system version when looking for
3714         assemblies in the GAC. This is still a hack, but its a better hack
3715         now.
3716         
3717 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
3718
3719         * decl.cs, enum.cs: Improved error 3005 reporting.
3720   
3721         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
3722         (related_symbols): New private member for list of symbols
3723         related to reported error/warning.
3724         
3725         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
3726
3727 2004-04-29  Martin Baulig  <martin@ximian.com>
3728
3729         * ecore.cs (Expression.Constantify): If we're an enum and
3730         TypeManager.TypeToCoreType() doesn't give us another type, use
3731         t.UnderlyingSystemType.  Fixes #56178.  
3732
3733 2004-04-29  Martin Baulig  <martin@ximian.com>
3734
3735         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
3736         interfaces and for each interface, only add members directly
3737         declared in that interface.  Fixes #53255.
3738
3739 2004-04-28  Martin Baulig  <martin@ximian.com>
3740
3741         * expression.cs (ConditionalLogicalOperator): Use a temporary
3742         variable for `left' to avoid that we evaluate it more than once;
3743         bug #52588.
3744
3745 2004-04-28  Martin Baulig  <martin@ximian.com>
3746
3747         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
3748         `void[]' (CS1547).
3749
3750 2004-04-28  Martin Baulig  <martin@ximian.com>
3751
3752         * statement.cs (LocalInfo.Resolve): Check whether the type is not
3753         void (CS1547).
3754
3755         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
3756         whether the type is not void (CS1547).
3757
3758 2004-04-28  Martin Baulig  <martin@ximian.com>
3759
3760         * expression.cs (Unary.DoResolveLValue): Override this and report
3761         CS0131 for anything but Operator.Indirection.
3762
3763 2004-04-28  Martin Baulig  <martin@ximian.com>
3764
3765         Committing a patch from Ben Maurer; see bug #50820.
3766
3767         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3768         check for classes.
3769
3770         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3771         classes.        
3772
3773 2004-04-28  Martin Baulig  <martin@ximian.com>
3774
3775         Committing a patch from Ben Maurer; see bug #50820.
3776
3777         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3778         check for classes.
3779
3780         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3781         classes.        
3782
3783 2004-04-28  Martin Baulig  <martin@ximian.com>
3784
3785         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
3786         (Block.AddLabel): Call DoLookupLabel() to only search in the
3787         current block.
3788
3789 2004-04-28  Martin Baulig  <martin@ximian.com>
3790
3791         * cfold.cs (ConstantFold.BinaryFold): Added special support for
3792         comparing StringConstants and NullLiterals in Equality and Inequality.
3793
3794 2004-04-28  Jackson Harper  <jackson@ximian.com>
3795
3796         * driver.cs: Attempt to load referenced assemblies from the
3797         GAC. This is the quick and dirty version of this method that
3798         doesnt take into account versions and just takes the first
3799         canidate found. Will be good enough for now as we will not have more
3800         then one version installed into the GAC until I update this method.
3801
3802 2004-04-28  Martin Baulig  <martin@ximian.com>
3803
3804         * typemanager.cs (TypeManager.CheckStructCycles): New public
3805         static method to check for cycles in the struct layout.
3806
3807         * rootcontext.cs (RootContext.PopulateTypes): Call
3808         TypeManager.CheckStructCycles() for each TypeContainer.
3809         [Note: We only need to visit each type once.]
3810
3811 2004-04-28  Martin Baulig  <martin@ximian.com>
3812
3813         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
3814
3815         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
3816         success and added `out object value'.  Use a `bool resolved' field
3817         to check whether we've already been called rather than
3818         `ConstantValue != null' since this breaks for NullLiterals.
3819
3820 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3821
3822         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
3823         setting of this flag, since the 'set' method may be non-public.
3824
3825 2004-04-28  Raja R Harinath  <rharinath@novell.com>
3826
3827         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
3828         check on current_vector.Block.
3829
3830 2004-04-27  Martin Baulig  <martin@ximian.com>
3831
3832         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
3833         a field initializer.  Fixes #56459.
3834
3835 2004-04-27  Martin Baulig  <martin@ximian.com>
3836
3837         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
3838         we're not attempting to use an indexer.  Fixes #52154.
3839
3840 2004-04-27  Martin Baulig  <martin@ximian.com>
3841
3842         * statement.cs (Return): Don't create a return label if we don't
3843         need it; reverts my change from January 20th.  Thanks to Ben
3844         Maurer for this.
3845
3846 2004-04-27  Martin Baulig  <martin@ximian.com>
3847
3848         According to the spec, `goto' can only leave a nested scope, but
3849         never enter it.
3850
3851         * statement.cs (Block.LookupLabel): Only lookup in the current
3852         block, don't recurse into parent or child blocks.
3853         (Block.AddLabel): Check in parent and child blocks, report
3854         CS0140/CS0158 if we find a duplicate.
3855         (Block): Removed this indexer for label lookups.
3856         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
3857         this already does the error reporting for us.
3858
3859         * flowanalysis.cs
3860         (FlowBranching.UsageVector.Block): New public variable; may be null.
3861         (FlowBranching.CreateSibling): Added `Block' argument.
3862         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
3863         label for the target of a `goto' and check whether we're not
3864         leaving a `finally'.
3865
3866 2004-04-27  Martin Baulig  <martin@ximian.com>
3867
3868         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
3869         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
3870         just for returns).
3871
3872 2004-04-27  Martin Baulig  <martin@ximian.com>
3873
3874         * statement.cs (Block.AddLabel): Also check for implicit blocks
3875         and added a CS0158 check.
3876
3877 2004-04-27  Martin Baulig  <martin@ximian.com>
3878
3879         * flowanalysis.cs (FlowBranchingLoop): New class.
3880         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
3881         UsageVector's instead of an ArrayList.
3882         (FlowBranching.Label): Likewise.
3883         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
3884         (FlowBranching.AddBreakVector): New method.
3885
3886 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
3887
3888         * attribute.cs: Small regression fix: only convert the type if we
3889         the type is different, fixes System.Drawing build.
3890
3891 2004-04-27  Martin Baulig  <martin@ximian.com>
3892
3893         * attribute.cs (Attribute.Resolve): If we have a constant value
3894         for a named field or property, implicity convert it to the correct
3895         type.
3896
3897 2004-04-27  Raja R Harinath  <rharinath@novell.com>
3898
3899         * statement.cs (Block.Block): Implicit blocks share
3900         'child_variable_names' fields with parent blocks.
3901         (Block.AddChildVariableNames): Remove.
3902         (Block.AddVariable): Mark variable as "used by a child block" in
3903         every surrounding block.
3904         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
3905         been used in a child block, complain about violation of "Invariant
3906         meaning in blocks" rule.
3907         * cs-parser.jay (declare_local_variables): Don't use
3908         AddChildVariableNames.
3909         (foreach_statement): Don't create an implicit block: 'foreach'
3910         introduces a scope.
3911
3912 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
3913
3914         * convert.cs (ImplicitNumericConversion): 0 is also positive when
3915         converting from 0L to ulong.  Fixes 57522.
3916
3917 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3918
3919         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
3920         derived class hides via 'new' keyword field from base class (test-242.cs).
3921         TODO: Handle this in the more general way.
3922         
3923         * class.cs (CheckBase): Ditto.
3924
3925 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
3926
3927         * decl.cs (caching_flags): New member for storing cached values
3928         as bit flags.
3929         (MemberCore.Flags): New enum where bit flags for caching_flags
3930         are defined.
3931         (MemberCore.cls_compliance): Moved to caching_flags.
3932         (DeclSpace.Created): Moved to caching_flags.
3933
3934         * class.cs: Use caching_flags instead of DeclSpace.Created
3935         
3936 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
3937
3938         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
3939         if we are only a derived class, not a nested class.
3940
3941         * typemanager.cs: Same as above, but do this at the MemberLookup
3942         level (used by field and methods, properties are handled in
3943         PropertyExpr).   Allow for the qualified access if we are a nested
3944         method. 
3945
3946 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
3947
3948         * class.cs: Refactoring.
3949         (IMethodData): New inteface; Holds links to parent members
3950         to avoid member duplication (reduced memory allocation).
3951         (Method): Implemented IMethodData interface.
3952         (PropertyBase): New inner classes for get/set methods.
3953         (PropertyBase.PropertyMethod): Implemented IMethodData interface
3954         (Event): New inner classes for add/remove methods.
3955         (Event.DelegateMethod): Implemented IMethodData interface.
3956
3957         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
3958         EmitContext (related to class.cs refactoring).
3959
3960 2004-04-21  Raja R Harinath  <rharinath@novell.com>
3961
3962         * delegate.cs (Delegate.VerifyApplicability): If the number of
3963         arguments are the same as the number of parameters, first try to
3964         verify applicability ignoring  any 'params' modifier on the last
3965         parameter.
3966         Fixes #56442.
3967
3968 2004-04-16  Raja R Harinath  <rharinath@novell.com>
3969
3970         * class.cs (TypeContainer.AddIndexer): Use
3971         'ExplicitInterfaceName' to determine if interface name was
3972         explicitly specified.  'InterfaceType' is not initialized at this time.
3973         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
3974         Indexers array is already in the required order.  Initialize
3975         'IndexerName' only if there are normal indexers.
3976         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
3977         (TypeContainer.Emit): Emit DefaultMember attribute only if
3978         IndexerName is initialized.
3979         Fixes #56300.
3980
3981 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
3982
3983         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
3984         Fixes #57007
3985
3986 2004-04-15  Raja R Harinath  <rharinath@novell.com>
3987
3988         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
3989         attributes.
3990         Fix for #56456.
3991
3992         * attribute.cs (Attribute.Resolve): Check for duplicate named
3993         attributes.
3994         Fix for #56463.
3995
3996 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
3997
3998         * iterators.cs (MarkYield): track whether we are in an exception,
3999         and generate code accordingly.  Use a temporary value to store the
4000         result for our state.
4001
4002         I had ignored a bit the interaction of try/catch with iterators
4003         since their behavior was not entirely obvious, but now it is
4004         possible to verify that our behavior is the same as MS .NET 2.0
4005
4006         Fixes 54814
4007
4008 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
4009
4010         * iterators.cs: Avoid creating temporaries if there is no work to
4011         do. 
4012
4013         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
4014         Enumerations, use TypeManager.EnumToUnderlying and call
4015         recursively. 
4016
4017         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
4018         bug #57013
4019
4020         (This.Emit): Use EmitContext.EmitThis to emit our
4021         instance variable.
4022
4023         (This.EmitAssign): Ditto.
4024
4025         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
4026         codepaths, we will move all the functionality into
4027         Mono.CSharp.This 
4028
4029         (FieldExpr.EmitAssign): Ditto.
4030
4031         This fixes several hidden bugs that I uncovered while doing a code
4032         review of this today.
4033
4034         * codegen.cs (EmitThis): reworked so the semantics are more clear
4035         and also support value types "this" instances.
4036
4037         * iterators.cs: Changed so that for iterators in value types, we
4038         do not pass the value type as a parameter.  
4039
4040         Initialization of the enumerator helpers is now done in the caller
4041         instead of passing the parameters to the constructors and having
4042         the constructor set the fields.
4043
4044         The fields have now `assembly' visibility instead of private.
4045
4046 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
4047
4048         * expression.cs (Argument.Resolve): Check if fields passed as ref
4049         or out are contained in a MarshalByRefObject.
4050
4051         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
4052         another compiler type.
4053
4054 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
4055
4056         * class.cs (Indexer.Define): use the new name checking method.
4057         Also, return false on an error.
4058         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
4059         (is_identifier_[start/part]_character): make static.
4060
4061 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
4062
4063         * expression.cs (Binary.ResolveOperator): Do no append strings
4064         twice: since we can be invoked more than once (array evaluation)
4065         on the same concatenation, take care of this here.  Based on a fix
4066         from Ben (bug #56454)
4067
4068 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
4069
4070         * codegen.cs: Fix another case where CS1548 must be reported (when 
4071         delay-sign isn't specified and no private is available #56564). Fix
4072         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
4073         error when MCS is used on the MS runtime and we need to delay-sign 
4074         (which seems unsupported by AssemblyBuilder - see #56621).
4075
4076 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
4077
4078         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
4079         (TypeManager.ComputeNamespaces): Faster implementation for
4080         Microsoft runtime.
4081
4082         * compiler.csproj: Updated AssemblyName to mcs.
4083
4084 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
4085
4086         * rootcontext.cs: Add new types to the boot resolution.
4087
4088         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
4089         MulticastDelegate is not allowed.
4090
4091         * typemanager.cs: Add new types to lookup: System.TypedReference
4092         and ArgIterator.
4093
4094         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
4095         check for TypedReference or ArgIterator, they are not allowed. 
4096
4097         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
4098         makes us properly catch 1510 in some conditions (see bug 56016 for
4099         details). 
4100
4101 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
4102
4103         * CryptoConvert.cs: update from corlib version
4104         with endian fixes.
4105
4106 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
4107
4108         * class.cs (Indexer.Define): Check indexername declaration
4109
4110 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
4111
4112         * attribute.cs (IsClsCompliant): Fixed problem with handling
4113         all three states (compliant, not-compliant, undetected).
4114
4115 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
4116
4117         * attribute.cs (Attribute): Location is now public.
4118         (Resolve): Store resolved arguments (pos_values) in attribute class.
4119         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
4120         (GetClsCompliantAttributeValue): New method that gets
4121         CLSCompliantAttribute value.
4122         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
4123         if exists else null.
4124         (AttributeTester): New class for CLS-Compliant verification routines.
4125
4126         * class.cs (Emit): Add CLS-Compliant verification.
4127         (Method.GetSignatureForError): Implemented.
4128         (Constructor.GetSignatureForError): Implemented
4129         (Constructor.HasCompliantArgs): Returns if constructor has
4130         CLS-Compliant arguments.
4131         (Constructor.Emit): Override.
4132         (Construcor.IsIdentifierClsCompliant): New method; For constructors
4133         is needed to test only parameters.
4134         (FieldBase.GetSignatureForError): Implemented.
4135         (TypeContainer): New member for storing base interfaces.
4136         (TypeContainer.FindMembers): Search in base interfaces too.
4137
4138         * codegen.cs (GetClsComplianceAttribute): New method that gets
4139         assembly or module CLSCompliantAttribute value.
4140         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
4141         for assembly.
4142         (ModuleClass.Emit): Add error 3012 test.
4143
4144         * const.cs (Emit): Override and call base for CLS-Compliant tests.
4145
4146         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
4147         state for all decl types.
4148         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
4149         if CLS-Compliant tests are required.
4150         (IsClsCompliaceRequired): New method. Analyze whether code
4151         must be CLS-Compliant.
4152         (IsExposedFromAssembly): New method. Returns true when MemberCore
4153         is exposed from assembly.
4154         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
4155         value or gets cached value.
4156         (HasClsCompliantAttribute): New method. Returns true if MemberCore
4157         is explicitly marked with CLSCompliantAttribute.
4158         (IsIdentifierClsCompliant): New abstract method. This method is
4159         used to testing error 3005.
4160         (IsIdentifierAndParamClsCompliant): New method. Common helper method
4161         for identifier and parameters CLS-Compliant testing.
4162         (VerifyClsCompliance): New method. The main virtual method for
4163         CLS-Compliant verifications.
4164         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
4165         null. I don't know why is null (too many public members !).
4166         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
4167         and get value of first CLSCompliantAttribute that found.
4168
4169         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
4170         (VerifyClsCompliance): Override and add extra tests.
4171
4172         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
4173         clscheck- disable CLS-Compliant verification event if assembly is has
4174         CLSCompliantAttribute(true).
4175
4176         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
4177         ApllyAttribute is now called in emit section as in the other cases.
4178         Possible future Emit integration.
4179         (IsIdentifierClsCompliant): New override.
4180         (VerifyClsCompliance): New override.
4181         (GetEnumeratorName): Returns full enum name.
4182
4183         * parameter.cs (GetSignatureForError): Implemented.
4184
4185         * report.cs (WarningData): New struct for Warning message information.
4186         (LocationOfPreviousError): New method.
4187         (Warning): New method. Reports warning based on the warning table.
4188         (Error_T): New method. Reports error based on the error table.
4189
4190         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
4191         verifications are done here.
4192
4193         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
4194
4195         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
4196         CLSCompliantAttribute.
4197         (all_imported_types): New member holds all imported types from other
4198         assemblies.
4199         (LoadAllImportedTypes): New method fills static table with exported types
4200         from all referenced assemblies.
4201         (Modules): New property returns all assembly modules.
4202
4203 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
4204
4205         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
4206         throwing a parser error.
4207
4208         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
4209         which removes the hardcoded get_/set_ prefixes for properties, as
4210         IL allows for the properties to be named something else.  
4211
4212         Bug #56013
4213
4214         * expression.cs: Do not override operand before we know if it is
4215         non-null.  Fix 56207
4216
4217 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4218
4219         * typemanager.cs: support for pinned variables.
4220
4221 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4222
4223         * decl.cs, typemanager.cs: Avoid using an arraylist
4224         as a buffer if there is only one result set.
4225
4226 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4227
4228         * expression.cs: Make sure you cant call a static method
4229         with an instance expression, bug #56174.
4230
4231 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
4232
4233         * class.cs (IsDuplicateImplementation): Improve error reporting to
4234         flag 663 (method only differs in parameter modifier).
4235
4236         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
4237         in preprocessor directives.
4238
4239         * location.cs (LookupFile): Allow for the empty path.
4240
4241         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
4242         better approach for some of that patch, but its failing with the
4243         CharSet enumeration.  For now try/catch will do.
4244
4245         * typemanager.cs: Do not crash if a struct does not have fields.
4246         Fixes 56150.
4247
4248 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4249
4250         * expression.cs: cs0213, cant fix a fixed expression.
4251         fixes 50231.
4252
4253 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4254
4255         * cs-parser.jay: detect invalid embeded statements gracefully.
4256         bug #51113.
4257
4258 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4259
4260         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
4261         As a regex:
4262         s/
4263         the invocation type may not be a subclass of the tye of the item/
4264         The type of the item must be a subclass of the invocation item.
4265         /g
4266
4267         Fixes bug #50820.
4268
4269 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
4270
4271         * attribute.cs: Added methods to get a string and a bool from an
4272         attribute. Required to information from AssemblyKeyFileAttribute,
4273         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
4274         * codegen.cs: Modified AssemblyName creation to include support for
4275         strongnames. Catch additional exceptions to report them as CS1548.
4276         * compiler.csproj: Updated include CryptoConvert.cs.
4277         * compiler.csproj.user: Removed file - user specific configuration.
4278         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
4279         Mono.Security assembly. The original class is maintained and tested in
4280         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
4281         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
4282         like CSC 8.0 (C# v2) supports.
4283         * Makefile: Added CryptoConvert.cs to mcs sources.
4284         * rootcontext.cs: Added new options for strongnames.
4285
4286 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
4287
4288         * driver.cs: For --expect-error, report error code `2'
4289         if the program compiled with no errors, error code `1' if
4290         it compiled with an error other than the one expected.
4291
4292 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
4293
4294         * compiler.csproj: Updated for Visual Studio .NET 2003.
4295         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
4296         * compiler.sln: Updated for Visual Studio .NET 2003.
4297
4298 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
4299
4300         * expression.cs: Fix bug #47234. We basically need to apply the
4301         rule that we prefer the conversion of null to a reference type
4302         when faced with a conversion to 'object' (csc behaviour).
4303
4304 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4305
4306         * statement.cs: Shorter form for foreach, eliminates
4307         a local variable. r=Martin.
4308
4309 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4310
4311         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
4312         checks if we can use brtrue/brfalse to test for 0.
4313         * expression.cs: use the above in the test for using brtrue/brfalse.
4314         cleanup code a bit.
4315
4316 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4317
4318         * expression.cs: Rewrite string concat stuff. Benefits:
4319
4320         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
4321         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
4322         rather than a concat chain.
4323
4324         * typemanager.cs: Add lookups for more concat overloads.
4325
4326 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4327
4328         * expression.cs: Emit shorter il code for array init.
4329
4330         newarr
4331         dup
4332         // set 1
4333
4334         // set 2
4335
4336         newarr
4337         stloc.x
4338
4339         ldloc.x
4340         // set 1
4341
4342         ldloc.x
4343         // set 2
4344
4345 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
4346
4347         * statement.cs: Before, two switch blocks would be merged if the
4348         total size of the blocks (end_item - begin_item + 1) was less than
4349         two times the combined sizes of the blocks.
4350
4351         Now, it will only merge if after the merge at least half of the
4352         slots are filled.
4353
4354         fixes 55885.
4355
4356 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
4357
4358         * class.cs : csc build fix for GetMethods(). See bug #52503.
4359
4360 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
4361
4362         * expression.cs: Make sure fp comparisons work with NaN.
4363         This fixes bug #54303. Mig approved this patch a long
4364         time ago, but we were not able to test b/c the runtime
4365         had a related bug.
4366
4367 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
4368
4369         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
4370
4371 2004-03-19  Martin Baulig  <martin@ximian.com>
4372
4373         * class.cs (MemberCore.IsDuplicateImplementation): Report the
4374         error here and not in our caller.
4375
4376 2004-03-19  Martin Baulig  <martin@ximian.com>
4377
4378         * interface.cs: Completely killed this file.
4379         (Interface): We're now a TypeContainer and live in class.cs.
4380
4381         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
4382         argument; we're now also called for interfaces.
4383         (TypeContainer.DefineMembers): Allow this method being called
4384         multiple times.
4385         (TypeContainer.GetMethods): New public method; formerly known as
4386         Interface.GetMethod().  This is used by PendingImplementation.
4387         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
4388         it's now private and non-static.
4389         (Interface): Moved this here; it's now implemented similar to
4390         Class and Struct.
4391         (Method, Property, Event, Indexer): Added `bool is_interface'
4392         argument to their .ctor's.
4393         (MemberBase.IsInterface): New public field.
4394
4395         * cs-parser.jay: Create normal Method, Property, Event, Indexer
4396         instances instead of InterfaceMethod, InterfaceProperty, etc.
4397         (opt_interface_base): Removed; we now use `opt_class_base' instead.
4398         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
4399
4400 2004-03-19  Martin Baulig  <martin@ximian.com>
4401
4402         * class.cs (MethodCore.IsDuplicateImplementation): New private
4403         method which does the CS0111 checking.
4404         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
4405         Use IsDuplicateImplementation().
4406
4407 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
4408
4409         * decl.cs (FindMemberToOverride): New method to find the correct
4410         method or property to override in the base class.
4411         * class.cs
4412             - Make Method/Property use the above method to find the
4413               version in the base class.
4414             - Remove the InheritableMemberSignatureCompare as it is now
4415               dead code.
4416
4417         This patch makes large code bases much faster to compile, as it is
4418         O(n) rather than O(n^2) to do this validation.
4419
4420         Also, it fixes bug 52458 which is that nested classes are not
4421         taken into account when finding the base class member.
4422
4423         Reviewed/Approved by Martin.
4424
4425 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
4426
4427         * interface.cs: In all interface classes removed redundant
4428         member initialization.
4429
4430 2004-03-16  Martin Baulig  <martin@ximian.com>
4431
4432         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
4433
4434 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
4435
4436         * decl.cs (DefineTypeAndParents): New helper method to define a
4437         type's containers before the type itself is defined;  This is a
4438         bug exposed by the recent changes to Windows.Forms when an
4439         implemented interface was defined inside a class that had not been
4440         built yet.   
4441
4442         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
4443
4444         (Check): Loop correctly to report errors modifiers
4445         (UNSAFE was not in the loop, since it was the same as TOP).
4446
4447         * interface.cs: Every interface member now takes a ModFlags,
4448         instead of a "is_new" bool, which we set on the base MemberCore. 
4449
4450         Every place where we called "UnsafeOk" in the interface, now we
4451         call the proper member (InterfaceMethod.UnsafeOK) instead to get
4452         the unsafe settings from the member declaration instead of the
4453         container interface. 
4454
4455         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
4456
4457         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4458         `set_indexer_name' to the pending bits (one per type).
4459
4460         We fixed a bug today that was picking the wrong method to
4461         override, since for properties the existing InterfaceMethod code
4462         basically ignored the method name.  Now we make sure that the
4463         method name is one of the valid indexer names.
4464
4465 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
4466  
4467         * support.cs (SeekableStreamReader): Keep track of stream byte
4468         positions and don't mix them with character offsets to the buffer.
4469
4470         Patch from Gustavo Giráldez
4471
4472 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
4473
4474         * interface.cs (InterfaceSetGetBase): Removed double member
4475         initialization, base class does it as well.
4476
4477 2004-03-13  Martin Baulig  <martin@ximian.com>
4478
4479         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
4480         when compiling corlib.
4481
4482 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
4483
4484         * convert.cs (ExplicitConversion): We were reporting an error on
4485         certain conversions (object_type source to a value type, when the
4486         expression was `null') before we had a chance to pass it through
4487         the user defined conversions.
4488
4489         * driver.cs: Replace / and \ in resource specifications to dots.
4490         Fixes 50752
4491
4492         * class.cs: Add check for duplicate operators.  Fixes 52477
4493
4494 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
4495
4496         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
4497         that are in the middle of the statements, not only at the end.
4498         Fixes #54987
4499
4500         * class.cs (TypeContainer.AddField): No longer set the
4501         `HaveStaticConstructor' flag, now we call it
4502         `UserDefineStaticConstructor' to diferentiate the slightly
4503         semantic difference.
4504
4505         The situation is that we were not adding BeforeFieldInit (from
4506         Modifiers.TypeAttr) to classes that could have it.
4507         BeforeFieldInit should be set to classes that have no static
4508         constructor. 
4509
4510         See:
4511
4512         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
4513
4514         And most importantly Zoltan's comment:
4515
4516         http://bugzilla.ximian.com/show_bug.cgi?id=44229
4517
4518         "I think beforefieldinit means 'it's ok to initialize the type sometime 
4519          before its static fields are used', i.e. initialization does not need
4520          to be triggered by the first access to the type. Setting this flag
4521          helps the JIT to compile better code, since it can run the static
4522          constructor at JIT time, and does not need to generate code to call it
4523          (possibly lots of times) at runtime. Unfortunately, mcs does not set
4524          this flag for lots of classes like String. 
4525          
4526          csc sets this flag if the type does not have an explicit static 
4527          constructor. The reasoning seems to be that if there are only static
4528          initalizers for a type, and no static constructor, then the programmer
4529          does not care when this initialization happens, so beforefieldinit
4530          can be used.
4531          
4532          This bug prevents the AOT compiler from being usable, since it 
4533          generates so many calls to mono_runtime_class_init that the AOT code
4534          is much slower than the JITted code. The JITted code is faster, 
4535          because it does not generate these calls if the vtable is type is
4536          already initialized, which is true in the majority of cases. But the
4537          AOT compiler can't do this."
4538
4539 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
4540
4541         * class.cs (MethodData.Emit): Refactor the code so symbolic
4542         information is generated for destructors;  For some reasons we
4543         were taking a code path that did not generate symbolic information
4544         before. 
4545
4546 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4547
4548         * class.cs: Create a Constructor.CheckBase method that
4549         takes care of all validation type code. The method
4550         contains some code that was moved from Define.
4551
4552         It also includes new code that checks for duplicate ctors.
4553         This fixes bug #55148.
4554
4555 2004-03-09  Joshua Tauberer <tauberer@for.net>
4556
4557         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
4558         a { ... }-style array creation invokes EmitStaticInitializers
4559         which is not good for reference-type arrays.  String, decimal
4560         and now null constants (NullCast) are not counted toward
4561         static initializers.
4562
4563 2004-03-05  Martin Baulig  <martin@ximian.com>
4564
4565         * location.cs (SourceFile.HasLineDirective): New public field;
4566         specifies whether the file contains or is referenced by a "#line"
4567         directive.
4568         (Location.DefineSymbolDocuments): Ignore source files which
4569         either contain or are referenced by a "#line" directive.        
4570
4571 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
4572
4573         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
4574         direct access to our parent, so check the method inline there.
4575
4576 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4577
4578         * expression.cs (Invocation.EmitCall): Miguel's last commit
4579         caused a regression. If you had:
4580
4581             T t = null;
4582             t.Foo ();
4583
4584         In Foo the implict this would be null.
4585
4586 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
4587
4588         * expression.cs (Invocation.EmitCall): If the method is not
4589         virtual, do not emit a CallVirt to it, use Call.
4590
4591         * typemanager.cs (GetFullNameSignature): Improve the method to
4592         cope with ".ctor" and replace it with the type name.
4593
4594         * class.cs (ConstructorInitializer.Resolve): Now the method takes
4595         as an argument the ConstructorBuilder where it is being defined,
4596         to catch the recursive constructor invocations.
4597
4598 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
4599
4600         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
4601         routines to check if a type is an enumerable/enumerator allow
4602         classes that implement the IEnumerable or IEnumerator interfaces.
4603
4604         * class.cs (Property, Operator): Implement IIteratorContainer, and
4605         implement SetYields.
4606
4607         (Property.Define): Do the block swapping for get_methods in the
4608         context of iterators.   We need to check if Properties also
4609         include indexers or not.
4610
4611         (Operator): Assign the Block before invoking the
4612         OperatorMethod.Define, so we can trigger the Iterator code
4613         replacement. 
4614
4615         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
4616         Property and Operator classes are not created when we parse the
4617         declarator but until we have the block completed, so we use a
4618         singleton SimpleIteratorContainer.Simple to flag whether the
4619         SetYields has been invoked.
4620
4621         We propagate this setting then to the Property or the Operator to
4622         allow the `yield' to function.
4623
4624 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
4625
4626         * codegen.cs: Implemented attribute support for modules.
4627         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
4628         Assembly/Module functionality.
4629
4630         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
4631         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
4632         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
4633
4634 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
4635
4636         * interface.cs (FindMembers): The operation is performed on all base
4637         interfaces and not only on the first. It is required for future CLS Compliance patch.
4638
4639 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4640
4641         * statement.cs, codegen.cs:
4642         This patch deals with patterns such as:
4643
4644         public class List : IEnumerable {
4645
4646                 public MyEnumerator GetEnumerator () {
4647                         return new MyEnumerator(this);
4648                 }
4649
4650                 IEnumerator IEnumerable.GetEnumerator () {
4651                         ...
4652                 }
4653                 
4654                 public struct MyEnumerator : IEnumerator {
4655                         ...
4656                 }
4657         }
4658
4659         Before, there were a few things we did wrong:
4660         1) we would emit callvirt on a struct, which is illegal
4661         2) we emited ldarg when we needed to emit ldarga
4662         3) we would mistakenly call the interface methods on an enumerator
4663         type that derived from IEnumerator and was in another assembly. For example:
4664
4665         public class MyEnumerator : IEnumerator
4666
4667         Would have the interface methods called, even if there were public impls of the
4668         method. In a struct, this lead to invalid IL code.
4669
4670 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
4671
4672         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
4673           renamed to Emit.
4674
4675         * delegate.cs (Define): Fixed crash when delegate type is undefined.
4676
4677 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
4678
4679         * cs-parser.jay: Fix small regression: we were not testing V2
4680         compiler features correctly.
4681
4682         * interface.cs: If the emit context is null, then create one
4683
4684 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
4685
4686         * decl.cs (GetSignatureForError): New virtual method to get full name
4687           for error messages.
4688
4689         * attribute.cs (IAttributeSupport): New interface for attribute setting.
4690           Now it is possible to rewrite ApplyAttributes method to be less if/else.
4691
4692         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
4693           Duplicated members and code in these classes has been removed.
4694           Better encapsulation in these classes.
4695
4696 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
4697
4698         * assign.cs (Assign.DoResolve): When dealing with compound
4699         assignments, there is a new rule in ECMA C# 2.4 (might have been
4700         there before, but it is documented here) that states that in:
4701
4702         a op= b;
4703
4704         If b is of type int, and the `op' is a shift-operator, then the
4705         above is evaluated as:
4706
4707         a = (int) a op b 
4708
4709         * expression.cs (Binary.ResolveOperator): Instead of testing for
4710         int/uint/long/ulong, try to implicitly convert to any of those
4711         types and use that in pointer arithmetic.
4712
4713         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
4714         method to print information for from the type, not from the
4715         null-method we were given.
4716
4717 2004-02-01  Duncan Mak  <duncan@ximian.com>
4718
4719         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
4720         parsing for cmd, fixes bug #53694.
4721
4722 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
4723
4724         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
4725         in the member name duplication tests. Property and operator name duplication
4726         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
4727
4728 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
4729
4730         * interface.cs (PopulateMethod): Fixed crash when interface method
4731         returns not existing type (error test cs0246-3.cs).
4732
4733 2004-02-02  Ravi Pratap M <ravi@ximian.com>
4734
4735         * cs-parser.jay (interface_accessors): Re-write actions to also
4736         store attributes attached to get and set methods. Fix spelling
4737         while at it.
4738
4739         (inteface_property_declaration): Modify accordingly.
4740
4741         (InterfaceAccessorInfo): New helper class to store information to pass
4742         around between rules that use interface_accessors.
4743
4744         * interface.cs (Emit): Apply attributes on the get and set
4745         accessors of properties and indexers too.
4746
4747         * attribute.cs (ApplyAttributes): Modify accordingly to use the
4748         right MethodBuilder when applying attributes to the get and set accessors.
4749
4750 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
4751
4752         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
4753
4754 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
4755
4756         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
4757
4758 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
4759
4760         * cs-parser.jay: Remove YIELD token, instead use the new grammar
4761         changes that treat `yield' specially when present before `break'
4762         or `return' tokens.
4763
4764         * cs-tokenizer.cs: yield is no longer a keyword.
4765
4766 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
4767
4768         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
4769         setting for default constructors.
4770         For default constructors are almost every time set wrong Modifier. The
4771         generated IL code has been alright. But inside mcs this values was
4772         wrong and this was reason why several of my CLS Compliance tests
4773         failed.
4774
4775 2004-01-22  Martin Baulig  <martin@ximian.com>
4776
4777         * cs-parser.jay (namespace_or_type_name): Return an Expression,
4778         not a QualifiedIdentifier.  This is what `type_name_expression'
4779         was previously doing.
4780         (type_name_expression): Removed; the code is now in
4781         `namespace_or_type_name'.
4782         (qualified_identifier): Removed, use `namespace_or_type_name'
4783         instead.
4784         (QualifiedIdentifier): Removed this class.      
4785
4786 2004-01-22  Martin Baulig  <martin@ximian.com>
4787
4788         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
4789         not a string as alias name.
4790
4791 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
4792
4793         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
4794         #52730 bug, and instead compute correctly the need to use a
4795         temporary variable when requesting an address based on the
4796         static/instace modified of the field and the constructor.
4797  
4798 2004-01-21  Martin Baulig  <martin@ximian.com>
4799
4800         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
4801         class and namespace before looking up aliases.  Fixes #52517.
4802
4803 2004-01-21  Martin Baulig  <martin@ximian.com>
4804
4805         * flowanalysis.cs (UsageVector.Merge): Allow variables being
4806         assinged in a 'try'; fixes exception4.cs.
4807
4808 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4809         * class.cs : Implemented parameter-less constructor for TypeContainer
4810
4811         * decl.cs: Attributes are now stored here. New property OptAttributes
4812
4813         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
4814
4815         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
4816
4817 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4818
4819         * typemanager.cs (CSharpSignature): Now reports also inner class name.
4820           (CSharpSignature): New method for indexer and property signature.
4821
4822 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4823
4824         * pending.cs (IsVirtualFilter): Faster implementation.
4825
4826 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4827
4828         * typemanager.cs: Avoid inclusion of same assembly more than once.
4829
4830 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4831
4832         * cs-parser.jay: Fixed problem where the last assembly attribute
4833           has been applied also to following declaration (class, struct, etc.)
4834           
4835 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
4836
4837         * class.cs: Added error CS0538, CS0539 reporting.
4838         Fixed crash on Microsoft runtime when field type is void.
4839
4840         * cs-parser.jay: Added error CS0537 reporting.
4841
4842         * pending.cs: Added error CS0535 reporting.
4843         Improved error report for errors CS0536, CS0534.
4844
4845 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
4846
4847         Merge a few bits from the Anonymous Method MCS tree.
4848
4849         * statement.cs (ToplevelBlock): New class for toplevel methods,
4850         will hold anonymous methods, lifted variables.
4851
4852         * cs-parser.jay: Create toplevel blocks for delegates and for
4853         regular blocks of code. 
4854
4855 2004-01-20  Martin Baulig  <martin@ximian.com>
4856
4857         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
4858         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
4859         and `NeedExplicitReturn'; added `IsLastStatement'.
4860         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
4861         have a `ReturnLabel' or we're not unreachable.
4862
4863         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
4864         child's reachability; don't just override ours with it.  Fixes
4865         #58058 (lluis's example).
4866         (FlowBranching): Added public InTryOrCatch(), InCatch(),
4867         InFinally(), InLoop(), InSwitch() and
4868         BreakCrossesTryCatchBoundary() methods.
4869
4870         * statement.cs (Return): Do all error checking in Resolve().
4871         Unless we are the last statement in a top-level block, always
4872         create a return label and jump to it.
4873         (Break, Continue): Do all error checking in Resolve(); also make
4874         sure we aren't leaving a `finally'.
4875         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
4876         statement in a top-level block.
4877         (Block.Flags): Added `IsDestructor'.
4878         (Block.IsDestructor): New public property.
4879
4880 2004-01-20  Martin Baulig  <martin@ximian.com>
4881
4882         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
4883
4884 2004-01-20  Martin Baulig  <martin@ximian.com>
4885
4886         * statement.cs (Statement.ResolveUnreachable): New public method.
4887         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
4888         (Block.Resolve): Resolve unreachable statements.
4889
4890 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4891
4892         * expression.cs: We need to fix the case where we do
4893         not have a temp variable here.
4894
4895         * assign.cs: Only expression compound assignments need
4896         temporary variables.
4897
4898 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
4899
4900         * flowanalysis.cs: Reduce memory allocation in a few ways:
4901           - A block with no variables should not allocate a bit
4902             vector for itself.
4903           - A method with no out parameters does not need any tracking
4904             for assignment of the parameters, so we need not allocate
4905             any data for it.
4906           - The arrays:
4907                 public readonly Type[] VariableTypes;
4908                 public readonly string[] VariableNames;
4909             Are redundant. The data is already stored in the variable
4910             map, so we need not allocate another array for it.
4911           - We need to add alot of checks for if (params | locals) == null
4912             due to the first two changes.
4913
4914 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
4915
4916         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
4917         implement IMemoryLocation, we store a copy on a local variable and
4918         take the address of it.  Patch from Benjamin Jemlich
4919
4920         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
4921         to use a special "type_name_expression" rule which reduces the
4922         number of "QualifiedIdentifier" classes created, and instead
4923         directly creates MemberAccess expressions.
4924
4925 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
4926
4927         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
4928         that fixes #52853.  Null literal assignment to ValueType
4929
4930         * class.cs (MethodData.Emit): Instead of checking the name of the
4931         method to determine if its a destructor, create a new derived
4932         class from Method called Destructor, and test for that.  
4933
4934         * cs-parser.jay: Create a Destructor object instead of a Method.  
4935
4936         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
4937
4938         Fixes: 52933
4939
4940 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
4941
4942         * expression.cs (Binary.ResolveOperator): Perform an implicit
4943         conversion from MethodGroups to their delegate types on the
4944         Addition operation.
4945
4946         * delegate.cs: Introduce a new class DelegateCreation that is the
4947         base class for `NewDelegate' and `ImplicitDelegateCreation',
4948         factor some code in here.
4949
4950         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
4951         conversion from MethodGroups to compatible delegate types. 
4952
4953         * ecore.cs (Expression.Resolve): Do not flag error 654
4954         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
4955         we allow conversions from MethodGroups to delegate types now.
4956
4957         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
4958         assignments in v2 either.
4959
4960 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
4961
4962         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
4963         static read-only fields in ctors.
4964
4965         Applied patch from Benjamin Jemlich 
4966
4967         * expression.cs (UnaryMutator): Avoid leaking local variables. 
4968
4969 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
4970
4971         * cs-tokenizer.cs (IsCastToken): Allow the various native types
4972         here to return true, as they can be used like this:
4973
4974                 (XXX) int.MEMBER ()
4975
4976         Fixed 49836 and all the other dups
4977
4978 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
4979
4980         * driver.cs: Implement /win32res and /win32icon.
4981
4982 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4983
4984         * cs-parser.jay: Add a rule to improve error handling for the
4985         common mistake of placing modifiers after the type.
4986
4987 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4988
4989         * cs-parser.jay (interface_event_declaration): Catch
4990         initialization of events on interfaces, and report cs0068
4991
4992         * cs-parser.jay (interface_event_declaration): Catch
4993         initialization of events. 
4994
4995         * ecore.cs: Better report missing constructors.
4996
4997         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4998         the error reporting done in the wrong place.  Fix.
4999
5000         * expression.cs (Binary.ResolveOperator): Catch the 
5001         operator + (E x, E y) error earlier, and later allow for implicit
5002         conversions in operator +/- (E e, U x) from U to the underlying
5003         type of E.
5004
5005         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
5006         52596, if the container class is abstract, the default constructor
5007         is protected otherwise its public (before, we were always public).
5008
5009         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
5010         fixed statement.
5011
5012         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
5013         Jemlich that fixes bug #52597, MCS was generating invalid code for
5014         idisposable structs.   Thanks to Ben for following up with this
5015         bug as well.
5016
5017 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
5018
5019         * driver.cs: Allow assemblies without code to be generated, fixes
5020         52230.
5021
5022 2004-01-07  Nick Drochak <ndrochak@gol.com>
5023
5024         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
5025
5026 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
5027
5028         * cs-parser.jay: Add rules to improve error reporting if fields or
5029         methods are declared at the namespace level (error 116)
5030
5031         * Add rules to catch event add/remove
5032
5033 2004-01-04  David Sheldon <dave-mono@earth.li>
5034
5035   * expression.cs: Added matching ")" to error message for 
5036   CS0077
5037
5038 2004-01-03 Todd Berman <tberman@gentoo.org>
5039
5040         * ecore.cs, attribute.cs:
5041         Applying fix from #52429.
5042
5043 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5044
5045         * ecore.cs, expression.cs, statement.cs:
5046         Total rewrite of how we handle branching. We
5047         now handle complex boolean expressions with fewer
5048         jumps. As well if (x == 0) no longer emits a ceq.
5049
5050         if (x is Foo) is much faster now, because we generate
5051         better code.
5052
5053         Overall, we get a pretty big improvement on our benchmark
5054         tests. The code we generate is smaller and more readable.
5055
5056         I did a full two-stage bootstrap. The patch was reviewed
5057         by Martin and Miguel.
5058
5059 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5060
5061         * cs-parser.jay: Make primary_expression not take a QI.
5062         we dont need this because the member_access rule covers
5063         us here. So we replace the rule with just IDENTIFIER.
5064
5065         This has two good effects. First, we remove a s/r conflict.
5066         Second, we allocate many fewer QualifiedIdentifier objects.
5067
5068 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5069
5070         * attribute.cs: Handle MarshalAs attributes as pseudo, and
5071         set the correct information via SRE. This prevents
5072         hanging on the MS runtime. Fixes #29374.
5073
5074 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5075
5076         * convert.cs: correctly handle conversions to value types
5077         from Enum and ValueType as unboxing conversions.
5078
5079         Fixes bug #52569. Patch by Benjamin Jemlich.
5080
5081 2004-01-02  Ravi Pratap  <ravi@ximian.com>
5082
5083         * expression.cs (BetterConversion): Prefer int -> uint
5084         over int -> ulong (csc's behaviour). This fixed bug #52046.
5085
5086 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5087
5088         * decl.cs (MemberCache.FindMembers): now returns a
5089         MemberInfo [].
5090
5091         * typemanager.cs: In general, go with with ^^.
5092         (CopyNewMethods): take an IList.
5093         (RealMemberLookup): Only allocate an arraylist
5094         if we copy from two sets of methods.
5095
5096         This change basically does two things:
5097         1) Fewer array lists allocated due to CopyNewMethods.
5098         2) the explicit cast in MemberList costed ALOT.
5099
5100 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
5101
5102         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
5103         a hashtable to avoid needless string allocations when an identifier is
5104         used more than once (the common case).
5105
5106 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
5107
5108         * pending.cs: MS's TypeBuilder.GetInterfaces ()
5109         is broken, it will not return anything. So, we
5110         have to use the information we have in mcs to
5111         do the task.
5112
5113         * typemanager.cs: Add a cache for GetInterfaces,
5114         since this will now be used more often (due to ^^)
5115
5116         (GetExplicitInterfaces) New method that gets the
5117         declared, not effective, interfaces on a type
5118         builder (eg, if you have interface IFoo, interface
5119         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
5120         { IBar }.
5121
5122         This patch makes MCS able to bootstrap itself on
5123         Windows again.
5124
5125 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
5126
5127         * expression.cs: Remove the Nop's that Miguel put
5128         in by mistake.
5129
5130 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5131
5132         * report.cs, codegen.cs: Give the real stack trace to
5133         the error when an exception is thrown.
5134
5135 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5136
5137         * decl.cs: only allocate hashtables for ifaces if 
5138         it is an iface!
5139
5140 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5141
5142         * expression.cs: fix the error from cs0121-2.cs
5143         (a parent interface has two child interfaces that
5144         have a function with the same name and 0 params
5145         and the function is called through the parent).
5146
5147 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
5148
5149         * class.cs, rootcontext.cs, typmanager.cs: do not
5150         leak pointers.
5151
5152 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5153
5154         * codegen.cs: remove stack for the ec flow branching.
5155         It is already a linked list, so no need.
5156
5157 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
5158
5159         * Makefile: Allow custom profiler here.
5160
5161 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
5162
5163         * typemanager.cs (LookupType):
5164           - Use a static char [], because split takes
5165             a param array for args, so it was allocating
5166             every time.
5167           - Do not store true in a hashtable, it boxes.
5168
5169 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
5170
5171         * flowanalysis.cs: bytify common enums.
5172
5173 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5174
5175         * modifiers.cs: Add a new set of flags for the
5176         flags allowed on explicit interface impls.
5177         * cs-parser.jay: catch the use of modifiers in
5178         interfaces correctly.
5179         * class.cs: catch private void IFoo.Blah ().
5180
5181         All related to bug #50572.
5182
5183 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5184
5185         * decl.cs: Rewrite the consistant accessability checking.
5186         Accessability is not linear, it must be implemented in
5187         a tableish way. Fixes #49704.
5188
5189 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5190
5191         * expression.cs: Handle negation in a checked context.
5192         We must use subtraction from zero. Fixes #38674.
5193
5194 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5195
5196         * class.cs: Ignore static void main in DLLs.
5197         * rootcontext.cs: Handle the target type here,
5198         since we are have to access it from class.cs
5199         * driver.cs: account for the above.
5200
5201 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5202
5203         * report.cs: Give line numbers and files if available.
5204
5205 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
5206
5207         * driver.cs: Implement /addmodule.
5208
5209         * typemanager.cs:  Change 'modules' field so it now contains Modules not
5210         ModuleBuilders.
5211
5212 2003-12-20  Martin Baulig  <martin@ximian.com>
5213
5214         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
5215         (FieldBase.IsAssigned): Removed this field.
5216         (FieldBase.SetAssigned): New public method.
5217         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
5218
5219 2003-12-20  Martin Baulig  <martin@ximian.com>
5220
5221         * expression.cs (LocalVariableReference.DoResolve): Don't set
5222         `vi.Used' if we're called from DoResolveLValue().
5223
5224         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
5225         returns the usage vector it just merged into the current one -
5226         pass this one to UsageWarning().
5227         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
5228         of the `EmitContext', don't call this recursively on our children.
5229
5230 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
5231
5232         * driver.cs: Implement /target:module.
5233
5234 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
5235
5236         * support.cs (CharArrayHashtable): New helper class.
5237
5238         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
5239         char arrays, not strings, so we can avoid creating a string in
5240         consume_identifier if the identifier is a keyword.
5241
5242 2003-12-16  Martin Baulig  <martin@ximian.com>
5243
5244         * statement.cs (LocalInfo.Assigned): Removed this property.
5245         (LocalInfo.Flags): Removed `Assigned'.
5246         (LocalInfo.IsAssigned): New public method; takes the EmitContext
5247         and uses flow analysis.
5248         (Block.UsageWarning): Made this method private.
5249         (Block.Resolve): Call UsageWarning() if appropriate.
5250
5251         * expression.cs (LocalVariableReference.DoResolve): Always set
5252         LocalInfo.Used here.
5253
5254 2003-12-13  Martin Baulig  <martin@ximian.com>
5255
5256         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
5257         any value here; we're now using flow analysis to figure out
5258         whether a statement/block returns a value.
5259
5260 2003-12-13  Martin Baulig  <martin@ximian.com>
5261
5262         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
5263         working again.
5264         (FlowBranching.MergeFinally): Don't call
5265         `branching.CheckOutParameters()' here, this is called in
5266         MergeTopBlock().
5267         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
5268         when adding the `finally' vector.       
5269
5270 2003-12-13  Martin Baulig  <martin@ximian.com>
5271
5272         * flowanalysis.cs
5273         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
5274         actually work and also fix #48962.
5275
5276 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
5277
5278         * decl.cs: Do not check System.Object for nested types,
5279         since we know it does not have any. Big bang for buck:
5280
5281         BEFORE:
5282            Run 1:   8.35 seconds
5283            Run 2:   8.32 seconds
5284            corlib:  17.99 seconds
5285         AFTER:
5286            Run 1:   8.17 seconds
5287            Run 2:   8.17 seconds
5288            corlib:  17.39 seconds
5289
5290 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
5291
5292         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
5293         time we are returning 0 members, so we save alot here.
5294
5295 2003-12-11  Martin Baulig  <martin@ximian.com>
5296
5297         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
5298         `MergeChild()', also just take the `FlowBranching' as argument;
5299         call Merge() on it and return the result.
5300         (FlowBranching.Merge): We don't need to do anything if we just
5301         have one sibling.
5302
5303 2003-12-11  Martin Baulig  <martin@ximian.com>
5304
5305         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
5306         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
5307         Maurer for this idea.
5308
5309 2003-12-11  Martin Baulig  <martin@ximian.com>
5310
5311         * flowanalysis.cs (MergeResult): This class is now gone; we now
5312         use the `UsageVector' for this.  The reason for this is that if a
5313         branching just has one sibling, we don't need to "merge" them at
5314         all - that's the next step to do.
5315         (FlowBranching.Merge): We now return a `UsageVector' instead of a
5316         `MergeResult'.
5317
5318 2003-12-11  Martin Baulig  <martin@ximian.com>
5319
5320         Reworked flow analyis and made it more precise and bug-free.  The
5321         most important change is that we're now using a special `Reachability'
5322         class instead of having "magic" meanings of `FlowReturns'.  I'll
5323         do some more cleanups and optimizations and also add some more
5324         documentation this week.
5325
5326         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
5327         largely reworked this class.
5328         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
5329         the new `Reachability' class instead of having "magic" values here.
5330         (FlowBranching): We're now using an instance of `Reachability'
5331         instead of having separate `Returns', `Breaks' etc. fields.
5332
5333         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
5334         based on flow analysis; ignore the return value of block.Emit ().
5335
5336 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
5337
5338         * driver.cs typemanager.cs: Find the mono extensions to corlib even
5339         if they are private.
5340
5341 2003-12-09  Martin Baulig  <martin@ximian.com>
5342
5343         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
5344         call them directly on the UsageVector.
5345
5346 2003-12-09  Martin Baulig  <martin@ximian.com>
5347
5348         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
5349         Changed return type from `FlowReturns' to `Reachability'.
5350
5351 2003-12-09  Martin Baulig  <martin@ximian.com>
5352
5353         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
5354         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
5355         `Reachable' fields with a single `Reachability' one.
5356
5357 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5358
5359         * class.cs (FindMembers): Remove foreach's.
5360
5361         Bootstrap times:
5362
5363         BEFORE
5364                 Run 1:   8.74 seconds
5365                 Run 2:   8.71 seconds
5366
5367         AFTER
5368                 Run 1:   8.64 seconds
5369                 Run 2:   8.58 seconds
5370
5371
5372 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5373
5374         * cs-parser.jay:
5375         * gen-treedump.cs:
5376         * statement.cs:
5377         This patch does a few things:
5378                 1. EmptyStatement is now a singleton, so it is never reallocated.
5379                 2. All blah is EmptyStatement constructs have been changed to
5380                    blah == EmptyStatement.Value, which is much faster and valid
5381                    now that EmptyStatement is a singleton.
5382                 3. When resolving a block, rather than allocating a new array for
5383                    the non-empty statements, empty statements are replaced with
5384                    EmptyStatement.Value
5385                 4. Some recursive functions have been made non-recursive.
5386         Mainly the performance impact is from (3), however (1) and (2) are needed for
5387         this to work. (4) does not make a big difference in normal situations, however
5388         it makes the profile look saner.
5389
5390         Bootstrap times:
5391
5392         BEFORE
5393         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5394         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5395         Total memory allocated: 56397 KB
5396
5397         AFTER
5398         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
5399         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
5400         Total memory allocated: 55666 KB
5401
5402 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5403
5404         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
5405         than the hashtable in a hashtable version
5406
5407         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
5408         we always end up concating a string. This results in a huge perf
5409         loss, because many strings have to be tracked by the GC. In this
5410         patch, we first use a hashtable that works with two keys, so that
5411         the strings do not need to be concat'ed.
5412
5413         Bootstrap times:
5414         BEFORE
5415                 Run 1:   8.74 seconds
5416                 Run 2:   8.71 seconds
5417
5418         AFTER
5419                 Run 1:   8.65 seconds
5420                 Run 2:   8.56 seconds
5421
5422 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5423
5424         * Makefile: Add a new target `do-time' that does a quick and simple
5425         profile, leaving easy to parse output.
5426
5427 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
5428
5429         * codegen.cs (Init): Create the dynamic assembly with 
5430         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
5431
5432 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5433
5434         * support.cs: Make the PtrHashtable use only one
5435         instance of its comparer.
5436
5437 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
5438
5439         * typemanager.cs: Fix lookup of GetNamespaces.
5440
5441 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
5442
5443         * expression.cs: Removed redundant line.
5444
5445         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
5446         ArrayLists, use for loops with bounds.  
5447
5448         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
5449         arraylist.
5450
5451         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
5452         arraylists, use for loop with bounds.
5453
5454         The above three changes give us a 0.071 second performance
5455         improvement out of 3.294 seconds down to 3.223.  On my machine
5456         the above changes reduced the memory usage by 1,387 KB during
5457         compiler bootstrap.
5458
5459         * cs-parser.jay (QualifiedIdentifier): New class used to represent
5460         QualifiedIdentifiers.  Before we created a new string through
5461         concatenation, and mostly later on, the result would be
5462         manipulated by DecomposeQI through string manipulation.
5463
5464         This reduced the compiler memory usage for bootstrapping from
5465         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
5466         compile times in 0.05 seconds.
5467
5468 2003-11-28  Dick Porter  <dick@ximian.com>
5469
5470         * support.cs: Do string compares with the Invariant culture.
5471
5472         * rootcontext.cs: 
5473         * gen-treedump.cs: 
5474         * expression.cs: 
5475         * driver.cs: 
5476         * decl.cs: 
5477         * codegen.cs: 
5478         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
5479         the comparison is done with the Invariant culture.
5480
5481 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
5482
5483         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
5484         GetEnumerator method.
5485
5486         (ProbeCollectionType): Iterate starting at the most specific type
5487         upwards looking for a GetEnumerator
5488
5489         * expression.cs: Shift count can be up to 31 for int/uint and 63
5490         for long/ulong.
5491
5492 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
5493
5494         * statement.cs (Block.LookupLabel): Also look for the label on the
5495         children blocks.  Use a hash table to keep track of visited
5496         nodes. 
5497
5498         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
5499         we actually did transform the other operand, otherwise fall back
5500         to the common codepath that casts to long.
5501
5502         * cs-tokenizer.cs: Use the same code pattern as the int case.
5503         Maybe I should do the parsing myself, and avoid depending on the
5504         Parse routines to get this done.
5505
5506 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
5507
5508         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5509         which fixes bug 51347.  This time test it.
5510
5511         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
5512         attributes for example can not tell the difference between these.
5513         The difference was only a syntax feature of the language. 
5514
5515         * attribute.cs: Apply attributes to delegates.
5516
5517         * delegate.cs: Call the apply attributes method.
5518
5519 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
5520
5521         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
5522         comparing 0 vs Byte.MinValue, not the value
5523
5524         (ImplicitConversionRequired): When reporting a conversion error,
5525         use error 31 to print out the constant error instead of the
5526         simpler 29.
5527
5528         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5529         which fixes bug 51347.
5530
5531 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
5532
5533         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
5534         which fixes the -warnaserror command line option.
5535
5536 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
5537
5538         * cfold.cs (DoNumericPromotions): During constant folding of
5539         additions on UIntConstant, special case intconstants with
5540         IntConstants like we do on the expression binary operator. 
5541
5542 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
5543
5544         * convert.cs (ImplicitReferenceConversion): We were missing a case
5545         (System.Enum are not value types or class types, so we need to
5546         classify them separatedly).
5547
5548         * driver.cs: We do not support error 2007.
5549
5550 2003-11-12 Jackson Harper <jackson@ximian.com>
5551
5552         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
5553         system directory. Also use the full file name so users can
5554         libraries names mscorlib-o-tron.dll in a non system dir.
5555
5556 2003-11-10  Martin Baulig  <martin@ximian.com>
5557
5558         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
5559         (TypeManager.InitCoreTypes): Initialize them here, but instead of
5560         calling `ResolveType()' on them, directly assign their `Type'.
5561
5562 2003-11-08  Martin Baulig  <martin@ximian.com>
5563
5564         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
5565         return value and the `out parent' parameter.
5566         (TypeContainer.DefineType): Moved the CS0644 check into
5567         GetClassBases().  Don't pass the interface types to the
5568         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
5569         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
5570
5571         * ecore.cs (TypeExpr.IsAttribute): New property.
5572         (TypeExpr.GetInterfaces): New method.
5573
5574         * interface.cs (Interface.GetInterfaceTypeByName): Return a
5575         TypeExpr instead of a Type.
5576         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
5577         (Interface.DefineType): Don't pass the interface types to the
5578         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
5579         them later and then call `TypeBulider.AddInterfaceImplementation()'.
5580
5581         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
5582         instead of a `Type[]'.
5583         (TypeManager.RegisterBuilder): Likewise.
5584         (TypeManager.AddUserInterface): Likewise.
5585         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
5586         `Type[]' and also return a `TypeExpr[]'.
5587         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
5588
5589 2003-11-08  Martin Baulig  <martin@ximian.com>
5590
5591         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
5592         Expression.     
5593
5594 2003-11-08  Martin Baulig  <martin@ximian.com>
5595
5596         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
5597         TypeManager.ResolveExpressionTypes().
5598
5599         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
5600         instead of an Expression.
5601         (TypeExpr): This is now an abstract base class for `TypeExpression'.
5602         (TypeExpression): New public class; formerly known as `TypeExpr'.
5603
5604         * expression.cs (ComposedCast): Derive from TypeExpr.
5605
5606         * typemanager.cs (TypeManager.system_*_expr): These are now
5607         TypExpr's instead of Expression's.
5608         (TypeManager.ResolveExpressionTypes): New public static function;
5609         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
5610         of them.        
5611
5612 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
5613
5614         * expression.cs (New.DoResolve): Do not dereference value that
5615         might be a null return.
5616
5617         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
5618         sure that the constant value has the right type.  Fixes an
5619         unreported bug, similar to 50425.
5620
5621         * const.cs (Const.LookupConstantValue): Call
5622         ImplicitStandardConversionExists before doing a conversion to
5623         avoid havng the TypeManager.ChangeType do conversions.
5624
5625         Reduced the number of casts used
5626
5627         (Const.ChangeType): New routine to enable reuse of the constant
5628         type changing code from statement.
5629
5630         * typemanager.cs (ChangeType): Move common initialization to
5631         static global variables.
5632
5633         Fixes #50425.
5634
5635         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
5636         every value type to go through, even if it was void.  Fix that. 
5637
5638         * cs-tokenizer.cs: Use is_identifier_start_character on the start
5639         character of the define, and the is_identifier_part_character for
5640         the rest of the string.
5641
5642 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
5643
5644         * expression.cs (UnaryMutator.EmitCode): When I updated
5645         LocalVariableReference.DoResolve, I overdid it, and dropped an
5646         optimization done on local variable references.
5647
5648 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
5649
5650         * ecore.cs: Convert the return from Ldlen into an int.
5651
5652 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
5653
5654         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
5655         the accessibility, this is a special case for toplevel non-public
5656         classes (internal for instance).
5657
5658 2003-10-20  Nick Drochak <ndrochak@gol.com>
5659
5660         * ecore.cs: Fix typo and build.  Needed another right paren.
5661
5662 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
5663
5664         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
5665         `internal' case regular and protected, but not allowing protected
5666         to be evaluated later.  Bug 49840
5667
5668 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
5669
5670         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
5671         to kb.Nlast, and not the kb.nFirst to isolate the switch
5672         statement.
5673
5674         Extract the underlying type, so enumerations of long/ulong are
5675         treated like long/ulong.
5676
5677 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
5678
5679         * expression.cs (New): Overload the meaning of RequestedType to
5680         track the possible creation of the NewDelegate type, since
5681         DoResolve is invoked more than once for new constructors on field
5682         initialization.
5683
5684         See bugs: #48800 and #37014
5685
5686         * cs-parser.jay (declare_local_constants): Take an arraylist
5687         instead of a single constant.
5688
5689         (local_constant_declaration): It should take a
5690         constant_declarators, not a constant_declarator.  Fixes 49487
5691
5692         * convert.cs: Fix error report.
5693
5694 2003-10-13 Jackson Harper <jackson@ximian.com>
5695
5696         * typemanager.cs (TypeToCoreType): Add float and double this fixes
5697         bug #49611
5698
5699 2003-10-09  Martin Baulig  <martin@ximian.com>
5700
5701         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
5702         to the .ctor.
5703         (MethodCore.DoDefineParameters): Removed the TypeContainer
5704         argument; use the DeclSpace which was passed to the .ctor instead.
5705         (MethodCore.CheckParameter): Take a DeclSpace instead of a
5706         TypeContainer; we only need a DeclSpace here.
5707
5708 2003-10-09  Martin Baulig  <martin@ximian.com>
5709
5710         * class.cs (MethodData): Added additional `DeclSpace ds' argument
5711         to the .ctor.
5712         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
5713         EmitContext's .ctor.    
5714
5715 2003-10-09  Martin Baulig  <martin@ximian.com>
5716
5717         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
5718         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
5719         AsAccessible(), moved them as well.
5720
5721         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
5722
5723 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5724
5725         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5726
5727 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
5728
5729         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
5730         generation for >=, as spotted by Paolo, bug 48679.  
5731         Patch from David Waite.
5732
5733         * cs-tokenizer.cs: Add handling for #pragma.
5734
5735         * cs-parser.jay: Allow for both yield and yield return in the
5736         syntax.  The anti-cobolization of C# fight will go on!
5737
5738         * class.cs (TypeBuilder.DefineType): Catch error condition here
5739         (Parent.DefineType erroring out and returning null).
5740
5741         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5742         coping with enumerations variables, we were mistakenly processing
5743         them as a regular value type instead of built-in types.  Fixes the
5744         bug #48063
5745
5746         * typemanager.cs (IsBuiltinOrEnum): New method.
5747
5748 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5749
5750         * cs-parser.jay: Upgrade: yield now needs the return clause.
5751
5752 2003-09-19  Martin Baulig  <martin@ximian.com>
5753
5754         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5755         `MemberCache parent' argument.  Normally, an interface doesn't
5756         have a parent type except System.Object, but we use this in gmcs
5757         for generic type parameters.
5758
5759 2003-09-18  Martin Baulig  <martin@ximian.com>
5760
5761         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5762         on `type.IsInterface'; don't check whether the type has a parent
5763         to determine whether it's an interface.
5764
5765 2003-09-15  Martin Baulig  <martin@ximian.com>
5766
5767         * class.cs (TypeContainer.DefineType): Added an error flag to
5768         avoid reporting duplicate CS0146's ("class definition is
5769         circular.").
5770
5771         * driver.cs (Driver.MainDriver): Abort if
5772         RootContext.ResolveTree() reported any errors.
5773
5774 2003-09-07  Martin Baulig  <martin@ximian.com>
5775
5776         * report.cs (Error, Warning): Added overloaded versions which take
5777         a `params object[] args' and call String.Format().
5778
5779 2003-09-07  Martin Baulig  <martin@ximian.com>
5780
5781         * decl.cs (DeclSpace..ctor): Don't call
5782         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5783         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5784         (DeclSpace.RecordDecl): New method.
5785
5786         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5787
5788 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5789
5790         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5791         value attributes to be applied to ParameterBuilders.
5792
5793         * class.cs (MethodCore.LabelParameters): Make static and more
5794         generic so that it can be used from other places - like interface
5795         methods, for instance.
5796
5797         * interface.cs (Interface.Emit): Call LabelParameters before
5798         emitting attributes on the InterfaceMethod.
5799
5800 2003-08-26  Martin Baulig  <martin@ximian.com>
5801
5802         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5803         resolving aliases; fixes #47927.
5804
5805 2003-08-26  Martin Baulig  <martin@ximian.com>
5806
5807         * statement.cs (Using.DoResolve): This is internally emitting a
5808         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5809         do not always return.  Fixes #47681.
5810
5811 2003-08-26  Martin Baulig  <martin@ximian.com>
5812
5813         * decl.cs (MemberCore): Moved WarningNotHiding(),
5814         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5815         into MemberBase.
5816         (AdditionResult): Make this nested in DeclSpace.
5817         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5818         argument; call NamespaceEntry.Define() unless we're nested in a
5819         class or struct.
5820
5821         * namespace.cs (Namespace.DefineName): New public function.  This
5822         is called from DeclSpace's .ctor to add 
5823         (Namespace.Lookup): Include DeclSpaces in the lookup.
5824
5825         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5826
5827         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5828
5829 2003-08-25  Martin Baulig  <martin@ximian.com>
5830
5831         * convert.cs (Convert.ExplicitReferenceConversion): When
5832         converting from an interface type to a class, unbox if the target
5833         type is a struct type.  Fixes #47822.
5834
5835 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5836
5837         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5838         #47854.
5839
5840 2003-08-22  Martin Baulig  <martin@ximian.com>
5841
5842         * class.cs (TypeManager.DefineType): When defining a nested type,
5843         call DefineType() on our parent; fixes #47801.
5844
5845 2003-08-22  Martin Baulig  <martin@ximian.com>
5846
5847         * class.cs (MethodData.Define): While checking if a method is an
5848         interface implementation, improve the test a bit more to fix #47654.
5849
5850 2003-08-22  Martin Baulig  <martin@ximian.com>
5851
5852         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5853         correctly; fixes #47722.
5854
5855 2003-08-22  Martin Baulig  <martin@ximian.com>
5856
5857         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5858         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5859
5860         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
5861
5862 2003-08-22  Martin Baulig  <martin@ximian.com>
5863
5864         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
5865         can only be assigned in static constructors.  Fixes #47161.
5866
5867 2003-08-22  Martin Baulig  <martin@ximian.com>
5868
5869         Rewrote and improved the flow analysis code.
5870
5871         * flowbranching.cs (FlowBranching): Make this class abstract.
5872         (FlowBranching.CreateBranching): New static function to create a
5873         new flow branching.
5874         (FlowBranchingBlock, FlowBranchingException): New classes.
5875         (FlowBranching.UsageVector.Type): New public readonly field.
5876         (FlowBranching.UsageVector.Breaks): Removed the setter.
5877         (FlowBranching.UsageVector.Returns): Removed the setter.
5878         (FlowBranching.UsageVector): Added Break(), Return(),
5879         NeverReachable() and Throw() methods to modify the reachability.
5880         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
5881         done by FlowBranching.Merge().
5882         (FlowBranching.UsageVector.MergeChild): New method; merges the
5883         merge result into the current vector.
5884         (FlowBranching.Merge): New abstract method to merge a branching.
5885
5886 2003-08-12  Martin Baulig  <martin@ximian.com>
5887
5888         * expression.cs (Indirection.CacheTemporaries): Create the
5889         LocalTemporary with the pointer type, not its element type.
5890
5891 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
5892
5893         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
5894         token was a keyword or not.
5895
5896         Add `error' options where an IDENTIFIER was expected;  Provide
5897         CheckToken and CheckIdentifierToken convenience error reporting
5898         functions. 
5899
5900         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
5901
5902         * decl.cs: Rename `NamespaceEntry Namespace' public field into
5903         NameSpaceEntry NameSpaceEntry.
5904
5905         (LookupInterfaceOrClass): Avoid creating a full qualified name
5906         from namespace and name: avoid doing lookups when we know the
5907         namespace is non-existant.   Use new Tree.LookupByNamespace which
5908         looks up DeclSpaces based on their namespace, name pair.
5909
5910         * driver.cs: Provide a new `parser verbose' to display the
5911         exception thrown during parsing.  This is turned off by default
5912         now, so the output of a failure from mcs is more graceful.
5913
5914         * namespace.cs: Track all the namespaces defined in a hashtable
5915         for quick lookup.
5916
5917         (IsNamespace): New method
5918
5919 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
5920
5921         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
5922         we know that we need to concatenate (full typename can never be
5923         null). 
5924
5925         * class.cs: ditto.
5926
5927         * statement.cs: Use a bitfield;  Do not initialize to null things
5928         which are done by the constructor by default.
5929
5930         * cs-parser.jay: bug fix, parameter was 4, not 3.
5931
5932         * expression.cs: Just use the property;
5933
5934         * statement.cs: No need for GetVariableInfo method.
5935
5936 2003-08-08  Martin Baulig  <martin@ximian.com>
5937
5938         * flowanalysis.cs (FlowReturns): This is now nested in the
5939         `FlowBranching' class.
5940         (MyBitVector): Moved this here from statement.cs.
5941         (FlowBranching.SiblingType): New enum type.
5942         (FlowBranching.CreateSibling): Added `SiblingType' argument.
5943
5944 2003-08-07  Martin Baulig  <martin@ximian.com>
5945
5946         * flowanalysis.cs (FlowBranchingType): This is now nested in the
5947         `FlowBranching' class and called `BranchingType'.
5948
5949 2003-08-07  Martin Baulig  <martin@ximian.com>
5950
5951         * flowanalysis.cs: Moved all the control flow analysis code into
5952         its own file.
5953
5954 2003-08-07  Martin Baulig  <martin@ximian.com>
5955
5956         * assign.cs (Assign.DoResolve): `target' must either be an
5957         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
5958         #37319.
5959
5960 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
5961
5962         * expression.cs (BinaryMethod): This kind of expression is created by the
5963         Binary class if it determines that the operator has to be handled
5964         by a method.
5965
5966         (BinaryDelegate): This kind of expression is created if we are
5967         dealing with a + or - operator on delegates.
5968
5969         (Binary): remove method, argumetns, and DelegateOperator: when
5970         dealing with methods, 
5971
5972         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
5973
5974         * statement.cs (Block): use bitfields for the three extra booleans
5975         we had in use.   Remove unused topblock parameter.
5976
5977         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
5978
5979         * assign.cs: Drop extra unneeded tests.
5980
5981 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
5982
5983         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
5984
5985         * statement.cs (Foreach): Use VariableStorage instead of
5986         LocalBuilders.   
5987
5988         * codegen.cs (VariableStorage): New class used by clients that
5989         require a variable stored: locals or fields for variables that
5990         need to live across yield.
5991
5992         Maybe provide a convenience api for EmitThis+EmitLoad?
5993
5994         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5995         these bad boys.
5996
5997 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5998
5999         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
6000         RemapParameterLValue): New methods that are used to turn a
6001         precomputed FieldInfo into an expression like this:
6002
6003                 instance.FieldInfo
6004
6005         The idea is to use this instead of making LocalVariableReference
6006         have more than one meaning.
6007
6008         * cs-parser.jay: Add error production to BASE.
6009
6010         * ecore.cs: Deal with TypeManager.GetField returning null, which
6011         is now a valid return value.
6012
6013         (FieldExprNoAddress): New expression for Fields whose address can
6014         not be taken.
6015
6016         * expression.cs (LocalVariableReference): During the resolve
6017         phases, create new expressions if we are in a remapping context.
6018         Remove code that dealt with remapping here.
6019
6020         (ParameterReference): same.
6021
6022         (ProxyInstance): New expression, like the `This' expression, but
6023         it is born fully resolved.  We know what we are doing, so remove
6024         the errors that are targeted to user-provided uses of `this'.
6025
6026         * statement.cs (Foreach): our variable is now stored as an
6027         Expression;  During resolution, follow the protocol, dont just
6028         assume it will return this.
6029
6030 2003-08-06  Martin Baulig  <martin@ximian.com>
6031
6032         * support.cs (SeekableStreamReader.cs): New public class.
6033
6034         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
6035         SeekableStreamReader instead of the normal StreamReader.
6036
6037 2003-08-04  Martin Baulig  <martin@ximian.com>
6038
6039         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
6040         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
6041         deambiguate casts and delegate invocations.
6042         (parenthesized_expression): Use the new tokens to ensure this is
6043         not a cast of method invocation.
6044
6045         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
6046         when reading a `)' and Deambiguate_CloseParens () was previously
6047         called.
6048
6049         * expression.cs (ParenthesizedExpression): New class.  This is
6050         just used for the CS0075 test.
6051         (Binary.DoResolve): Check for CS0075.   
6052
6053 2003-07-29  Ravi Pratap  <ravi@ximian.com>
6054
6055         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
6056         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
6057         reference comparison.
6058
6059         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
6060         examine the ReturnType for equality - this is necessary in the
6061         cases of implicit and explicit operators whose signature also
6062         includes the return type.
6063
6064 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
6065
6066         * namespace.cs: Cache the result of the namespace computation,
6067         instead of computing it every time.
6068
6069 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
6070
6071         * decl.cs: Use a global arraylist that we reuse over invocations
6072         to avoid excesive memory consumption.  Reduces memory usage on an
6073         mcs compile by one meg (45 average).
6074
6075         * typemanager.cs (LookupTypeReflection): In .NET pointers are
6076         private, work around that.
6077
6078 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
6079
6080         * literal.cs (IntLiteral): Define Zero and One static literals. 
6081
6082         * cs-parser.jay (integer_literal): use static literals to reduce
6083         memory usage for the most used literals (0, 1 and -1).  211kb
6084         reduced in memory usage.
6085
6086         Replace all calls to `new ArrayList' with `new
6087         ArrayList(4)' which is a good average number for most allocations,
6088         and also requires only 16 bytes of memory for its buffer by
6089         default. 
6090
6091         This reduced MCS memory usage in seven megabytes for the RSS after
6092         bootstrapping.
6093
6094 2003-07-28  Ravi Pratap  <ravi@ximian.com>
6095
6096         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
6097         handle params methods the correct way by forming only one
6098         applicable set with params and normal methods in them. Earlier we
6099         were looking at params methods only if we found no normal methods
6100         which was not the correct thing to do.
6101
6102         (Invocation.BetterFunction): Take separate arguments indicating
6103         when candidate and the best method are params methods in their
6104         expanded form.
6105
6106         This fixes bugs #43367 and #46199.
6107
6108         * attribute.cs: Documentation updates.
6109
6110         (CheckAttribute): Rename to CheckAttributeTarget.
6111         (GetValidPlaces): Rename to GetValidTargets.
6112
6113         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
6114         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
6115
6116         Fixes bug #44468.
6117
6118 2003-07-28  Martin Baulig  <martin@ximian.com>
6119
6120         * class.cs (TypeContainer.DefineMembers): Use the base type's full
6121         name when looking up the base class of a nested class.  Fixes #46977.
6122
6123 2003-07-26  Martin Baulig  <martin@ximian.com>
6124
6125         * expression.cs (Indexers.Indexer): New nested struct; contains
6126         getter, setter and the indexer's type.
6127         (Indexers.Properties): This is now an ArrayList of
6128         Indexers.Indexer's.
6129         (IndexerAccess.DoResolveLValue): Correctly set the type if the
6130         indexer doesn't have any getters.
6131
6132         * assign.cs (Assign.DoResolve): Also do the implicit conversions
6133         for embedded property and indexer assignments.
6134
6135 2003-07-26  Martin Baulig  <martin@ximian.com>
6136
6137         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
6138         preprocessor directive is not the first non-whitespace character
6139         on a line.
6140
6141 2003-07-26  Martin Baulig  <martin@ximian.com>
6142
6143         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
6144         namespace parsing, follow the spec more closely.
6145
6146         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
6147         NamespaceEntry.Lookup().
6148
6149 2003-07-25  Martin Baulig  <martin@ximian.com>
6150
6151         * MethodCore.cs (OverridesSomething): New public field; it's set
6152         from TypeContainer.DefineMembers if this method overrides
6153         something (which doesn't need to be a method).  Fix #39462.
6154
6155 2003-07-25  Ravi Pratap  <ravi@ximian.com>
6156
6157         * typemanager.cs (GetMembers): Ensure that the list of members is
6158         reversed. This keeps things in sync.
6159
6160         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
6161         find an AttributeUsage attribute.
6162
6163         * expression.cs (Invocation.OverloadResolve): Perform the check
6164         which disallows Invoke to be directly called on a Delegate.
6165
6166         (Error_InvokeOnDelegate): Report error cs1533.
6167
6168 2003-07-25  Martin Baulig  <martin@ximian.com>
6169
6170         * expression.cs (Indexers.GetIndexersForType): Only look in the
6171         interface hierarchy if the requested type is already an
6172         interface.  Fixes #46788 while keeping #46502 fixed.
6173
6174 2003-07-25  Martin Baulig  <martin@ximian.com>
6175
6176         * class.cs (TypeContainer.DefineMembers): Check whether all
6177         readonly fields have been assigned and report warning CS0649 if
6178         not.
6179
6180         * statement.cs (LocalInfo.IsFixed): Always return true if this is
6181         a valuetype.
6182
6183 2003-07-24  Ravi Pratap  <ravi@ximian.com>
6184
6185         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
6186         returned from GetMethods to make things consistent with the
6187         assumptions MCS makes about ordering of methods.
6188
6189         This should comprehensively fix bug #45127 and it does :-)
6190
6191         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
6192         ordering is actually reverse.
6193
6194         * Clean up some debug messages I left lying around.
6195
6196         * interface.cs (Populate*): Get rid of code which emits attributes
6197         since the stage in which we emit attributes is the 'Emit' stage,
6198         not the define stage.
6199
6200         (Emit): Move attribute emission for interface members here.
6201
6202 2003-07-22  Ravi Pratap  <ravi@ximian.com>
6203
6204         * expression.cs (Invocation.OverloadResolve): Follow the spec more
6205         closely: we eliminate methods in base types when we have an
6206         applicable method in a top-level type.
6207
6208         Please see section 14.5.5.1 for an exact description of what goes
6209         on. 
6210
6211         This fixes bug #45127 and a host of other related to corlib compilation.
6212
6213         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
6214         array is the method corresponding to the top-level type (this is
6215         because of the changes made to icall.c) so we change this
6216         accordingly.
6217
6218         (MethodGroupExpr.Name): This too.
6219
6220         * typemanager.cs (GetElementType): New method which does the right
6221         thing when compiling corlib. 
6222
6223         * everywhere: Make use of the above in the relevant places.
6224
6225 2003-07-22  Martin Baulig  <martin@ximian.com>
6226
6227         * cs-parser.jay (invocation_expression): Moved
6228         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
6229         `cast_expression', but create a InvocationOrCast which later
6230         resolves to either an Invocation or a Cast.
6231
6232         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
6233         method; call this before EmitStatement() to make sure that this
6234         expression can be used as a statement.
6235
6236         * expression.cs (InvocationOrCast): New class; resolves to either
6237         an Invocation or a Cast.
6238
6239         * statement.cs (StatementExpression): Call ResolveStatement() on
6240         the ExpressionStatement before emitting it.
6241
6242 2003-07-21  Martin Baulig  <martin@ximian.com>
6243
6244         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
6245         `ref' and `out' attributes match; fixes #46220.
6246         (MemberAccess.ResolveMemberAccess): You can't reference a type
6247         through an expression; fixes #33180.
6248         (Indexers.GetIndexersForType): Don't return the indexers from
6249         interfaces the class implements; fixes #46502.
6250
6251 2003-07-21  Martin Baulig  <martin@ximian.com>
6252
6253         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
6254         CS0661 checks; fixes bug #30442.
6255
6256 2003-07-21  Martin Baulig  <martin@ximian.com>
6257
6258         * decl.cs (AdditionResult): Added `Error'.
6259
6260         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
6261
6262         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
6263         makes cs0031.cs actually work.
6264
6265 2003-07-20  Martin Baulig  <martin@ximian.com>
6266
6267         * namespace.cs: Fixed that bug which caused a crash when compiling
6268         the debugger's GUI.
6269
6270 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
6271
6272         * typemanager.cs (LookupTypeReflection): Never expose types which
6273         are NotPublic, NestedPrivate, NestedAssembly, or
6274         NestedFamANDAssem.  We used to return these, and later do a check
6275         that would report a meaningful error, but the problem is that we
6276         would not get the real match, if there was a name override.
6277
6278 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
6279
6280         * namespace.cs (Namespace, Name): Do not compute the namespace
6281         name dynamically, compute it in the constructor.  This reduced
6282         memory usage by 1697 KB.
6283
6284         * driver.cs: Use --pause to pause at the end.
6285
6286 2003-07-17  Peter Williams  <peter@newton.cx>
6287
6288         * Makefile: Change the name of the test target so that it doesn't
6289         conflict with the recursive test target.
6290
6291 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
6292
6293         * expression.cs (LocalVariableReference.Emit, EmitAssign,
6294         AddressOf): Do not use EmitThis, that was wrong, use the actual
6295         this pointer.
6296
6297 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
6298
6299         * class.cs (MethodData.Define): While checking if a method is an
6300         interface implementation, improve the test: If we are not public
6301         (use new test here: use the computed MethodAttributes directly,
6302         instead of the parsed modifier flags) check if the `implementing'
6303         method comes from an interface or not.
6304
6305         * pending.cs (VerifyPendingMethods): Slightly better error
6306         message.
6307
6308         * makefile: add test target that does the mcs bootstrap.
6309
6310 2003-07-16  Ravi Pratap  <ravi@ximian.com>
6311
6312         * interface.cs (Define): Do nothing here since there are no
6313         members to populate etc. Move the attribute emission out of here
6314         since this was just totally the wrong place to put it. Attribute
6315         application happens during the 'Emit' phase, not in the 'Define'
6316         phase.
6317
6318         (Emit): Add this method and move the attribute emission here
6319
6320         * rootcontext.cs (EmitCode): Call the Emit method on interface
6321         types too.
6322
6323 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6324
6325         * expression.cs (OverloadResolve): Report error only if Location
6326         is not 'Null' which means that there was a probe going on.
6327
6328 2003-07-14  Martin Baulig  <martin@ximian.com>
6329
6330         * expression.cs (ConditionalLogicalOperator): New public class to
6331         implement user defined conditional logical operators.
6332         This is section 14.11.2 in the spec and bug #40505.
6333
6334 2003-07-14  Martin Baulig  <martin@ximian.com>
6335
6336         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
6337
6338 2003-07-14  Martin Baulig  <martin@ximian.com>
6339
6340         * codegen.cs (EmitContext.InFixedInitializer): New public field.
6341
6342         * ecore.cs (IVariable.VerifyFixed): New interface method.
6343
6344         * expression.cs (Unary.ResolveOperator): When resolving the `&'
6345         operator, check whether the variable is actually fixed.  Fixes bug
6346         #36055.  Set a variable definitely assigned when taking its
6347         address as required by the spec.
6348
6349         * statement.cs (LocalInfo.IsFixed): New field.
6350         (LocalInfo.MakePinned): Set `IsFixed' to true.
6351
6352 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6353
6354         * attribute.cs (Attribute.Resolve): While doing a Member lookup
6355         for .ctors, ensure that we only ask for members declared in the
6356         attribute type (BindingFlags.DeclaredOnly).
6357
6358         Fixes bug #43632.
6359
6360         * expression.cs (Error_WrongNumArguments): Report error 1501
6361         correctly the way CSC does.
6362
6363 2003-07-13  Martin Baulig  <martin@ximian.com>
6364
6365         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
6366         lookup on the fully qualified name, to make things like "X.X" work
6367         where "X.X" is a fully qualified type name, but we also have a
6368         namespace "X" in the using list.  Fixes #41975.
6369
6370 2003-07-13  Martin Baulig  <martin@ximian.com>
6371
6372         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
6373         function. If we're a CompoundAssign, we need to create an embedded
6374         CompoundAssign, not an embedded Assign.
6375         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
6376         Fixes #45854.
6377
6378 2003-07-13  Martin Baulig  <martin@ximian.com>
6379
6380         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
6381         work to fix bug #46088.
6382
6383 2003-07-13  Ravi Pratap <ravi@ximian.com>
6384
6385         * class.cs (Operator.Emit): Do not emit attributes here - it is
6386         taken care of by the Method class that we delegate too. This takes
6387         care of bug #45876.
6388
6389 2003-07-10  Martin Baulig  <martin@ximian.com>
6390
6391         * expression.cs (TypeOfVoid): New class.
6392         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
6393
6394 2003-07-10  Martin Baulig  <martin@ximian.com>
6395
6396         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
6397         bug #35957.
6398
6399 2003-07-10  Martin Baulig  <martin@ximian.com>
6400
6401         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
6402         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
6403
6404         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
6405
6406         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
6407
6408 2003-07-10  Martin Baulig  <martin@ximian.com>
6409
6410         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
6411         of decimal.  Fixes #42850.
6412
6413         NOTE: I also fixed the created byte blob, but this doesn't work on
6414         the MS runtime and csc never produces any byte blobs for decimal
6415         arrays.
6416
6417 2003-07-10  Martin Baulig  <martin@ximian.com>
6418
6419         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
6420         structs; fixes #32068.
6421         (Block.AddChildVariableNames): Fixed #44302.
6422
6423 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6424
6425         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
6426
6427 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6428
6429         * attribute.cs: And this test is onger needed.
6430
6431 2003-07-08  Martin Baulig  <martin@ximian.com>
6432
6433         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
6434         inaccessible types.  Fixes #36313.
6435
6436         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
6437
6438         * namespace.cs (NamespaceEntry): Create implicit entries for all
6439         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
6440         implicit entries for N1.N2 and N1.
6441
6442 2003-07-08  Martin Baulig  <martin@ximian.com>
6443
6444         Rewrote the handling of namespaces to fix a lot of the issues
6445         wrt. `using' aliases etc.
6446
6447         * namespace.cs (Namespace): Splitted this class into a
6448         per-assembly `Namespace' and a per-file `NamespaceEntry'.
6449
6450         * typemanager.cs (TypeManager.IsNamespace): Removed.
6451         (TypeManager.ComputeNamespaces): Only compute namespaces from
6452         loaded assemblies here, not the namespaces from the assembly we're
6453         currently compiling.
6454
6455 2003-07-08  Martin Baulig  <martin@ximian.com>
6456
6457         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
6458
6459 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6460
6461         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
6462         already fixed it.  
6463
6464         I thought about the memory savings here, but LookupTypeReflection
6465         is used under already very constrained scenarios.  Compiling
6466         corlib or mcs only exposes one hit, so it would not really reduce
6467         any memory consumption.
6468
6469 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6470
6471         * typemanager.cs: fixes bug #45889 by only adding public types from
6472         other assemblies to the list of known types.
6473
6474 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6475
6476         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
6477         on the type we resolved.
6478
6479 2003-07-05  Martin Baulig  <martin@ximian.com>
6480
6481         * pending.cs (PendingImplementation.ParentImplements): Don't
6482         create the proxy if the parent is abstract.
6483
6484         * class.cs (TypeContainer.DefineIndexers): Process explicit
6485         interface implementations first.  Fixes #37714.
6486
6487 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
6488
6489         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
6490         defined recursively;  but since we modify the input parameters
6491         (left is set to `this' temporarily), we reset this value if the
6492         left_is_explicit is false, which gives the original semantics to
6493         the code.  
6494
6495         * literal.cs (NullPointer): new class used to represent a null
6496         literal in a pointer context.
6497
6498         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
6499         type is a pointer, use a NullPointer object instead of a
6500         NullLiteral.   Closes 43687
6501
6502         (ExplicitConversion): Convert pointer values using
6503         the conv opcode to the proper type.
6504
6505         * ecore.cs (New): change ValueTypeVariable property into a method,
6506         that returns whether the valuetype is suitable for being used.
6507
6508         * expression.cs (Binary.DoNumericPromotions): Only return if we
6509         the int constant was a valid uint, and we can return both left and
6510         right as uints.  If not, we continue processing, to trigger the
6511         type conversion.  This fixes 39018.
6512
6513         * statement.cs (Block.EmitMeta): During constant resolution, set
6514         the CurrentBlock property on the emitcontext, so that we resolve
6515         constants propertly.
6516
6517 2003-07-02  Martin Baulig  <martin@ximian.com>
6518
6519         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
6520         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
6521
6522         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
6523         than emitting it here.
6524
6525         * statement.cs: Fixed some more flow analysis bugs.
6526
6527 2003-07-02  Martin Baulig  <martin@ximian.com>
6528
6529         * class.cs (MethodData.Define): When implementing interface
6530         methods, set Final unless we're Virtual.
6531
6532         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
6533         check work for interface methods.
6534
6535 2003-07-01  Martin Baulig  <martin@ximian.com>
6536
6537         * ecore.cs (EmitContext.This): Replaced this property with a
6538         GetThis() method which takes a Location argument.  This ensures
6539         that we get the correct error location for a CS0188.
6540
6541 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
6542
6543         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
6544         ImplicitStandardConversion.
6545
6546         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
6547
6548 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
6549
6550         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
6551         optimization.
6552
6553 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
6554
6555         * class.cs (Constructor.Define): Turn off initlocals for unsafe
6556         constructors.
6557
6558         (MethodData.Define): Turn off initlocals for unsafe methods.
6559
6560 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
6561
6562         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
6563         complete;  Fixes #37521.
6564
6565         * delegate.cs: Use Modifiers.TypeAttr to compute the
6566         TypeAttributes, instead of rolling our own.  This makes the flags
6567         correct for the delegates.
6568
6569 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
6570
6571         * class.cs (Constructor.Define): Set the private flag for static
6572         constructors as well.
6573
6574         * cs-parser.jay (statement_expression): Set the return value to
6575         null, to avoid a crash when we catch an error.
6576
6577 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
6578
6579         * cs-parser.jay: Applied patch from Jackson that adds support for
6580         extern and unsafe modifiers to destructor declarations.
6581
6582         * expression.cs: Report error 21 if the user is trying to index a
6583         System.Array.
6584
6585         * driver.cs: Add an error message, suggested by the bug report.
6586
6587         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
6588         if we do not have a ": this ()" constructor initializer.  Fixes 45149
6589
6590 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
6591
6592         * namespace.cs: Add some information to reduce FAQs.
6593
6594 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
6595
6596         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
6597         underlying enumeration types.  Fixes #43915.
6598
6599         * expression.cs: Treat ushort/short as legal values to be used in
6600         bitwise operations.
6601
6602 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
6603
6604         * delegate.cs: transfer custom attributes for paramenters from
6605         the delegate declaration to Invoke and BeginInvoke.
6606
6607 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
6608
6609         * attribute.cs: handle custom marshalers and emit marshal info
6610         for fields, too.
6611
6612 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
6613
6614         * makefile.gnu: Added anonymous.cs to the compiler sources.
6615
6616 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
6617
6618         * iterators.cs: Change the name of the proxy class to include two
6619         underscores.
6620
6621         * cs-parser.jay: Update grammar to include anonymous methods.
6622
6623         * anonymous.cs: new file.
6624
6625 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6626
6627         * class.cs (Field.Define): Add missing test for pointers and
6628         safety. 
6629
6630 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6631
6632         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6633         we use the stobj opcode.
6634
6635         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6636         since it wasn't the correct fix. 
6637
6638         It still is puzzling that we are required to use stobj for IntPtr
6639         which seems to be a ValueType.
6640
6641 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6642
6643         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6644         during regular simple name resolution.   Now, the trick is that
6645         instead of returning for processing the simplename, we do a
6646         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6647         contextual lookup type).   If a match is found, return that, if
6648         not, return for further composition.
6649
6650         This fixes long-standing 30485.
6651
6652         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6653         using the address to initialize an object, do an Stobj instead of
6654         using the regular Stelem.
6655
6656         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6657         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6658         Because if we are a BaseIndexerAccess that value will be true.
6659         Fixes 43643.
6660
6661         * statement.cs (GotoCase.Resolve): Return after reporting an
6662         error, do not attempt to continue. 
6663
6664         * expression.cs (PointerArithmetic.Emit): If our operand is a
6665         long, convert our constants to match the operand before
6666         multiplying.  Convert to I type before adding.   Fixes 43670.
6667
6668 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6669
6670         * enum.cs (ImplicitConversionExists) : Rename to
6671         ImplicitEnumConversionExists to remove ambiguity. 
6672
6673         * ecore.cs (NullCast): New type of cast expression class which
6674         basically is very similar to EmptyCast with the difference being
6675         it still is a constant since it is used only to cast a null to
6676         something else
6677         (eg. (string) null)
6678
6679         * convert.cs (ImplicitReferenceConversion): When casting a null
6680         literal, we return a NullCast.
6681
6682         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6683         should be around anymore.
6684
6685         The renaming (reported was slightly wrong). Corrections:
6686
6687         ConvertImplicitStandard -> ImplicitConversionStandard
6688         ConvertExplicitStandard -> ExplicitConversionStandard
6689
6690         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6691         before passing them in !
6692
6693         * convert.cs (ImplicitConversionStandard): When comparing for
6694         equal expr and target types, ensure that expr is not a
6695         NullLiteral.
6696
6697         In general, we must not be checking (expr_type ==
6698         target_type) in the top level conversion methods
6699         (ImplicitConversion, ExplicitConversion etc). This checking is
6700         done in the methods that they delegate to.
6701
6702 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6703
6704         * convert.cs: Move Error_CannotConvertType,
6705         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6706         ImplicitNumericConversion, ImplicitConversionExists,
6707         ImplicitUserConversionExists, StandardConversionExists,
6708         FindMostEncompassedType, FindMostSpecificSource,
6709         FindMostSpecificTarget, ImplicitUserConversion,
6710         ExplicitUserConversion, GetConversionOperators,
6711         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6712         TryImplicitIntConversion, Error_CannotConvertImplicit,
6713         ConvertImplicitRequired, ConvertNumericExplicit,
6714         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6715         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6716         its own file.
6717
6718         Perform the following renames:
6719
6720         StandardConversionExists -> ImplicitStandardConversionExists
6721         ConvertImplicit -> ImplicitConversion
6722         ConvertImplicitStandard -> ImplicitStandardConversion
6723         TryImplicitIntConversion -> ImplicitIntConversion
6724         ConvertImplicitRequired -> ImplicitConversionRequired
6725         ConvertNumericExplicit -> ExplicitNumericConversion
6726         ConvertReferenceExplicit -> ExplicitReferenceConversion
6727         ConvertExplicit -> ExplicitConversion
6728         ConvertExplicitStandard -> ExplicitStandardConversion
6729
6730 2003-05-19  Martin Baulig  <martin@ximian.com>
6731
6732         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6733         (TypeInfo): Added support for structs having structs as fields.
6734
6735         * ecore.cs (FieldExpr): Implement IVariable.
6736         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6737         VariableInfo for the field.
6738
6739 2003-05-18  Martin Baulig  <martin@ximian.com>
6740
6741         * expression.cs (This.DoResolve): Report a CS0027 if we're
6742         emitting a field initializer.
6743
6744 2003-05-18  Martin Baulig  <martin@ximian.com>
6745
6746         * expression.cs (This.ResolveBase): New public function.
6747         (This.DoResolve): Check for CS0188.
6748
6749         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6750         This.Resolve().
6751
6752         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6753         `instance_expression' to null if we don't have any non-static
6754         methods.
6755
6756 2003-05-18  Martin Baulig  <martin@ximian.com>
6757
6758         Reworked the way how local variables and parameters are handled by
6759         the flow analysis code.
6760
6761         * statement.cs (TypeInfo, VariableMap): New public classes.
6762         (VariableInfo): New public class.  This is now responsible for
6763         checking whether a variable has been assigned.  It is used for
6764         parameters and local variables.
6765         (Block.EmitMeta): Take the InternalParameters as argument; compute
6766         the layout of the flow vectors here.
6767         (Block.LocalMap, Block.ParameterMap): New public properties.
6768         (FlowBranching): The .ctor doesn't get the InternalParameters
6769         anymore since Block.EmitMeta() now computes the layout of the flow
6770         vector.
6771         (MyStructInfo): This class is now known as `StructInfo' and nested
6772         in `TypeInfo'; we don't access this directly anymore.
6773
6774         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6775         property and removed IsAssigned(), IsFieldAssigned(),
6776         SetAssigned() and SetFieldAssigned(); we now call them on the
6777         VariableInfo so we don't need to duplicate this code everywhere.
6778
6779         * expression.cs (ParameterReference): Added `Block block' argument
6780         to the .ctor.
6781         (LocalVariableReference, ParameterReference, This): The new
6782         VariableInfo class is now responsible for all the definite
6783         assignment stuff.
6784
6785         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6786         IsParameterAssigned, SetParameterAssigned): Removed.
6787
6788 2003-05-18  Martin Baulig  <martin@ximian.com>
6789
6790         * typemanager.cs (InitCoreTypes): Try calling
6791         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6792         the 3-args-version.  Corlib now also needs our `void_type'.
6793         (GetMethod): Added overloaded version which takes an optional
6794         `bool report_errors' to allow lookups of optional methods.
6795
6796 2003-05-12  Martin Baulig  <martin@ximian.com>
6797
6798         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6799         only used for locals and not for parameters.
6800
6801 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6802
6803         * support.cs (InternalParameters.ParameterType): Return the
6804         ExternalType of the parameter.
6805
6806         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6807         they were unused.
6808
6809 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6810
6811         * class.cs (MethodData.Define): Do not set the `newslot' on
6812         interface members, if they are also flagged as "override".
6813
6814         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6815         better code for ++i and i++.  This only works for static fields
6816         and local variables.
6817
6818         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6819         want to pull the DeclSpace out of the builder_to_declspace instead
6820         of the TypeBuilder (like in TypeContainer.FindMembers).
6821
6822         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6823         instead of LookupTypeContainer.  Fixes the crash on .NET for
6824         looking up interface members.
6825
6826         * const.cs: Create our own emit context during the Definition
6827         stage, so that constants are evaluated in the proper context, when
6828         a recursive definition happens.
6829
6830 2003-05-11  Martin Baulig  <martin@ximian.com>
6831
6832         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6833         new block for a switch section.
6834         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6835         the adding/lookup in the switch block.  Fixes #39828.
6836
6837 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6838
6839         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6840         functionality: I needed to convert the data after I had performed
6841         the add/sub operation into the operands type size.
6842
6843         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6844         pass the type for the box operation, otherwise the resulting
6845         object would have been of type object.
6846
6847         (BoxedCast): Add constructor to specify the type to box as.
6848
6849 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6850
6851         * iterators.cs: I was reusing the `count' variable inadvertently,
6852         take steps to not allow this to happen.
6853
6854 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
6855
6856         * attribute.cs (Attribute.Resolve): Params attributes are encoded
6857         by creating an array at the point where the params starts and
6858         putting all those arguments there, then adjusting the size of the
6859         array.
6860
6861 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
6862
6863         * expression.cs (New.AddressOf): Implement interface
6864         IMemoryLocation.  This is used when the `new' operator is used in
6865         the context of an invocation to a method on a value type.
6866
6867         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
6868         example. 
6869
6870         * namespace.cs: Also check the using aliases here.
6871
6872         * driver.cs: Move the test for using validity after the types have
6873         been entered, so we do a single pass that also includes the using
6874         aliases. 
6875
6876         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
6877         in the regular case.   CreateSiblingForFinally is doing extra
6878         error checking.
6879
6880         * attribute.cs (GetAttributeArgumentExpression): Store the result
6881         on an out value, and use the return value to indicate failure
6882         instead of using null (which is a valid return for Constant.GetValue).
6883
6884         * statement.cs: Perform the analysis flow for the increment
6885         portion after the statement, because this will be the real flow of
6886         execution.  Fixes #42385
6887
6888         * codegen.cs (EmitContext.EmitArgument,
6889         EmitContext.EmitStoreArgument): New helper functions when the
6890         RemapToProxy flag is set.
6891
6892         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
6893         function.
6894
6895         Add support for remapping parameters. 
6896
6897         * iterators.cs: Propagate parameter values;  Store parameter
6898         values in the proxy classes.
6899
6900 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
6901
6902         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
6903         need a proxy reference;  I do not know what I was thinking
6904
6905         * cs-parser.jay (constructor_initializer): catch another error,
6906         and display nice message.
6907
6908         (field_declaration): catch void field declaration
6909         to flag a better error. 
6910
6911         * class.cs (MemberBase.CheckBase): Report an error instead of a
6912         warning if a new protected member is declared in a struct. 
6913         (Field.Define): catch the error of readonly/volatile.
6914
6915         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
6916
6917         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
6918         volatile variable is taken
6919
6920 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
6921
6922         * statement.cs (Fixed.Resolve): Report an error if we are not in
6923         an unsafe context.
6924
6925 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
6926
6927         * typemanager.cs: reuse the code that handles type clashes for
6928         delegates and enumerations.
6929
6930         * class.cs (Report28): Always report.
6931
6932         * expression.cs (EncodeAsAttribute): Allow nulls here.
6933
6934 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
6935
6936         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
6937         the functionality for testing whether an expression is valid for
6938         an attribute here.  Also handle the case of arrays of elements
6939         being stored. 
6940
6941         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
6942         encoding a linear array into an array of objects that are suitable
6943         to be passed to an CustomAttributeBuilder.
6944
6945         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
6946
6947         * ecore.cs: (FieldExpr): Handle field remapping here.
6948
6949         * iteratators.cs: Pass the instance variable (if the method is an
6950         instance method) to the constructors, so we can access the field
6951         variables on the class.
6952
6953         TODO: Test this with structs.  I think the THIS variable on
6954         structs might have to be a pointer, and not a refenrece
6955
6956 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
6957
6958         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
6959         local variables to fields in a proxy class.
6960
6961         * iterators.cs (PopulateProxy): Rename our internal fields to
6962         <XXX>.  
6963         Create a <THIS> field if we are an instance method, so we can
6964         reference our parent container variables.
6965         (MapVariable): Called back from the EmitContext code to enter a
6966         new variable to field mapping into the proxy class (we just create
6967         a FieldBuilder).
6968
6969         * expression.cs
6970         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
6971         for using the remapped locals to fields.
6972
6973         I placed the code here, because that gives the same semantics to
6974         local variables, and only changes the Emit code.
6975
6976         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
6977         statements inside iterators.
6978         (VariableInfo): Add a FieldBuilder for the cases when we are
6979         remapping local variables to fields in a proxy class
6980
6981         * ecore.cs (SimpleNameResolve): Avoid testing two times for
6982         current_block != null.
6983
6984         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
6985         not cope with strings, as it has been moved to the
6986         TableSwitchEmit.  Fixed bug in switch generation.
6987
6988         * expression.cs (New.DoResolve): Provide more context for the user
6989         when reporting an error.
6990
6991         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6992         pointers. 
6993
6994         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6995         check the permissions for it.  Note than in a type-resolution
6996         context the check was already present in DeclSpace.ResolveType,
6997         but was missing from the MemberAccess.
6998
6999         (ArrayCreation.CheckIndices): warn if the user has
7000         more nested levels of expressions, but there are no more
7001         dimensions specified.  Avoids crash on bug 41906.
7002
7003 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
7004
7005         * statement.cs (Block): replace Implicit bool, for a generic
7006         flags.   
7007         New flag: `Unchecked'.  This is used during the EmitMeta phase
7008         (which is out-of-line with the regular Resolve/Emit process for a
7009         statement, as this is done ahead of time, but still gets a chance
7010         to call constant resolve).
7011
7012         (Block.Flags): new enum for adding a new flag.
7013
7014         (Block.EmitMeta): track the state of unchecked.
7015
7016         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
7017         to enable constant resolution to work there as well.
7018
7019 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
7020
7021         * typemanager.cs (ienumerable_type): Also look up
7022         System.Collections.IEnumerable. 
7023
7024 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
7025
7026         TODO: Test more than one conditional per method.
7027
7028         * class.cs (Indexer.Define): Report the location where the user is
7029         referencing the unsupported feature.
7030
7031         (MethodData): Overload the use of `conditionals' to
7032         minimize the creation of needless ArrayLists.   This saves roughly
7033         212kb on my machine.
7034
7035         (Method): Implement the new IIteratorContainer interface.
7036         (Method.SetYields): Implement the method by setting the ModFlags
7037         to contain METHOD_YIELDS.
7038
7039         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
7040         which just got set to null.
7041
7042         * iterators.cs: New file.
7043
7044         (Yield, YieldBreak): New statements.
7045
7046         * statement.cs (Return.Resolve): Flag an error if we are used in
7047         an iterator method.
7048
7049         * codegen.cs (InIterator): New flag set if the code is being
7050         compiled in an iterator method.
7051
7052         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
7053         internal modifier, and we just use it to avoid adding extra
7054         fields, as this is seldom used.  
7055
7056         * cs-parser.jay: Add yield_statement (yield and yield break).
7057
7058         * driver.cs: New flag -v2 to turn on version 2 features. 
7059
7060         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
7061         hashtable when v2 is enabled.
7062
7063 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
7064
7065         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
7066         there is already a namespace defined with this name.
7067
7068         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
7069         people upgraded their corlibs.
7070
7071         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
7072         always use fully qualified types, no need to use the compiler
7073         front end.
7074
7075         (TypeManager.IsNamespace): Use binarysearch.
7076
7077         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
7078         AddDelegate): I did not quite use the new IsValid API properly: I
7079         have to pass the short-name and the fullname.  I was passing only
7080         the basename instead of the fullname sometimes. 
7081
7082         (TypeContainer.DefineType): call NamespaceClash.
7083
7084         * interface.cs (Interface.DefineType): use NamespaceClash before
7085         defining the type.
7086
7087         * delegate.cs (Delegate.DefineType): use NamespaceClash before
7088         defining the type.
7089
7090         * enum.cs: (Enum.DefineType): use NamespaceClash before
7091         defining the type.
7092
7093         * typemanager.cs (: 3-line patch that gives us some tasty 11%
7094         speed increase.  First, use the negative_hits cache when we get a
7095         negative.  Second, add the type with its full original name
7096         instead of the new . and + encoded name (reflection uses + to
7097         separate type from a nested type).  Use LookupTypeReflection
7098         directly which bypasses the type->name hashtable (that we already
7099         know does not contain the type.
7100
7101         * decl.cs (DeclSpace.ResolveTypeExpr): track the
7102         location/container type. 
7103
7104         * driver.cs: When passing utf8, use directly the UTF8Encoding.
7105
7106 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
7107
7108         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
7109
7110         * delegate.cs (NewDelegate.Resolve): Test whether an instance
7111         method is being referenced in the method group from a static
7112         context, and report error 120 if so.
7113
7114         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
7115         Error118. 
7116
7117         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
7118         is created, we create the A namespace).
7119
7120         * cs-parser.jay: A namespace also introduces a DeclarationFound.
7121         Fixes #41591
7122
7123 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
7124
7125         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
7126         invocation to ModuleBuilder.GetType with the same values will
7127         return a new type instance, so we need to cache its return
7128         values. 
7129
7130         * expression.cs (Binary.ResolveOperator): Only allow the compare
7131         operators on enums if they are of the same type.
7132
7133         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
7134         types of ValueType on their own case.  Before we were giving them
7135         the same treatment as objects.
7136
7137         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
7138         fullname.  Short name is used to compare against container name.
7139         Fullname is used to check against defined namespace names.
7140
7141         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
7142         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
7143
7144         (Method.CheckBase): Call parent.
7145         (MemberBase.CheckBase): Check for protected members on sealed
7146         classes.
7147         (PropertyBase.CheckBase): Call parent.
7148         (Field.Define): Call parent.
7149
7150         * report.cs: Negative error codes are now mapped to 8000 - code,
7151         so that the display is render more nicely.
7152
7153         * typemanager.cs: Do not use try/catch, instead report a regular
7154         error. 
7155
7156         (GetPointerType, GetReferenceType): These methods provide
7157         mechanisms to obtain the T* and T& from a T.  We had the code
7158         previously scattered around the code base, and it also used
7159         TypeManager.LookupType that would go through plenty of caches.
7160         This one goes directly to the type source.
7161
7162         In some places we did the Type.GetType followed by
7163         ModuleBuilder.GetType, but not in others, so this unifies the
7164         processing as well.
7165
7166         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
7167         statements now that we have namespace information.
7168
7169         * typemanager.cs (IsNamespace): New method, returns whether the
7170         string presented is a namespace or not.
7171
7172         (ComputeNamespaces): New public entry point, computes the list of
7173         available namespaces, using the GetNamespaces API call in Mono, or
7174         the slower version in MS.NET.   
7175
7176         Now before we start the semantic analysis phase, we have a
7177         complete list of namespaces including everything that the user has
7178         provided.
7179
7180         Deleted old code to cache namespaces in .nsc files.
7181
7182 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
7183
7184         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
7185         class/struct location definition Location for the implicit
7186         constructor location.
7187
7188         (Operator.Define): Use the location of the operator for the
7189         implicit Method definition.
7190
7191         (Constructor.Emit): use the constructor location for the implicit
7192         base initializer constructor.
7193
7194         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
7195         and the Expression class now contains two new methods:
7196
7197         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
7198         isolate type lookup from the rest of the resolution process.
7199
7200         Since we use Expressions to hold type definitions due to the way
7201         we parse the input we have historically overloaded Resolve to
7202         perform the Type lookups if a special flag is passed.  Now this is
7203         eliminated and two methods take their place. 
7204
7205         The differences in the two methods between xStep and xTerminal is
7206         that xStep is involved in our current lookup system that uses
7207         SimpleNames to compose a name, while xTerminal is used just to
7208         catch the case where the simplename lookup failed.
7209
7210 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
7211
7212         * expression.cs (ResolveMemberAccess): Remove redundant code.
7213         TypeExpr expressions are always born fully resolved.
7214
7215         * interface.cs (PopulateMethod): Do not lookup the types twice.
7216         We were doing it once during SemanticAnalysis and once during
7217         PopulateMethod.
7218
7219         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
7220         in local variable type definitions, were being returned as a
7221         SimpleName (we decomposed everything into a string), that is
7222         because primary_expression was being used instead of a type in the
7223         grammar (reduce/reduce conflicts).
7224
7225         The part that was wrong is that we converted the expression into a
7226         string (an oversimplification in one hand, compounded with primary
7227         expressions doing string concatenation).
7228
7229         So things like:
7230
7231         A.B.C [] x;
7232
7233         Would return "A.B.C[]" as a SimpleName.  This stopped things like
7234         using clauses from working on this particular context.  And a type
7235         was being matched directly against "A.B.C[]".
7236
7237         We now use the correct approach, and allow for ComposedCast to be
7238         part of the unary expression.  So the "A.B.C []" become a composed
7239         cast of "A.B.C" (as a nested group of MemberAccess with a
7240         SimpleName at the end) plus the rank composition "[]". 
7241
7242         Also fixes 35567
7243
7244 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
7245
7246         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
7247         for the access level checking.
7248
7249         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
7250         `TypeContainer container', because I kept getting confused when I
7251         was debugging this code.
7252
7253         * expression.cs (Indexers): Instead of tracking getters/setters,
7254         we now track them in parallel.  We create one arraylist less, but
7255         most importantly it is possible now for the LValue code to find a
7256         matching get for a set.
7257
7258         (IndexerAccess.DoResolveLValue): Update the code.
7259         GetIndexersForType has been modified already to extract all the
7260         indexers from a type.  The code assumed it did not.
7261
7262         Also make the code set the correct return type for the indexer.
7263         This was fixed a long time ago for properties, but was missing for
7264         indexers.  It used to be void_type.
7265
7266         (Binary.Emit): Test first for doubles instead of
7267         floats, as they are more common.
7268
7269         (Binary.EmitBranchable): Use the .un version of the branch opcodes
7270         when dealing with floats and the <=, >= operators.  This fixes bug
7271         #39314 
7272
7273         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
7274         to load the array value by emitting a load on the foreach variable
7275         type.  This was incorrect.  
7276
7277         We now emit the code to load an element using the the array
7278         variable type, and then we emit the conversion operator.
7279
7280         Fixed #40176
7281
7282 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
7283
7284         * attribute.cs: Avoid allocation of ArrayLists in the common case.
7285
7286 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
7287
7288         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
7289         test for protection before we test for signatures. 
7290
7291         (MethodSignature.ToString): implement.
7292
7293         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
7294         to the case where we reduced into a LongConstant.
7295
7296         * decl.cs (CheckAccessLevel): If the type is an array, we can not
7297         depend on whether the information is acurrate, because the
7298         Microsoft runtime will always claim that the array type is public,
7299         regardless of the real state.
7300
7301         If the type is a pointer, another problem happens: the type is
7302         reported as non-public in Microsoft.  
7303
7304         In both cases we have to call CheckAccessLevel recursively with
7305         the underlying type as the argument to be tested.
7306
7307 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
7308
7309         * assign.cs (Assign.Emit): If we are dealing with a compound
7310         assignment expression, we should use the code path that stores the
7311         intermediate result in a temporary value.  This fixes #40903.
7312
7313         *expression.cs (Indirection.ToString): Provide ToString method for
7314         debugging. 
7315
7316 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
7317
7318         * class.cs: Null out fields holding references to Block objects so
7319         they can be garbage collected.
7320
7321         * expression.cs (OverloadResolve): Remove unused local.
7322
7323 2003-04-07  Martin Baulig  <martin@ximian.com>
7324
7325         * codegen.cs (EmitContext.CurrentFile): New public field.
7326         (EmitContext.Mark): Use the CurrentFile to check whether the
7327         location is in the correct file.
7328         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
7329
7330 2003-04-07  Martin Baulig  <martin@ximian.com>
7331
7332         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
7333
7334         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
7335         location.  [FIXME: The location argument which gets passed to this
7336         method is sometimes wrong!]
7337
7338 2003-04-07  Nick Drochak <ndrochak@gol.com>
7339
7340         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
7341
7342 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
7343
7344         * expression.cs (Indirection.EmitAssign): We were using the
7345         temporary, but returning immediately instead of continuing the
7346         EmitAssing flow.
7347
7348 2003-04-06  Martin Baulig  <martin@ximian.com>
7349
7350         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
7351         if it's a nested child, but also deriving from the outer class.
7352         See test 190.cs.
7353
7354         * typemanager.cs (IsNestedChildOf): Make this work if it's a
7355         nested child, but also deriving from the outer class.  See
7356         test-190.cs.
7357         (FilterWithClosure): We may access private members of the outer
7358         class if we're a nested child and deriving from the outer class.
7359         (RealMemberLookup): Only set `closure_private_ok' if the
7360         `original_bf' contained BindingFlags.NonPublic.
7361
7362 2003-04-05  Martin Baulig  <martin@ximian.com>
7363
7364         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
7365
7366 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
7367
7368         * class.cs (Event.Define): Do not allow abstract events to have
7369         initializers. 
7370
7371 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
7372
7373         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
7374         block in event declarations.
7375
7376         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
7377         value type, get its address.
7378
7379         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
7380         leaving a class on the stack instead of a boolean value (int
7381         0/1).  Change the code so we compare against null, and then the
7382         result against zero.
7383
7384         * class.cs (TypeContainer.GetClassBases): We were checking for the
7385         parent class being sealed too late.
7386
7387         * expression.cs (Binary.Emit): For <= and >= when dealing with
7388         floating point values, use cgt.un and clt.un instead of cgt and
7389         clt alone.
7390
7391 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
7392
7393         * statement.cs: Apply the same optimization as MS: skip the 
7394         GetEnumerator returning an IEnumerator, and use the one returning a 
7395         CharEnumerator instead. This allows us to avoid the try-finally block 
7396         and the boxing.
7397
7398 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
7399
7400         * cs-parser.jay: Attributes cannot be applied to
7401                          namespaces. Fixes #40473
7402
7403 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7404
7405         * class.cs:
7406         (Add*): check if the name is valid using the full name for constants,
7407         fields, properties and events.
7408
7409 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
7410
7411         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
7412         char constants to be part of the enumeration.
7413
7414         * expression.cs (Conditional.DoResolve): Add support for operator
7415         true. Implements the missing functionality from 14.12
7416
7417         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
7418         operator true/false as required by the spec.
7419
7420         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
7421         implicit conversion to boolean.
7422
7423         * statement.cs (Statement.ResolveBoolean): A boolean expression is
7424         also one where the type implements `operator true'. 
7425
7426         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
7427         get an expression that will invoke operator true based on an
7428         expression.  
7429
7430         (GetConversionOperators): Removed the hack that called op_True
7431         here.  
7432
7433         (Expression.ResolveBoolean): Move this from Statement.
7434
7435 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
7436
7437         * ecore.cs (FieldExpr): do not allow initialization of initonly
7438         fields on derived classes
7439
7440 2003-03-13  Martin Baulig  <martin@ximian.com>
7441
7442         * statement.cs (Block.Emit): Call ig.BeginScope() and
7443         ig.EndScope() when compiling with debugging info; call
7444         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
7445
7446 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
7447
7448         * expression.cs (Indexers): Do not construct immediately, allow
7449         for new members to be appended as we go.  Fixes 38143
7450
7451 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7452
7453         * expression.cs: save/restore context when resolving an unchecked
7454         expression.
7455
7456 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
7457
7458         * cfold.cs: Catch division by zero in modulus operator during
7459         constant folding.
7460
7461 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
7462
7463         * interface.cs (Interface.DefineMembers): Avoid defining members
7464         twice. 
7465
7466 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
7467
7468         * driver.cs: handle the +/- options for -noconfig
7469
7470         * statement.cs (Unckeched.Resolve): Also track the state of
7471         unchecked in the Resolve phase.
7472
7473 2003-02-27  Martin Baulig  <martin@ximian.com>
7474
7475         * ecore.cs (Expression.MemberLookup): Don't create a
7476         MethodGroupExpr for something which is not a method.  Fixes #38291.
7477
7478 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
7479
7480         * class.cs (MemberBase.CheckParameters): Also check that the type
7481         is unmanaged if it is a pointer.
7482
7483         * expression.cs (SizeOf.Resolve): Add location information.
7484
7485         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
7486         a managed type is declared.
7487
7488         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
7489         parameter modifiers as well.  Fixes bug 38606
7490
7491         * class.cs: Very sad.  Am backing out the speed up changes
7492         introduced by the ArrayList -> Array in the TypeContainer, as they
7493         were not actually that much faster, and introduced a bug (no error
7494         reports on duplicated methods).
7495
7496         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
7497         source first, this will guarantee that we have a valid expression
7498         before calling in lower levels functions that will require a
7499         resolved object.  Then use this original_source in the
7500         target.ResolveLValue instead of the original source that was
7501         passed to us.
7502
7503         Another change.  Use target.Resolve instead of LValueResolve.
7504         Although we are resolving for LValues, we will let the Assign code
7505         take care of that (it will be called again from Resolve).  This
7506         basically allows code like this:
7507
7508         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
7509         class Y { void A (X x) { x [0] += o; }
7510
7511         The problem was that the indexer was trying to resolve for
7512         set_Item (idx, object o) and never finding one.  The real set_Item
7513         was set_Item (idx, X).  By delaying the process we get the right
7514         semantics. 
7515
7516         Fixes bug 36505
7517
7518 2003-02-23  Martin Baulig  <martin@ximian.com>
7519
7520         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
7521         while calling DoEmit ().
7522
7523         * codegen.cs (EmitContext.Mark): Don't mark locations in other
7524         source files; if you use the #line directive inside a method, the
7525         compiler stops emitting line numbers for the debugger until it
7526         reaches the end of the method or another #line directive which
7527         restores the original file.
7528
7529 2003-02-23  Martin Baulig  <martin@ximian.com>
7530
7531         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
7532
7533 2003-02-23  Martin Baulig  <martin@ximian.com>
7534
7535         * statement.cs (Block.AddChildVariableNames): We need to call this
7536         recursively, not just for our immediate children.
7537
7538 2003-02-23  Martin Baulig  <martin@ximian.com>
7539
7540         * class.cs (Event.Define): Always make the field private, like csc does.
7541
7542         * typemanager.cs (TypeManager.RealMemberLookup): Make events
7543         actually work, fixes bug #37521.
7544
7545 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
7546
7547         * delegate.cs: When creating the various temporary "Parameters"
7548         classes, make sure that we call the ComputeAndDefineParameterTypes
7549         on those new parameters (just like we do with the formal ones), to
7550         allow them to be resolved in the context of the DeclSpace.
7551
7552         This fixes the bug that Dick observed in Bugzilla #38530.
7553
7554 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
7555
7556         * expression.cs (ResolveMemberAccess): When resolving a constant,
7557         do not attempt to pull a constant if the value was not able to
7558         generate a valid constant.
7559
7560         * const.cs (LookupConstantValue): Do not report more errors than required.
7561
7562 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7563
7564         * expression.cs: fixes bug #38328.
7565
7566 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7567
7568         * class.cs: Changed all the various members that can be part of a
7569         class from being an ArrayList to be an Array of the right type.
7570         During the DefineType type_list, interface_list, delegate_list and
7571         enum_list are turned into types, interfaces, delegates and enums
7572         arrays.  
7573
7574         And during the member population, indexer_list, event_list,
7575         constant_list, field_list, instance_constructor_list, method_list,
7576         operator_list and property_list are turned into their real arrays.
7577
7578         Although we could probably perform this operation earlier, for
7579         good error reporting we need to keep the lists and remove the
7580         lists for longer than required.
7581
7582         This optimization was triggered by Paolo profiling the compiler
7583         speed on the output of `gen-sample-program.pl' perl script. 
7584
7585         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
7586         not crash in methods like MemberLookupFailed that use this field.  
7587
7588         This problem arises when the compiler fails to resolve a type
7589         during interface type definition for example.
7590
7591 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7592
7593         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
7594         inherit from System.Object, so we have to stop at null, not only
7595         when reaching System.Object.
7596
7597 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
7598
7599         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7600         DeclaredOnly because the parent indexer might have had a different
7601         name, but did not loop until the top of the hierarchy was reached.
7602
7603         The problem this one fixes is 35492: when a class implemented an
7604         indexer from an interface, we were getting the interface method
7605         (which was abstract) and we were flagging an error (can not invoke
7606         abstract method).
7607
7608         This also keeps bug 33089 functioning, and test-148 functioning.
7609
7610         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7611         out if a method is special is to see if it is declared in a
7612         property or event, or whether it is one of the predefined operator
7613         names.   This should fix correctly #36804.
7614
7615 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7616
7617         The goal here is to remove the dependency on EmptyCast.Peel ().
7618         Killing it completely.
7619
7620         The problem is that currently in a number of places where
7621         constants are expected, we have to "probe" for an EmptyCast, and
7622         Peel, which is not the correct thing to do, as this will be
7623         repetitive and will likely lead to errors. 
7624
7625         The idea is to remove any EmptyCasts that are used in casts that
7626         can be reduced to constants, so we only have to cope with
7627         constants. 
7628
7629         This bug hunt was triggered by Bug 37363 and the desire to remove
7630         the duplicate pattern where we were "peeling" emptycasts to check
7631         whether they were constants.  Now constants will always be
7632         constants.
7633
7634         * ecore.cs: Use an enumconstant here instead of wrapping with
7635         EmptyCast.  
7636
7637         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7638         throwing me off.  By handling this we can get rid of a few hacks.
7639
7640         * statement.cs (Switch): Removed Peel() code.
7641
7642 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7643
7644         * class.cs: Location information for error 508
7645
7646         * expression.cs (New.DoResolve): Add a guard against double
7647         resolution of an expression.  
7648
7649         The New DoResolve might be called twice when initializing field
7650         expressions (see EmitFieldInitializers, the call to
7651         GetInitializerExpression will perform a resolve on the expression,
7652         and later the assign will trigger another resolution
7653
7654         This leads to bugs (#37014)
7655
7656         * delegate.cs: The signature for EndInvoke should contain any ref
7657         or out parameters as well.  We were not doing this in the past. 
7658
7659         * class.cs (Field.Define): Do not overwrite the type definition
7660         inside the `volatile' group.  Turns out that volatile enumerations
7661         were changing the type here to perform a validity test, which
7662         broke conversions. 
7663
7664 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7665
7666         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7667         and structs, we do not want to load the instance variable
7668
7669         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7670         enum_type has to be handled like an object reference (implicit
7671         conversions exists from this to object), but the regular IsClass
7672         and IsValueType tests will never return true for this one.
7673
7674         Also we use TypeManager.IsValueType instead of type.IsValueType,
7675         just for consistency with the rest of the code (this is only
7676         needed if we ever use the construct exposed by test-180.cs inside
7677         corlib, which we dont today).
7678
7679 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7680
7681         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7682         just InternalCall.
7683
7684 2003-02-09  Martin Baulig  <martin@ximian.com>
7685
7686         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7687         (Namespace.DefineNamespaces): New static public method; this is
7688         called when we're compiling with debugging to add all namespaces
7689         to the symbol file.
7690
7691         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7692         pass it to the Namespace's .ctor.
7693
7694         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7695         and MethodBase arguments; pass the namespace ID to the symwriter;
7696         pass the MethodBase instead of the token to the symwriter.
7697         (SymbolWriter.DefineNamespace): New method to add a namespace to
7698         the symbol file.
7699
7700 2003-02-09  Martin Baulig  <martin@ximian.com>
7701
7702         * symbolwriter.cs: New file.  This is a wrapper around
7703         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7704         methods here in near future.
7705
7706 2003-02-09  Martin Baulig  <martin@ximian.com>
7707
7708         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7709         ILGenerator.MarkSequencePoint() which are actually used by the
7710         symbol writer.
7711
7712 2003-02-09  Martin Baulig  <martin@ximian.com>
7713
7714         * location.cs (SourceFile): New public sealed class.  This
7715         contains the name and an index which is used in the location's token.
7716         (Location): Reserve an appropriate number of bits in the token for
7717         the source file instead of walking over that list, this gives us a
7718         really huge performance improvement when compiling with debugging.
7719
7720         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7721         `SourceFile' argument instead of a string.
7722         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7723         but don't parse/tokenize here, we need to generate the list of all
7724         source files before we do that.
7725         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7726         the files.
7727
7728         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7729         instead of a string.
7730
7731         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7732         of a string.
7733
7734 2003-02-09  Martin Baulig  <martin@ximian.com>
7735
7736         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7737         filename on `#line default'.
7738
7739 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7740
7741         * statement.cs: don't clear the pinned var when the fixed statement
7742         returns from the method (fixes bug#37752).
7743
7744 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7745
7746         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7747         to IsValueType.
7748
7749 2003-02-07  Martin Baulig  <martin@ximian.com>
7750
7751         * driver.cs: Removed the `--debug-args' command line argument.
7752
7753         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7754         automatically by the AsssemblyBuilder.
7755         (CodeGen.InitializeSymbolWriter): We don't need to call any
7756         initialization function on the symbol writer anymore.  This method
7757         doesn't take any arguments.
7758
7759 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7760
7761         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7762         from referenced assemblies as well.
7763
7764 2003-02-02  Martin Baulig  <martin@ximian.com>
7765
7766         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7767
7768 2003-02-02  Martin Baulig  <martin@ximian.com>
7769
7770         * class.cs (Constructor.Emit): Open the symbol writer before
7771         emitting the constructor initializer.
7772         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7773         single-stepping through constructor initializers.
7774
7775 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7776
7777         * class.cs: Handle error 549: do not allow virtual methods in
7778         sealed classes. 
7779
7780 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7781
7782         * decl.cs: Check access levels when resolving types
7783
7784 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7785
7786         * statement.cs: Add parameters and locals set in catch blocks that might 
7787         return to set vector
7788
7789 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7790
7791         * class.cs (Operator): Set the SpecialName flags for operators.
7792
7793         * expression.cs (Invocation.DoResolve): Only block calls to
7794         accessors and operators on SpecialName methods.
7795
7796         (Cast.TryReduce): Handle conversions from char constants.
7797
7798
7799 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7800
7801         * statement.cs: small memory and time optimization in FlowBranching.
7802
7803 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7804
7805         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7806         problem that the last fix but in the other sid (Set).
7807
7808         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7809         access when there is no indexer in the hierarchy.
7810
7811 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7812
7813         * class.cs: Combine some if statements.
7814
7815 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7816
7817         * driver.cs: fixed bug #37187.
7818
7819 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7820
7821         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7822         any indexer, it's needed to build a list with all the indexers in the
7823         hierarchy (AllGetters), else we have problems. Fixes #35653.
7824
7825 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7826
7827         * class.cs (MethodData.Define): It is wrong for an interface
7828         implementation to be static in both cases: explicit and implicit.
7829         We were only handling this in one case.
7830
7831         Improve the if situation there to not have negations.
7832
7833         * class.cs (Field.Define): Turns out that we do not need to check
7834         the unsafe bit on field definition, only on usage.  Remove the test.
7835
7836 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7837
7838         * driver.cs: use assembly.Location instead of Codebase (the latest
7839         patch made mcs fail when using MS assemblies).
7840
7841 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
7842
7843         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
7844         get the path to *corlib.dll.
7845
7846 2003-01-21  Nick Drochak <ndrochak@gol.com>
7847
7848         * cs-tokenizer.cs:
7849         * pending.cs:
7850         * typemanager.cs: Remove compiler warnings
7851
7852 2003-01-20  Duncan Mak  <duncan@ximian.com>
7853
7854         * AssemblyInfo.cs: Bump the version number to 0.19.
7855
7856 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7857
7858         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
7859
7860 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
7861
7862         * class.cs (Constructor::Emit): Emit debugging info for constructors.
7863
7864 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
7865
7866         * cs-parser.jay: Small fix: we were not comparing the constructor
7867         name correctly.   Thanks to Zoltan for the initial pointer.
7868
7869 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
7870
7871         * cs-tokenizer.cs: Set file name when specified with #line
7872
7873 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
7874
7875         * cs-parser.jay: Only perform the constructor checks here if we
7876         are named like the class;  This will help provider a better
7877         error.  The constructor path is taken when a type definition is
7878         not found, but most likely the user forgot to add the type, so
7879         report that rather than the constructor error.
7880
7881 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
7882
7883         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
7884         allocations.
7885
7886 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7887
7888         * cs-parser.jay: Add cleanup call.
7889
7890 2003-01-13  Duncan Mak  <duncan@ximian.com>
7891
7892         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
7893         consistent with other methods.
7894
7895 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7896
7897         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
7898
7899 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
7900
7901         * attribute.cs: only set GuidAttr to true when we have a
7902         GuidAttribute.
7903
7904 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7905
7906         * ecore.cs:
7907         * expression.cs:
7908         * typemanager.cs: fixes to allow mcs compile corlib with the new
7909         Type.IsSubclassOf fix.
7910
7911 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
7912
7913         * expression.cs (LocalVariableReference.DoResolve): Classify a
7914         constant as a value, not as a variable.   Also, set the type for
7915         the variable.
7916
7917         * cs-parser.jay (fixed_statement): take a type instead of a
7918         pointer_type, so we can produce a better error message later.
7919
7920         * statement.cs (Fixed.Resolve): Flag types that are not pointers
7921         as an error.  
7922
7923         (For.DoEmit): Make inifinite loops have a
7924         non-conditional branch back.
7925
7926         (Fixed.DoEmit): First populate the pinned variables, then emit the
7927         statement, then clear the variables.  Before I was emitting the
7928         code once for each fixed piece.
7929
7930
7931 2003-01-08  Martin Baulig  <martin@ximian.com>
7932
7933         * statement.cs (FlowBranching.MergeChild): A break in a
7934         SWITCH_SECTION does not leave a loop.  Fixes #36155.
7935
7936 2003-01-08  Martin Baulig  <martin@ximian.com>
7937
7938         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
7939         lives in the same number space than `param_map'.  Fixes #36154.
7940
7941 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
7942
7943         * cs-parser.jay (constructor_declaration): Set the
7944         Constructor.ModFlags before probing for it.  This makes the
7945         compiler report 514, 515 and 132 (the code was there, but got
7946         broken). 
7947
7948         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
7949         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
7950         (GotoCase.Resolve): Set `Returns' to ALWAYS.
7951
7952 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
7953
7954         * enum.cs: create the enum static fields using the enum type.
7955
7956 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
7957
7958         * class.cs: don't try to create the ParamBuilder for the return
7959         type if it's not needed (and handle it breaking for the ms runtime
7960         anyway).
7961
7962 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
7963
7964         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
7965
7966 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
7967
7968         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
7969         the command.   This showed up while compiling the JANET source
7970         code, which used \r as its only newline separator.
7971
7972 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
7973
7974         * class.cs (Method.Define): If we are an operator (because it
7975         reuses our code), then set the SpecialName and HideBySig.  #36128
7976
7977 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
7978
7979         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
7980         exception, report error 120 `object reference required'.
7981
7982         * driver.cs: Add --pause option, used during to measure the size
7983         of the process as it goes with --timestamp.
7984
7985         * expression.cs (Invocation.DoResolve): Do not allow methods with
7986         SpecialName to be invoked.
7987
7988 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
7989
7990         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7991         number before adding it.
7992
7993 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7994
7995         * ecore.cs (StandardImplicitConversion): When in an unsafe
7996         context, we allow conversion between void * to any other pointer
7997         type. This fixes bug #35973.
7998
7999 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
8000
8001         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
8002         is not thrown when extensionless outputs are used 
8003
8004 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8005
8006         * rootcontext.cs: fixed compilation of corlib.
8007
8008 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
8009
8010         * attribute.cs (Attributes.Contains): Add new method.
8011
8012         * class.cs (MethodCore.LabelParameters): if the parameter is an
8013         `out' parameter, check that no attribute `[In]' has been passed.
8014
8015         * enum.cs: Handle the `value__' name in an enumeration.
8016
8017 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
8018
8019         * decl.cs: Added special case to allow overrides on "protected
8020         internal" methods
8021
8022 2002-12-18  Ravi Pratap  <ravi@ximian.com>
8023
8024         * attribute.cs (Attributes.AddAttributeSection): Rename to this
8025         since it makes much more sense.
8026
8027         (Attributes.ctor): Don't require a Location parameter.
8028
8029         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
8030
8031         * attribute.cs (ApplyAttributes): Remove extra Location parameters
8032         since we already have that information per attribute.
8033
8034         * everywhere : make appropriate changes.
8035
8036         * class.cs (LabelParameters): Write the code which actually
8037         applies attributes to the return type. We can't do this on the MS
8038         .NET runtime so we flag a warning in the case an exception is
8039         thrown.
8040
8041 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
8042
8043         * const.cs: Handle implicit null conversions here too.
8044
8045 2002-12-17  Ravi Pratap  <ravi@ximian.com>
8046
8047         * class.cs (MethodCore.LabelParameters): Remove the extra
8048         Type [] parameter since it is completely unnecessary. Instead
8049         pass in the method's attributes so that we can extract
8050         the "return" attribute.
8051
8052 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
8053
8054         * cs-parser.jay (parse): Use Report.Error to flag errors instead
8055         of ignoring it and letting the compile continue.
8056
8057         * typemanager.cs (ChangeType): use an extra argument to return an
8058         error condition instead of throwing an exception.
8059
8060 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
8061
8062         * expression.cs (Unary.TryReduce): mimic the code for the regular
8063         code path.  Perform an implicit cast in the cases where we can
8064         implicitly convert to one of the integral types, and then reduce
8065         based on that constant.   This fixes bug #35483.
8066
8067 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8068
8069         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
8070
8071 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8072
8073         * namespace.cs: fixed bug #35489.
8074
8075 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
8076
8077         * class.cs: Remove some dead code.
8078
8079         * cs-parser.jay: Estimate the number of methods needed
8080         (RootContext.MethodCount);
8081
8082         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
8083         numbers instead of StringBuilders.
8084
8085         * support.cs (PtrHashtable): Add constructor with initial size;
8086         We can now reduce reallocations of the method table.
8087
8088 2002-12-10  Ravi Pratap  <ravi@ximian.com>
8089
8090         * attribute.cs (ApplyAttributes): Keep track of the emitted
8091         attributes on a per-target basis. This fixes bug #35413.
8092
8093 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
8094
8095         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
8096         default to the Windows 1252 encoding.
8097
8098         (UnixParseOption): Support version, thanks to Alp for the missing
8099         pointer. 
8100
8101         * AssemblyInfo.cs: Add nice assembly information.
8102
8103         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
8104         (bug 35169).
8105
8106         * cs-parser.jay: Allow a trailing comma before the close bracked
8107         in the attribute_section production.
8108
8109         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
8110         address of the instance was being taken, I will take this out,
8111         because we take the address of the object immediately here.
8112
8113 2002-12-09  Ravi Pratap  <ravi@ximian.com>
8114
8115         * typemanager.cs (AreMultipleAllowed): Take care of the most
8116         obvious case where attribute type is not in the current assembly -
8117         stupid me ;-)
8118
8119 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
8120
8121         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
8122         definitions, instead of doing that afterwards.  
8123
8124         Also we use a nice little hack, depending on the constructor, we
8125         know if we are a "composed" name or a simple name.  Hence, we
8126         avoid the IndexOf test, and we avoid 
8127
8128         * codegen.cs: Add code to assist in a bug reporter to track down
8129         the source of a compiler crash. 
8130
8131 2002-12-07  Ravi Pratap  <ravi@ximian.com>
8132
8133         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
8134         types have been emitted for a given element and flag an error
8135         if something which does not have AllowMultiple set is used more
8136         than once.
8137
8138         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
8139         attribute types and their corresponding AllowMultiple properties
8140
8141         (AreMultipleAllowed): Check the property for a given type.
8142
8143         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
8144         property in the case we have a TypeContainer.
8145
8146         (Attributes.AddAttribute): Detect duplicates and just skip on
8147         adding them. This trivial fix catches a pretty gross error in our
8148         attribute emission - global attributes were being emitted twice!
8149
8150         Bugzilla bug #33187 is now fixed.
8151
8152 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
8153
8154         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
8155         instead of pp_and).
8156
8157         * expression.cs (Binary.ResolveOperator): I can only use the
8158         Concat (string, string, string) and Concat (string, string,
8159         string, string) if the child is actually a concatenation of
8160         strings. 
8161
8162 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
8163
8164         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
8165         context where we need a 2-character lookahead.
8166
8167         * pending.cs (PendingImplementation): Rework so we can keep track
8168         of interface types all the time, and flag those which were
8169         implemented by parents as optional.
8170
8171 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
8172
8173         * expression.cs (Binary.ResolveOperator): Use
8174         String.Concat(string,string,string) or
8175         String.Concat(string,string,string,string) when possible. 
8176
8177         * typemanager: More helper methods.
8178
8179
8180 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
8181
8182         * pending.cs: remove the bogus return from GetMissingInterfaces()
8183         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
8184
8185 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8186
8187         * namespace.cs: avoid duplicated 'using xxx' being added to
8188         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
8189         when we get more than one 'using' statement for the same namespace.
8190         Report a CS0105 warning for it.
8191
8192 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
8193
8194         * cs-tokenizer.cs (consume_identifier): use read directly, instead
8195         of calling getChar/putback, uses internal knowledge of it.    
8196
8197         (xtoken): Reorder tokenizer so most common patterns are checked
8198         first.  This reduces the compilation time in another 5% (from 8.11s
8199         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
8200
8201         The parsing time is 22% of the compilation in mcs, and from that
8202         64% is spent on the tokenization process.  
8203
8204         I tried using a binary search for keywords, but this is slower
8205         than the hashtable.  Another option would be to do a couple of
8206         things:
8207
8208                 * Not use a StringBuilder, instead use an array of chars,
8209                   with a set value.  Notice that this way we could catch
8210                   the 645 error without having to do it *afterwards*.
8211
8212                 * We could write a hand-parser to avoid the hashtable
8213                   compares altogether.
8214
8215         The identifier consumption process takes 37% of the tokenization
8216         time.  Another 15% is spent on is_number.  56% of the time spent
8217         on is_number is spent on Int64.Parse:
8218
8219                 * We could probably choose based on the string length to
8220                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
8221                   computations. 
8222
8223         Another 3% is spend on wrapping `xtoken' in the `token' function.
8224
8225         Handle 0xa0 as whitespace (#34752)
8226
8227 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
8228
8229         * typemanager.cs (IsCLRType): New routine to tell whether a type
8230         is one of the builtin types.  
8231
8232         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
8233         typecode in more places instead of doing pointer comparissions.
8234         We could leverage some knowledge about the way the typecodes are
8235         laid out.
8236
8237         New code to cache namespaces in assemblies, it is currently not
8238         invoked, to be used soon.
8239
8240         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
8241
8242         * expression.cs (Binary.ResolveOperator): specially handle
8243         strings, and do not perform user-defined operator overloading for
8244         built-in types.
8245
8246 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
8247
8248         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
8249         internalcall as it is a pretty simple operation;  Avoid whenever
8250         possible to call Char.IsLetter.
8251
8252         (consume_identifier): Cut by half the number of
8253         hashtable calls by merging the is_keyword and GetKeyword behavior.
8254
8255         Do not short-circuit, because if we do, we
8256         report errors (ie, #if false && true would produce an invalid
8257         directive error);
8258
8259
8260 2002-11-24  Martin Baulig  <martin@ximian.com>
8261
8262         * expression.cs (Cast.TryReduce): If we're in checked syntax,
8263         check constant ranges and report a CS0221.  Fixes #33186.
8264
8265 2002-11-24  Martin Baulig  <martin@ximian.com>
8266
8267         * cs-parser.jay: Make this work for uninitialized variable
8268         declarations in the `for' initializer.  Fixes #32416.
8269
8270 2002-11-24  Martin Baulig  <martin@ximian.com>
8271
8272         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
8273         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
8274
8275 2002-11-24  Martin Baulig  <martin@ximian.com>
8276
8277         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
8278         argument; if true, we also check for user-defined conversions.
8279         This is only needed if both arguments are of a user-defined type.
8280         Fixes #30443, added test-175.cs.
8281         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
8282
8283         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
8284
8285 2002-11-24  Martin Baulig  <martin@ximian.com>
8286
8287         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
8288         function to get the store opcode.
8289         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
8290         only emit the Ldelema if the store opcode is Stobj.  You must run
8291         both test-34 and test-167 to test this.  Fixes #34529.
8292
8293 2002-11-23  Martin Baulig  <martin@ximian.com>
8294
8295         * ecore.cs (Expression.MemberLookup): Added additional
8296         `qualifier_type' argument which is used when we're being called
8297         from MemberAccess.DoResolve() and null if we're called from a
8298         SimpleName lookup.
8299         (Expression.MemberLookupFailed): New method to report errors; this
8300         does the CS1540 check and reports the correct error message.
8301
8302         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
8303         argument for the CS1540 check and redone the way how we're dealing
8304         with private members.  See the comment in the source code for details.
8305         (FilterWithClosure): Reverted this back to revision 1.197; renamed
8306         `closure_start_type' to `closure_qualifier_type' and check whether
8307         it's not null.  It was not this filter being broken, it was just
8308         being called with the wrong arguments.
8309
8310         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
8311         and pass it the correct `qualifier_type'; this also does the error
8312         handling for us.
8313
8314 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
8315
8316         * expression.cs (Invocation.EmitParams): If the we are dealing
8317         with a non-built-in value type, load its address as well.
8318
8319         (ArrayCreation): Use a a pretty constant instead
8320         of the hardcoded value 2.   Use 6 instead of 2 for the number of
8321         static initializers.  
8322
8323         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
8324         because they are not really value types, just glorified integers. 
8325
8326         * driver.cs: Do not append .exe, the CSC compiler does not do it.
8327
8328         * ecore.cs: Remove redundant code for enumerations, make them use
8329         the same code path as everything else, fixes the casting issue
8330         with enumerations in Windows.Forms.
8331
8332         * attribute.cs: Do only cast to string if it is a string, the
8333         validation happens later.
8334
8335         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
8336         people upgrade their corlibs.
8337
8338         * ecore.cs: Oops, enumerations were not following the entire code path
8339
8340 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
8341
8342         * typemanager.cs (FilterWithClosure): Commented out the test for
8343         1540 in typemanager.cs, as it has problems when accessing
8344         protected methods from a parent class (see test-174.cs). 
8345
8346         * attribute.cs (Attribute.ValidateGuid): new method.
8347         (Attribute.Resolve): Use above.
8348
8349 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
8350
8351         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
8352
8353         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
8354         handling for enumerations, as we only needed the TypeContainer
8355         functionality to begin with (this is required for the fix below to
8356         work for enums that reference constants in a container class for
8357         example). 
8358
8359         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
8360
8361         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
8362         a valid TypeBuilder to perform lookups on.o
8363
8364         * class.cs (InheritableMemberSignatureCompare): Use true in the
8365         call to GetGetMethod and GetSetMethod, because we are comparing
8366         the signature, and we need to get the methods *even* if they are
8367         private. 
8368
8369         (PropertyBase.CheckBase): ditto.
8370
8371         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
8372         GotoCase.Resolve): Use Peel on EmpytCasts.
8373
8374         * ecore.cs (EmptyCast): drop child, add Peel method.
8375
8376 2002-11-17  Martin Baulig  <martin@ximian.com>
8377
8378         * ecore.cs (EmptyCast.Child): New public property.
8379
8380         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
8381         label resolved to an EmptyCast.  Fixes #34162.
8382         (GotoCase.Resolve): Likewise.
8383         (Block.EmitMeta): Likewise.
8384
8385 2002-11-17  Martin Baulig  <martin@ximian.com>
8386
8387         * expression.cs (Invocation.BetterConversion): Prefer int over
8388         uint; short over ushort; long over ulong for integer literals.
8389         Use ImplicitConversionExists instead of StandardConversionExists
8390         since we also need to check for user-defined implicit conversions.
8391         Fixes #34165.  Added test-173.cs.
8392
8393 2002-11-16  Martin Baulig  <martin@ximian.com>
8394
8395         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
8396         with the `true' and `false' literals.  Fixes #33151.
8397
8398 2002-11-16  Martin Baulig  <martin@ximian.com>
8399
8400         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
8401         October 22nd; don't do the cs1540 check for static members.
8402
8403         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
8404         now using our own filter here and doing the cs1540 check again.
8405
8406 2002-11-16  Martin Baulig  <martin@ximian.com>
8407
8408         * support.cs (InternalParameters): Don't crash if we don't have
8409         any fixed parameters.  Fixes #33532.
8410
8411 2002-11-16  Martin Baulig  <martin@ximian.com>
8412
8413         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
8414         when looking up static methods to make this work on Windows.
8415         Fixes #33773.
8416
8417 2002-11-16  Martin Baulig  <martin@ximian.com>
8418
8419         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
8420         a setter rather than using PropertyInfo.CanWrite.
8421
8422 2002-11-15  Nick Drochak  <ndrochak@gol.com>
8423
8424         * class.cs: Allow acces to block member by subclasses. Fixes build
8425         breaker.
8426
8427 2002-11-14  Martin Baulig  <martin@ximian.com>
8428
8429         * class.cs (Constructor.Emit): Added the extern/block check.
8430         Fixes bug #33678.
8431
8432 2002-11-14  Martin Baulig  <martin@ximian.com>
8433
8434         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
8435         iteration while looking for indexers, this is needed because the
8436         indexer may have a different name in our base classes.  Fixed the
8437         error reporting (no indexers at all, not get accessor, no
8438         overloaded match).  Fixes bug #33089.
8439         (IndexerAccess.DoResolveLValue): Likewise.
8440
8441 2002-11-14  Martin Baulig  <martin@ximian.com>
8442
8443         * class.cs (PropertyBase.CheckBase): Make this work for multiple
8444         indexers.  Fixes the first part of bug #33089.
8445         (MethodSignature.InheritableMemberSignatureCompare): Added support
8446         for properties.
8447
8448 2002-11-13  Ravi Pratap  <ravi@ximian.com>
8449
8450         * attribute.cs (Attribute.Resolve): Catch the
8451         NullReferenceException and report it since it isn't supposed to
8452         happen. 
8453
8454 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
8455
8456         * expression.cs (Binary.EmitBranchable): Also handle the cases for
8457         LogicalOr and LogicalAnd that can benefit from recursively
8458         handling EmitBranchable.  The code now should be nice for Paolo.
8459
8460 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
8461
8462         * typemanager.cs (LookupType): Added a negative-hit hashtable for
8463         the Type lookups, as we perform quite a number of lookups on
8464         non-Types.  This can be removed once we can deterministically tell
8465         whether we have a type or a namespace in advance.
8466
8467         But this might require special hacks from our corlib.
8468
8469         * TODO: updated.
8470
8471         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
8472         and double which avoids a conversion from an integer to a double.
8473
8474         * expression.cs: tiny optimization, avoid calling IsConstant,
8475         because it effectively performs the lookup twice.
8476
8477 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
8478
8479         But a bogus return here to keep the semantics of the old code
8480         until the Mono runtime is fixed.
8481
8482         * pending.cs (GetMissingInterfaces): New method used to remove all
8483         the interfaces that are already implemented by our parent
8484         classes from the list of pending methods. 
8485
8486         * interface.cs: Add checks for calls after ResolveTypeExpr.
8487
8488 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
8489
8490         * class.cs (Class.Emit): Report warning 67: event not used if the
8491         warning level is beyond 3.
8492
8493         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
8494         being a NullLiteral.
8495
8496         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
8497         specifiers. 
8498
8499         * class.cs (TypeContainer.GetClassBases): Cover a missing code
8500         path that might fail if a type can not be resolved.
8501
8502         * expression.cs (Binary.Emit): Emit unsigned versions of the
8503         operators. 
8504
8505         * driver.cs: use error 5.
8506
8507 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
8508
8509         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
8510
8511 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
8512
8513         * cs-parser.jay (switch_section): A beautiful patch from Martin
8514         Baulig that fixed 33094.
8515
8516 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
8517
8518         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
8519         Check whether the base is abstract and report an error if so.
8520
8521         * expression.cs (IndexerAccess.DoResolveLValue,
8522         IndexerAccess.DoResolve): ditto. 
8523
8524         (Invocation.DoResolve): ditto.
8525
8526         (Invocation.FullMethodDesc): Improve the report string.
8527
8528         * statement.cs (Block): Eliminate IsVariableDefined as it is
8529         basically just a wrapper for GetVariableInfo.
8530
8531         * ecore.cs (SimpleName): Use new 
8532
8533         * support.cs (ReflectionParamter.ParameterType): We unwrap the
8534         type, as we return the actual parameter ref/unref state on a
8535         different call.
8536
8537 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
8538
8539         * support.cs: Return proper flags REF/OUT fixing the previous
8540         commit.  
8541
8542         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
8543         not used to mean `ref' but `ref or out' in ParameterReference
8544
8545         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
8546         full type signature instead of calling TypeManger.CSharpName
8547         ourselves. 
8548
8549         * support.cs (InternalParameters.ParameterDesc): Do not compare
8550         directly to the modflags, because REF/OUT will actually be bitsets
8551         if set. 
8552
8553         * delegate.cs (VerifyMethod): Check also the modifiers.
8554
8555         * cs-tokenizer.cs: Fix bug where floating point values with an
8556         exponent where a sign was missing was ignored.
8557
8558         * driver.cs: Allow multiple assemblies to be specified in a single
8559         /r: argument
8560
8561 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
8562
8563         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
8564         because identifiers after a parenthesis would end up in this kind
8565         of production, and we needed to desamiguate it for having casts
8566         like:
8567
8568                 (UserDefinedType *) xxx
8569
8570 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
8571
8572         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
8573         we should set on the Bindingflags.NonPublic, but not turn on
8574         private_ok.  private_ok controls whether a Private member is
8575         returned (this is chekced on the filter routine), while the
8576         BindingFlags.NonPublic just controls whether private/protected
8577         will be allowed.   This fixes the problem part of the problem of
8578         private properties being allowed to be used in derived classes.
8579
8580         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
8581         so we can call the children DoResolveLValue method (this will
8582         properly signal errors on lvalue assignments to base properties)
8583
8584         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
8585         getter are null, and we have a property info, we know that this
8586         happened because the lookup failed, so we report an error 122 for
8587         protection level violation.
8588
8589         We also silently return if setter and getter are null in the
8590         resolve functions, this condition only happens if we have flagged
8591         the error before.  This is the other half of the problem. 
8592
8593         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
8594         not have accessibility information, that is why we were returning
8595         true in the filter function in typemanager.cs.
8596
8597         To properly report 122 (property is inaccessible because of its
8598         protection level) correctly, we report this error in ResolveAccess
8599         by failing if both the setter and the getter are lacking (ie, the
8600         lookup failed). 
8601
8602         DoResolve and DoLResolve have been modified to check for both
8603         setter/getter being null and returning silently, the reason being
8604         that I did not want to put the knowledge about this error in upper
8605         layers, like:
8606
8607         int old = Report.Errors;
8608         x = new PropertyExpr (...);
8609         if (old != Report.Errors)
8610                 return null;
8611         else
8612                 return x;
8613
8614         So the property expr is returned, but it is invalid, so the error
8615         will be flagged during the resolve process. 
8616
8617         * class.cs: Remove InheritablePropertySignatureCompare from the
8618         class, as we no longer depend on the property signature to compute
8619         whether it is possible to implement a method or not.
8620
8621         The reason is that calling PropertyInfo.GetGetMethod will return
8622         null (in .NET, in Mono it works, and we should change this), in
8623         cases where the Get Method does not exist in that particular
8624         class.
8625
8626         So this code:
8627
8628         class X { public virtual int A { get { return 1; } } }
8629         class Y : X { }
8630         class Z : Y { public override int A { get { return 2; } } }
8631
8632         Would fail in Z because the parent (Y) would not have the property
8633         defined.  So we avoid this completely now (because the alternative
8634         fix was ugly and slow), and we now depend exclusively on the
8635         method names.
8636
8637         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8638         reference method, instead of using the property.
8639
8640         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8641         routines are gone now.
8642
8643         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8644         names, they were incorrectly named.
8645
8646         * cs-tokenizer.cs: Return are more gentle token on failure. 
8647
8648         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8649         had an out-of-sync index variable, which caused it to remove from
8650         the list of pending methods the wrong method sometimes.
8651
8652 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8653
8654         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8655         CanWrite, because those refer to this particular instance of the
8656         property, and do not take into account the fact that we can
8657         override single members of a property.
8658
8659         Constructor requires an EmitContext.  The resolution process does
8660         not happen here, but we need to compute the accessors before,
8661         because the resolution does not always happen for properties.
8662
8663         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8664         subclass, before we did not update this flag, but we did update
8665         bindingflags. 
8666
8667         (GetAccessors): Drop this routine, as it did not work in the
8668         presence of partially overwritten set/get methods. 
8669
8670         Notice that this broke the cs1540 detection, but that will require
8671         more thinking. 
8672
8673 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8674
8675         * class.cs:
8676         * codegen.cs:
8677         * driver.cs: issue a warning instead of an error if we don't support
8678         debugging for the platform. Also ignore a couple of errors that may
8679         arise when trying to write the symbols. Undo my previous patch.
8680
8681 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8682
8683         * driver.cs: ignore /debug switch except for Unix platforms.
8684
8685 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8686
8687         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8688
8689 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8690
8691         * driver.cs: Do not make mcs-debug conditional, so we do not break
8692         builds that use it.
8693
8694         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8695         review this patch.  But basically after all the children variables
8696         have been merged, the value of "Breaks" was not being set to
8697         new_breaks for Switch blocks.  I think that it should be set after
8698         it has executed.  Currently I set this to the value of new_breaks,
8699         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8700         conservative, but I do not understand this code very well.
8701
8702         I did not break anything in the build, so that is good ;-)
8703
8704         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8705
8706 2002-10-20  Mark Crichton  <crichton@gimp.org>
8707
8708         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8709
8710 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8711
8712         * cfold.cs: Fixed compile blocker.
8713
8714 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8715
8716         * driver.cs: I was chekcing the key, not the file.
8717
8718 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8719
8720         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8721         message that we were generating - we just need to silently return
8722         a null.
8723
8724 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8725
8726         * class.cs (Event.Define): Change my previous commit, as this
8727         breaks the debugger.  This is a temporary hack, as it seems like
8728         the compiler is generating events incorrectly to begin with.
8729
8730         * expression.cs (Binary.ResolveOperator): Added support for 
8731         "U operator - (E x, E y)"
8732
8733         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8734         y)".
8735
8736         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8737         init-only variables, but this path did not take into account that
8738         there might be also instance readonly variables.  Correct this
8739         problem. 
8740
8741         This fixes bug 32253
8742
8743         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8744         delegates as well.
8745
8746         * driver.cs: Change the extension for modules to `netmodule'
8747
8748         * cs-parser.jay: Improved slightly the location tracking for
8749         the debugger symbols.
8750
8751         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8752         modifiers that were specified instead of the hardcoded value
8753         (FamAndAssem).  This was basically ignoring the static modifier,
8754         and others.  Fixes 32429.
8755
8756         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8757         fixed a bug in the process (32476)
8758
8759         * expression.cs (ArrayAccess.EmitAssign): Patch from
8760         hwang_rob@yahoo.ca that fixes bug 31834.3
8761
8762 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8763
8764         * driver.cs: Make the module extension .netmodule.
8765
8766 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8767
8768         * driver.cs: Report an error if the resource file is not found
8769         instead of crashing.
8770
8771         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8772         false, like Emit does.
8773
8774 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8775
8776         * typemanager.cs: Remove unused private member.  Also reported mcs
8777         bug to report this as a warning like csc.
8778
8779 2002-10-15  Martin Baulig  <martin@gnome.org>
8780
8781         * statement.cs (Statement.Emit): Made this a virtual method; emits
8782         the line number info and calls DoEmit().
8783         (Statement.DoEmit): New protected abstract method, formerly knows
8784         as Statement.Emit().
8785
8786         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8787
8788 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8789
8790         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8791         have fixed a remaining problem: not every AddXXXX was adding a
8792         fully qualified name.  
8793
8794         Now everyone registers a fully qualified name in the DeclSpace as
8795         being defined instead of the partial name.  
8796
8797         Downsides: we are slower than we need to be due to the excess
8798         copies and the names being registered this way.  
8799
8800         The reason for this is that we currently depend (on the corlib
8801         bootstrap for instance) that types are fully qualified, because
8802         we dump all the types in the namespace, and we should really have
8803         types inserted into the proper namespace, so we can only store the
8804         basenames in the defined_names array.
8805
8806 2002-10-10  Martin Baulig  <martin@gnome.org>
8807
8808         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8809         from bug #31834, see the bug report for a testcase which is
8810         miscompiled.
8811
8812 2002-10-10  Martin Baulig  <martin@gnome.org>
8813
8814         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8815         flow analysis code for this.
8816
8817         * statement.cs (Do, While, For): Tell the flow analysis code about
8818         infinite loops.
8819         (FlowBranching.UsageVector): Added support for infinite loops.
8820         (Block.Resolve): Moved the dead code elimination here and use flow
8821         analysis to do it.
8822
8823 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8824
8825         * class.cs (Field.Define): Catch cycles on struct type
8826         definitions. 
8827
8828         * typemanager.cs (IsUnmanagedtype): Do not recursively check
8829         fields if the fields are static.  We only need to check instance
8830         fields. 
8831
8832         * expression.cs (As.DoResolve): Test for reference type.
8833
8834         * statement.cs (Using.ResolveExpression): Use
8835         ConvertImplicitRequired, not ConvertImplicit which reports an
8836         error on failture
8837         (Using.ResolveLocalVariableDecls): ditto.
8838
8839         * expression.cs (Binary.ResolveOperator): Report errors in a few
8840         places where we had to.
8841
8842         * typemanager.cs (IsUnmanagedtype): Finish implementation.
8843
8844 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
8845
8846         * expression.cs: Use StoreFromPtr instead of extracting the type
8847         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
8848
8849         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
8850         an enumeration value to a System.Enum, but System.Enum is not a
8851         value type, but an class type, so we need to box.
8852
8853         (Expression.ConvertExplicit): One codepath could return
8854         errors but not flag them.  Fix this.  Fixes #31853
8855
8856         * parameter.cs (Resolve): Do not allow void as a parameter type.
8857
8858 2002-10-06  Martin Baulig  <martin@gnome.org>
8859
8860         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
8861         if it's a class type and not a struct.  Fixes #31815.
8862
8863 2002-10-06  Martin Baulig  <martin@gnome.org>
8864
8865         * statement.cs: Reworked the flow analysis code a bit to make it
8866         usable for dead code elimination.
8867
8868 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8869
8870         * cs-parser.jay: allow empty source files. Fixes bug #31781.
8871
8872 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8873
8874         * expression.cs (ComposedCast.DoResolveType): A quick workaround
8875         to fix the test 165, will investigate deeper.
8876
8877 2002-10-04  Martin Baulig  <martin@gnome.org>
8878
8879         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
8880         finally blocks actually work.
8881         (Try.Resolve): We don't need to create a sibling for `finally' if
8882         there is no finally block.
8883
8884 2002-10-04  Martin Baulig  <martin@gnome.org>
8885
8886         * class.cs (Constructor.Define): The default accessibility for a
8887         non-default constructor is private, not public.
8888
8889 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8890
8891         * class.cs (Constructor): Make AllowedModifiers public, add
8892         EXTERN.
8893
8894         * cs-parser.jay: Perform the modifiers test here, as the
8895         constructor for the Constructor class usually receives a zero
8896         because of the way we create it (first we create, later we
8897         customize, and we were never checking the modifiers).
8898
8899         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
8900         is a version of LookupTypeReflection that includes the type-name
8901         cache.  This can be used as a fast path for functions that know
8902         the fully qualified name and are only calling into *.GetType() to
8903         obtain a composed type.
8904
8905         This is also used by TypeManager.LookupType during its type
8906         composition.
8907
8908         (LookupType): We now also track the real type name, as sometimes
8909         we can get a quey for the real type name from things like
8910         ComposedCast.  This fixes bug 31422.
8911
8912         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
8913         complete type fullname, it does not have to go through the type
8914         resolution system to obtain the composed version of the type (for
8915         obtaining arrays or pointers).
8916
8917         (Conditional.Emit): Use the EmitBoolExpression to
8918         generate nicer code, as requested by Paolo.
8919
8920         (ArrayCreation.CheckIndices): Use the patch from
8921         hwang_rob@yahoo.ca to validate the array initializers. 
8922
8923 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
8924
8925         * class.cs (ConstructorInitializer.Emit): simplify code by using
8926         Invocation.EmitCall, and at the same time, fix the bugs in calling
8927         parent constructors that took variable arguments. 
8928
8929         * ecore.cs (Expression.ConvertNumericExplicit,
8930         Expression.ImplicitNumericConversion): Remove the code that
8931         manually wrapped decimal (InternalTypeConstructor call is now gone
8932         as well).
8933
8934         * expression.cs (Cast.TryReduce): Also handle decimal types when
8935         trying to perform a constant fold on the type.
8936
8937         * typemanager.cs (IsUnmanagedtype): Partially implemented.
8938
8939         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
8940         that only turned off an error report, and did nothing else. 
8941
8942 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
8943
8944         * driver.cs: Handle and ignore /fullpaths
8945
8946 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
8947
8948         * expression.cs (Binary.ResolveOperator): Catch the case where
8949         DoNumericPromotions returns true, 
8950
8951         (Binary.DoNumericPromotions): Simplify the code, and the tests.
8952
8953 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
8954
8955         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
8956         report error 70.
8957
8958 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
8959
8960         * ecore.cs (ConvertNumericExplicit): It is not enough that the
8961         conversion exists, but it is also required that the conversion be
8962         performed.  This manifested in "(Type64Enum) 2".  
8963
8964         * class.cs (TypeManager.AddMethod): The fix is not to change
8965         AddEnum, because that one was using a fully qualified name (every
8966         DeclSpace derivative does), but to change the AddMethod routine
8967         that was using an un-namespaced name.  This now correctly reports
8968         the duplicated name.
8969
8970         Revert patch until I can properly fix it.  The issue
8971         is that we have a shared Type space across all namespaces
8972         currently, which is wrong.
8973
8974         Options include making the Namespace a DeclSpace, and merge
8975         current_namespace/current_container in the parser.
8976
8977 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
8978
8979         * cs-parser.jay: Improve error reporting when we get a different
8980         kind of expression in local_variable_type and
8981         local_variable_pointer_type. 
8982
8983         Propagate this to avoid missleading errors being reported.
8984
8985         * ecore.cs (ImplicitReferenceConversion): treat
8986         TypeManager.value_type as a target just like object_type.   As
8987         code like this:
8988
8989         ValueType v = 1;
8990
8991         Is valid, and needs to result in the int 1 being boxed before it
8992         is assigned to the value type v.
8993
8994         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8995         to validate the enumeration name.
8996
8997         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8998         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8999         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
9000
9001         * ecore.cs (TryImplicitIntConversion): When doing an
9002         implicit-enumeration-conversion, check if the type is 64-bits and
9003         perform a conversion before passing to EnumConstant.
9004
9005 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
9006
9007         * decl.cs (Error_AmbiguousTypeReference); New routine used to
9008         report ambiguous type references.  Unlike the MS version, we
9009         report what the ambiguity is.   Innovation at work ;-)
9010
9011         (DeclSpace.FindType): Require a location argument to
9012         display when we display an ambiguous error.
9013
9014         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
9015
9016         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
9017
9018         * expression.cs (EmitDynamicInitializers): Apply patch from
9019         hwang_rob@yahoo.ca that fixes the order in which we emit our
9020         initializers. 
9021
9022 2002-09-21  Martin Baulig  <martin@gnome.org>
9023
9024         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
9025         delegate takes no arguments.
9026
9027 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
9028
9029         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
9030         from integers.
9031
9032         * expression.cs: Extract the underlying type.
9033
9034         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
9035
9036         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
9037
9038 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
9039
9040         * class.cs (TypeContainer.DefineType): We can not use the nice
9041         PackingSize with the size set to 1 DefineType method, because it
9042         will not allow us to define the interfaces that the struct
9043         implements.
9044
9045         This completes the fixing of bug 27287
9046
9047         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
9048         means also structs.  This fixes part of the problem. 
9049         (Expresion.ImplicitReferenceConversionExists): ditto.
9050
9051         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
9052         error if there were no errors reported during the type lookup
9053         process, to avoid duplicates or redundant errors.  Without this
9054         you would get an ambiguous errors plus a type not found.  We have
9055         beaten the user enough with the first error.  
9056
9057         (DeclSparce.FindType): Emit a warning if we have an ambiguous
9058         reference. 
9059
9060         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
9061         during the resolution process, stop the lookup, this avoids
9062         repeated error reports (same error twice).
9063
9064         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
9065
9066         * typemanager.cs (LookupType): Redo the type lookup code to match
9067         the needs of System.Reflection.  
9068
9069         The issue is that System.Reflection requires references to nested
9070         types to begin with a "+" sign instead of a dot.  So toplevel
9071         types look like: "NameSpace.TopLevelClass", and nested ones look
9072         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
9073         levels. 
9074
9075 2002-09-19  Martin Baulig  <martin@gnome.org>
9076
9077         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
9078         says that a method always returns or always throws an exception,
9079         don't report the CS0161.
9080
9081         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
9082         set `Returns = new_returns'.
9083
9084 2002-09-19  Martin Baulig  <martin@gnome.org>
9085
9086         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
9087         to an enum constant, check for a CS0176.
9088
9089 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
9090
9091         * class.cs (TypeContainer.CheckPairedOperators): Now we check
9092         for operators that must be in pairs and report errors.
9093
9094         * ecore.cs (SimpleName.DoResolveType): During the initial type
9095         resolution process, when we define types recursively, we must
9096         check first for types in our current scope before we perform
9097         lookups in the enclosing scopes.
9098
9099         * expression.cs (MakeByteBlob): Handle Decimal blobs.
9100
9101         (Invocation.VerifyArgumentsCompat): Call
9102         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
9103         I thought we were supposed to always call this, but there are a
9104         few places in the code where we dont do it.
9105
9106 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
9107
9108         * driver.cs: Add support in -linkres and -resource to specify the
9109         name of the identifier.
9110
9111 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
9112
9113         * ecore.cs (StandardConversionExists): Sync with the conversion
9114         code: allow anything-* to void* conversions.
9115
9116         (FindMostSpecificSource): Use an Expression argument
9117         instead of a Type, because we might be handed over a Literal which
9118         gets a few more implicit conversions that plain types do not.  So
9119         this information was being lost.
9120
9121         Also, we drop the temporary type-holder expression when not
9122         required.
9123
9124 2002-09-17  Martin Baulig  <martin@gnome.org>
9125
9126         * class.cs (PropertyBase.CheckBase): Don't check the base class if
9127         this is an explicit interface implementation.
9128
9129 2002-09-17  Martin Baulig  <martin@gnome.org>
9130
9131         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
9132         different `IndexerName' attributes.
9133
9134         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
9135         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
9136         virtual CommonResolve().
9137
9138 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
9139
9140         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
9141         and convert that to the UnderlyingType.
9142
9143         * statement.cs (Foreach.Resolve): Indexers are just like variables
9144         or PropertyAccesses.
9145
9146         * cs-tokenizer.cs (consume_string): Track line numbers and columns
9147         inside quoted strings, we were not doing this before.
9148
9149 2002-09-16  Martin Baulig  <martin@gnome.org>
9150
9151         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
9152         resolve it.  This is needed for the definite assignment check of the
9153         instance expression, fixes bug #29846.
9154         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
9155
9156 2002-09-16  Nick Drochak  <ndrochak@gol.com>
9157
9158         * parameter.cs: Fix compile error.  Cannot reference static member
9159         from an instance object.  Is this an mcs bug?
9160
9161 2002-09-14  Martin Baulig  <martin@gnome.org>
9162
9163         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
9164         multiple times.  Fixes bug #30295, added test-166.cs.
9165
9166 2002-09-14  Martin Baulig  <martin@gnome.org>
9167
9168         * statement.cs (Block.Emit): Don't emit unreachable code.
9169         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
9170         `break' statements.
9171         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
9172
9173 2002-09-14  Martin Baulig  <martin@gnome.org>
9174
9175         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
9176         is set.
9177
9178 2002-09-14  Martin Baulig  <martin@gnome.org>
9179
9180         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
9181         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
9182         be false on the ms runtime.
9183
9184 2002-09-13  Martin Baulig  <martin@gnome.org>
9185
9186         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
9187         the CS0038 error message.
9188
9189 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
9190
9191         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
9192         constant inside, return it.
9193
9194 2002-09-12  Martin Baulig  <martin@gnome.org>
9195
9196         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
9197         implicit conversion can be done between enum types.
9198
9199         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
9200         check whether an implicit conversion to the current enum's UnderlyingType
9201         exists and report an error if not.
9202
9203         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
9204         without debugging support.
9205
9206         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
9207         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
9208
9209 2002-09-12  Martin Baulig  <martin@gnome.org>
9210
9211         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
9212
9213         * ecore.cs (IMemberExpr.DeclaringType): New property.
9214         (SimpleName.SimpleNameResolve): Check whether we're accessing a
9215         nonstatic member of an outer type (CS0038).
9216
9217 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
9218
9219         * driver.cs: Activate the using-error detector at warning level
9220         4 (at least for MS-compatible APIs).
9221
9222         * namespace.cs (VerifyUsing): Small buglett fix.
9223
9224         * pending.cs (PendingImplementation): pass the container pointer. 
9225
9226         * interface.cs (GetMethods): Allow for recursive definition.  Long
9227         term, I would like to move every type to support recursive
9228         definitions, not the current ordering mechanism that we have right
9229         now.
9230
9231         The situation is this: Attributes are handled before interfaces,
9232         so we can apply attributes to interfaces.  But some attributes
9233         implement interfaces, we will now handle the simple cases
9234         (recursive definitions will just get an error).  
9235
9236         * parameter.cs: Only invalidate types at the end if we fail to
9237         lookup all types.  
9238
9239 2002-09-09  Martin Baulig  <martin@gnome.org>
9240
9241         * ecore.cs (PropertyExpr.Emit): Also check for
9242         TypeManager.system_int_array_get_length so this'll also work when
9243         compiling corlib.  Fixes #30003.
9244
9245 2002-09-09  Martin Baulig  <martin@gnome.org>
9246
9247         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
9248         and throw an exception if we can't get the type's size.  Fixed #30040,
9249         added test-165.cs.
9250
9251 2002-09-09  Martin Baulig  <martin@gnome.org>
9252
9253         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
9254
9255         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
9256         context.  Fixes bug #30027.
9257
9258         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
9259         virtual functions.  Fixes bug #30043, added test-164.cs.
9260
9261 2002-09-08  Ravi Pratap  <ravi@ximian.com>
9262
9263         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
9264
9265 2002-09-08  Nick Drochak  <ndrochak@gol.com>
9266
9267         * driver.cs: Use an object to get the windows codepage since it's not a
9268         static property.
9269
9270 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
9271
9272         * statement.cs (For.Emit): for infinite loops (test == null)
9273         return whether there is a break inside, not always "true".
9274
9275         * namespace.cs (UsingEntry): New struct to hold the name of the
9276         using definition, the location where it is defined, and whether it
9277         has been used in a successful type lookup.
9278
9279         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
9280         strings.
9281
9282         * decl.cs: ditto.
9283
9284 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9285
9286         * attribute.cs : Fix incorrect code which relied on catching
9287         a NullReferenceException to detect a null being passed in
9288         where an object was expected.
9289
9290 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
9291
9292         * statement.cs (Try): flag the catch variable as assigned
9293
9294         * expression.cs (Cast): Simplified by using ResolveType instead of
9295         manually resolving.
9296
9297         * statement.cs (Catch): Fix bug by using ResolveType.
9298
9299 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9300
9301         * expression.cs (BetterConversion): Special case for when we have
9302         a NullLiteral as the argument and we have to choose between string
9303         and object types - we choose string the way csc does.
9304
9305         * attribute.cs (Attribute.Resolve): Catch the
9306         NullReferenceException and report error #182 since the Mono
9307         runtime no more has the bug and having this exception raised means
9308         we tried to select a constructor which takes an object and is
9309         passed a null.
9310
9311 2002-09-05  Ravi Pratap  <ravi@ximian.com>
9312
9313         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
9314         message (1502, 1503) when we can't locate a method after overload
9315         resolution. This is much more informative and closes the bug
9316         Miguel reported.
9317
9318         * interface.cs (PopulateMethod): Return if there are no argument
9319         types. Fixes a NullReferenceException bug.
9320
9321         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
9322         expressions too. Previously we were checking only in one place for
9323         positional arguments leaving out named arguments.
9324
9325         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
9326         type to the enum type is not allowed. Remove code corresponding to
9327         that.
9328
9329         (ConvertNumericExplicit): Allow explicit conversions from
9330         the underlying type to enum type. This precisely follows the spec
9331         and closes a bug filed by Gonzalo.
9332
9333 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9334
9335         * compiler.csproj:
9336         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
9337
9338 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
9339
9340         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
9341         it was important that we stored the right value after the
9342         reduction in `converted'.
9343
9344 2002-09-04  Martin Baulig  <martin@gnome.org>
9345
9346         * location.cs (Location.SymbolDocument): Use full pathnames for the
9347         source files.
9348
9349 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
9350
9351         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
9352         of the expression resolve mechanism, because that will catch the
9353         SimpleName error failures.
9354
9355         (Conditional): If we can not resolve the
9356         expression, return, do not crash.
9357
9358 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9359
9360         * cs-tokenizer.cs:
9361         (location): display token name instead of its number.
9362
9363 2002-08-28  Martin Baulig  <martin@gnome.org>
9364
9365         * expression.cs (Binary.ResolveOperator): Don't silently return
9366         but return an error if an operator cannot be applied between two
9367         enum types.
9368
9369 2002-08-28  Martin Baulig  <martin@gnome.org>
9370
9371         * class.cs (Constructor.Define): Set the permission attributes
9372         correctly instead of making all constructors public.
9373
9374 2002-08-28  Martin Baulig  <martin@gnome.org>
9375
9376         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
9377         for private members before reporting a CS0103; if we find anything,
9378         it's a CS0122.
9379
9380 2002-08-28  Martin Baulig  <martin@gnome.org>
9381
9382         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
9383         to check whether `closure_start_type == closure_invocation_type',
9384         we also need to check whether `m.DeclaringType == closure_invocation_type'
9385         before bypassing the permission checks.  We might be accessing
9386         protected/private members from the base class.
9387         (TypeManager.RealMemberLookup): Only set private_ok if private
9388         members were requested via BindingFlags.NonPublic.
9389
9390         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
9391
9392         * expression.cs (MemberAccess.ResolveMemberAccess): Set
9393         MethodGroupExpr.IsExplicitImpl if appropriate.
9394         (Invocation.DoResolve): Don't report the CS0120 for explicit
9395         interface implementations.
9396
9397 2002-08-27  Martin Baulig  <martin@gnome.org>
9398
9399         * expression.cs (Invocation.DoResolve): If this is a static
9400         method and we don't have an InstanceExpression, we must report
9401         a CS0120.
9402
9403 2002-08-25  Martin Baulig  <martin@gnome.org>
9404
9405         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
9406         `==' between a valuetype and an object.
9407
9408 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
9409
9410         * ecore.cs (TypeExpr): Provide a ToString method.
9411
9412 2002-08-24  Martin Baulig  <martin@gnome.org>
9413
9414         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
9415         now called proggie.dbg and it's a binary file.
9416
9417 2002-08-23  Martin Baulig  <martin@gnome.org>
9418
9419         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
9420
9421 2002-08-23  Martin Baulig  <martin@gnome.org>
9422
9423         * struct.cs (MyStructInfo.ctor): Make this work with empty
9424         structs; it's not allowed to use foreach() on null.
9425
9426 2002-08-23  Martin Baulig  <martin@gnome.org>
9427
9428         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
9429         writer the full pathname of the generated assembly.
9430
9431 2002-08-23  Martin Baulig  <martin@gnome.org>
9432
9433         * statements.cs (FlowBranching.UsageVector.MergeChildren):
9434         A `finally' block never returns or breaks; improved handling of
9435         unreachable code.
9436
9437 2002-08-23  Martin Baulig  <martin@gnome.org>
9438
9439         * statement.cs (Throw.Resolve): Allow `throw null'.
9440
9441 2002-08-23  Martin Baulig  <martin@gnome.org>
9442
9443         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
9444         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
9445         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
9446         MemberLookup would return a wrong event if this is an explicit
9447         interface implementation and the class has an event with the same
9448         name.
9449
9450 2002-08-23  Martin Baulig  <martin@gnome.org>
9451
9452         * statement.cs (Block.AddChildVariableNames): New public method.
9453         (Block.AddChildVariableName): Likewise.
9454         (Block.IsVariableNameUsedInChildBlock): Likewise.
9455         (Block.AddVariable): Check whether a variable name has already
9456         been used in a child block.
9457
9458         * cs-parser.jay (declare_local_variables): Mark all variable names
9459         from the current block as being used in a child block in the
9460         implicit block.
9461
9462 2002-08-23  Martin Baulig  <martin@gnome.org>
9463
9464         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
9465         find the symbol writer.
9466
9467         * driver.cs: csc also allows the arguments to /define being
9468         separated by commas, not only by semicolons.
9469
9470 2002-08-23  Martin Baulig  <martin@gnome.org>
9471
9472         * interface.cs (Interface.GetMembers): Added static check for events.
9473
9474 2002-08-15  Martin Baulig  <martin@gnome.org>
9475
9476         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
9477         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
9478
9479         * ecore.cs (Expression.MemberLookup): Added documentation and explained
9480         why the MethodData.EmitDestructor() change was necessary.
9481
9482 2002-08-20  Martin Baulig  <martin@gnome.org>
9483
9484         * class.cs (TypeContainer.FindMembers): Added static check for events.
9485
9486         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
9487
9488         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
9489         use Type.GetEvents(), not Type.FindMembers().
9490
9491 2002-08-20  Martin Baulig  <martin@gnome.org>
9492
9493         * decl.cs (MemberCache): Added a special method cache which will
9494         be used for method-only searched.  This ensures that a method
9495         search will return a MethodInfo with the correct ReflectedType for
9496         inherited methods.      
9497
9498 2002-08-20  Martin Baulig  <martin@gnome.org>
9499
9500         * decl.cs (DeclSpace.FindMembers): Made this public.
9501
9502 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9503
9504         * delegate.cs: fixed build on windows.
9505         [FIXME:  Filed as bug #29150: MCS must report these errors.]
9506
9507 2002-08-19  Ravi Pratap  <ravi@ximian.com>
9508
9509         * ecore.cs (StandardConversionExists): Return a false
9510         if we are trying to convert the void type to anything else
9511         since that is not allowed.
9512
9513         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
9514         we flag error 70 in the event an event is trying to be accessed
9515         directly from outside the declaring type.
9516
9517 2002-08-20  Martin Baulig  <martin@gnome.org>
9518
9519         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
9520         MemberCache from typemanager.cs to decl.cs.
9521
9522 2002-08-19  Martin Baulig  <martin@gnome.org>
9523
9524         * class.cs (TypeContainer): Implement IMemberContainer.
9525         (TypeContainer.DefineMembers): Create the MemberCache.
9526         (TypeContainer.FindMembers): Do better BindingFlags checking; only
9527         return public members if BindingFlags.Public was given, check
9528         whether members are static.
9529
9530 2002-08-16  Martin Baulig  <martin@gnome.org>
9531
9532         * decl.cs (DeclSpace.Define): Splitted this in Define and
9533         DefineMembers.  DefineMembers is called first and initializes the
9534         MemberCache.
9535
9536         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
9537         DefineMembers() on all our DeclSpaces.
9538
9539         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
9540         but call DefineMembers() on all nested interfaces.  We call their
9541         Define() in our new Define() function.
9542
9543         * interface.cs (Interface): Implement IMemberContainer.
9544         (Interface.Define): Moved all code except the attribute stuf to
9545         DefineMembers().
9546         (Interface.DefineMembers): Initialize the member cache.
9547
9548         * typemanager.cs (IMemberFinder): Removed this interface, we don't
9549         need this anymore since we can use MemberCache.FindMembers directly.
9550
9551 2002-08-19  Martin Baulig  <martin@gnome.org>
9552
9553         * typemanager.cs (MemberCache): When creating the cache for an
9554         interface type, add all inherited members.
9555         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
9556         to `out bool used_cache' and documented it.
9557         (TypeManager.MemberLookup): If we already used the cache in the first
9558         iteration, we don't need to do the interfaces check.
9559
9560 2002-08-19  Martin Baulig  <martin@gnome.org>
9561
9562         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
9563         here from IMemberFinder and don't implement this interface anymore.
9564         (DeclSpace.MemberCache): Moved here from IMemberFinder.
9565
9566         * typemanager.cs (IMemberFinder): This interface is now only used by
9567         classes which actually support the member cache.
9568         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
9569         since we only put DeclSpaces into this Hashtable.
9570         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
9571         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
9572
9573 2002-08-16  Martin Baulig  <martin@gnome.org>
9574
9575         * typemanager.cs (ICachingMemberFinder): Removed.
9576         (IMemberFinder.MemberCache): New property.
9577         (TypeManager.FindMembers): Merged this with RealFindMembers().
9578         This function will never be called from TypeManager.MemberLookup()
9579         so we can't use the cache here, just the IMemberFinder.
9580         (TypeManager.MemberLookup_FindMembers): Check whether the
9581         IMemberFinder has a MemberCache and call the cache's FindMembers
9582         function.
9583         (MemberCache): Rewrote larger parts of this yet another time and
9584         cleaned it up a bit.
9585
9586 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
9587
9588         * driver.cs (LoadArgs): Support quoting.
9589
9590         (Usage): Show the CSC-like command line arguments.
9591
9592         Improved a few error messages.
9593
9594 2002-08-15  Martin Baulig  <martin@gnome.org>
9595
9596         * typemanager.cs (IMemberContainer.Type): New property.
9597         (IMemberContainer.IsInterface): New property.
9598
9599         The following changes are conditional to BROKEN_RUNTIME, which is
9600         defined at the top of the file.
9601
9602         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9603         class'es members, but add all members from TypeHandle.ObjectType
9604         if we're an interface.
9605         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9606         is the current type.
9607         (MemberCache.CacheEntry.Container): Removed this field.
9608         (TypeHandle.GetMembers): Include inherited members.
9609
9610 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9611
9612         * typemanager.cs: fixed compilation and added a comment on a field that
9613         is never used.
9614
9615 2002-08-15  Martin Baulig  <martin@gnome.org>
9616
9617         * class.cs (ConstructorInitializer.Resolve): In the
9618         Expression.MemberLookup call, use the queried_type as
9619         invocation_type.
9620
9621         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9622         declared' attribute, it's always true.
9623         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9624         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9625         temporary wrapper for FindMembers which tells MemberLookup whether
9626         members from the base classes are included in the return value.
9627         This will go away soon.
9628         (TypeManager.MemberLookup): Use this temporary hack here; once the
9629         new MemberCache is completed, we don't need to do the DeclaredOnly
9630         looping here anymore since the MemberCache will take care of this.
9631         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9632         (MemberCache): When creating the MemberCache for a class, get
9633         members from the current class and all its base classes.
9634         (MemberCache.CacheEntry.Container): New field.  This is a
9635         temporary hack until the Mono runtime is fixed to distinguish
9636         between ReflectedType and DeclaringType.  It allows us to use MCS
9637         with both the MS runtime and the unfixed Mono runtime without
9638         problems and without accecting performance.
9639         (MemberCache.SearchMembers): The DeclaredOnly looping from
9640         TypeManager.MemberLookup is now done here.      
9641
9642 2002-08-14  Martin Baulig  <martin@gnome.org>
9643
9644         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9645         Type.GetFields on dynamic types but get the fields from the
9646         corresponding TypeContainer.
9647         (MyStructInfo.GetStructInfo): Added check for enum types.
9648
9649         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9650         (MemberList.SyncRoot): Implemented.
9651         (TypeManager.FilterWithClosure): No need to check permissions if
9652         closure_start_type == closure_invocation_type, don't crash if
9653         closure_invocation_type is null.
9654
9655 2002-08-13  Martin Baulig  <martin@gnome.org>
9656
9657         Rewrote TypeContainer.FindMembers to use a member cache.  This
9658         gives us a speed increase of about 35% for the self-hosting MCS
9659         build and of about 15-20% for the class libs (both on GNU/Linux).
9660
9661         * report.cs (Timer): New class to get enhanced profiling.  This
9662         whole class is "TIMER" conditional since it remarkably slows down
9663         compilation speed.
9664
9665         * class.cs (MemberList): New class.  This is an IList wrapper
9666         which we're now using instead of passing MemberInfo[]'s around to
9667         avoid copying this array unnecessarily.
9668         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9669         (ICachingMemberFinder, IMemberContainer): New interface.
9670         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9671         has already been checked, otherwise use it for the name comparision.
9672         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9673         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9674         if possible.  Returns a MemberList, not a MemberInfo [].
9675         (TypeHandle): New class, implements IMemberContainer.  We create
9676         one instance of this class per type, it contains a MemberCache
9677         which is used to do the member lookups.
9678         (MemberCache): New class.  Each instance of this class contains
9679         all members of a type and a name-based hash table.
9680         (MemberCache.FindMembers): This is our new member lookup
9681         function.  First, it looks up all members of the requested name in
9682         the hash table.  Then, it walks this list and sorts out all
9683         applicable members and returns them.
9684
9685 2002-08-13  Martin Baulig  <martin@gnome.org>
9686
9687         In addition to a nice code cleanup, this gives us a performance
9688         increase of about 1.4% on GNU/Linux - not much, but it's already
9689         half a second for the self-hosting MCS compilation.
9690
9691         * typemanager.cs (IMemberFinder): New interface.  It is used by
9692         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9693         Enum, Delegate or Interface.
9694         (TypeManager.finder_to_member_finder): New PtrHashtable.
9695         (TypeManager.finder_to_container): Removed.
9696         (TypeManager.finder_to_delegate): Removed.
9697         (TypeManager.finder_to_interface): Removed.
9698         (TypeManager.finder_to_enum): Removed.
9699
9700         * interface.cs (Interface): Implement IMemberFinder.
9701
9702         * delegate.cs (Delegate): Implement IMemberFinder.
9703
9704         * enum.cs (Enum): Implement IMemberFinder.
9705
9706         * class.cs (TypeContainer): Implement IMemberFinder.
9707
9708 2002-08-12  Martin Baulig  <martin@gnome.org>
9709
9710         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9711
9712 2002-08-12  Martin Baulig  <martin@gnome.org>
9713
9714         * ecore.cs (ITypeExpression): New interface for expressions which
9715         resolve to a type.
9716         (TypeExpression): Renamed to TypeLookupExpression.
9717         (Expression.DoResolve): If we're doing a types-only lookup, the
9718         expression must implement the ITypeExpression interface and we
9719         call DoResolveType() on it.
9720         (SimpleName): Implement the new ITypeExpression interface.
9721         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9722         hack, the situation that we're only looking up types can't happen
9723         anymore when this method is called.  Moved the type lookup code to
9724         DoResolveType() and call it.
9725         (SimpleName.DoResolveType): This ITypeExpression interface method
9726         is now doing the types-only lookup.
9727         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9728         (ResolveFlags): Added MaskExprClass.
9729
9730         * expression.cs (MemberAccess): Implement the ITypeExpression
9731         interface.
9732         (MemberAccess.DoResolve): Added support for a types-only lookup
9733         when we're called via ITypeExpression.DoResolveType().
9734         (ComposedCast): Implement the ITypeExpression interface.
9735
9736         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9737         Expression.Resolve() with ResolveFlags.Type instead.
9738
9739 2002-08-12  Martin Baulig  <martin@gnome.org>
9740
9741         * interface.cs (Interface.Define): Apply attributes.
9742
9743         * attribute.cs (Attribute.ApplyAttributes): Added support for
9744         interface attributes.
9745
9746 2002-08-11  Martin Baulig  <martin@gnome.org>
9747
9748         * statement.cs (Block.Emit): Only check the "this" variable if we
9749         do not always throw an exception.
9750
9751         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9752         whether the property has a set accessor.
9753
9754 2002-08-11  Martin Baulig  <martin@gnome.org>
9755
9756         Added control flow analysis support for structs.
9757
9758         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9759         with control flow analysis turned off.
9760         (IVariable): New interface.
9761         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9762         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9763         (FieldExpr.DoResolve): Resolve the instance expression with flow
9764         analysis turned off and do the definite assignment check after the
9765         resolving when we know what the expression will resolve to.
9766
9767         * expression.cs (LocalVariableReference, ParameterReference):
9768         Implement the new IVariable interface, only call the flow analysis
9769         code if ec.DoFlowAnalysis is true.
9770         (This): Added constructor which takes a Block argument.  Implement
9771         the new IVariable interface.
9772         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9773         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9774         This does the definite assignment checks for struct members.
9775
9776         * class.cs (Constructor.Emit): If this is a non-static `struct'
9777         constructor which doesn't have any initializer, call
9778         Block.AddThisVariable() to tell the flow analysis code that all
9779         struct elements must be initialized before control returns from
9780         the constructor.
9781
9782         * statement.cs (MyStructInfo): New public class.
9783         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9784         argument to this indexer.  If non-zero, check an individual struct
9785         member, not the whole struct.
9786         (FlowBranching.CheckOutParameters): Check struct members.
9787         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9788         overloaded versions of these methods which take an additional
9789         `int field_idx' argument to check struct members.
9790         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9791         overloaded versions of these methods which take an additional
9792         `string field_name' argument to check struct member.s
9793         (VariableInfo): Implement the IVariable interface.
9794         (VariableInfo.StructInfo): New public property.  Returns the
9795         MyStructInfo instance of the variable if it's a struct or null.
9796         (Block.AddThisVariable): New public method.  This is called from
9797         Constructor.Emit() for non-static `struct' constructor which do
9798         not have any initializer.  It creates a special variable for the
9799         "this" instance variable which will be checked by the flow
9800         analysis code to ensure that all of the struct's fields are
9801         initialized before control returns from the constructor.
9802         (UsageVector): Added support for struct members.  If a
9803         variable/parameter is a struct with N members, we reserve a slot
9804         in the usage vector for each member.  A struct is considered fully
9805         initialized if either the struct itself (slot 0) or all its
9806         members are initialized.
9807
9808 2002-08-08  Martin Baulig  <martin@gnome.org>
9809
9810         * driver.cs (Driver.MainDriver): Only report an error CS5001
9811         if there were no compilation errors.
9812
9813         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9814         `UnsafeContext' property to determine whether the parent is in
9815         unsafe context rather than checking the parent's ModFlags:
9816         classes nested in an unsafe class are unsafe as well.
9817
9818 2002-08-08  Martin Baulig  <martin@gnome.org>
9819
9820         * statement.cs (UsageVector.MergeChildren): Distinguish between
9821         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9822         we return.  Added test17() and test18() to test-154.cs.
9823
9824 2002-08-08  Martin Baulig  <martin@gnome.org>
9825
9826         * typemanager.cs (TypeManager.FilterWithClosure): If we have
9827         Family access, make sure the invoking type isn't a subclass of the
9828         queried type (that'd be a CS1540).
9829
9830         * ecore.cs (Expression.MemberLookup): Added overloaded version of
9831         this method which takes an additional `Type invocation_type'.
9832
9833         * expression.cs (BaseAccess.DoResolve): Use the base type as
9834         invocation and query type.
9835         (MemberAccess.DoResolve): If the lookup failed and we're about to
9836         report a CS0122, try a lookup with the ec.ContainerType - if this
9837         succeeds, we must report a CS1540.
9838
9839 2002-08-08  Martin Baulig  <martin@gnome.org>
9840
9841         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
9842         (MethodGroupExpr): Implement the IMemberExpr interface.
9843
9844         * expression (MemberAccess.ResolveMemberAccess): No need to have
9845         any special code for MethodGroupExprs anymore, they're now
9846         IMemberExprs.   
9847
9848 2002-08-08  Martin Baulig  <martin@gnome.org>
9849
9850         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
9851         Family, FamANDAssem and FamORAssem permissions.
9852         (TypeManager.IsSubclassOrNestedChildOf): New public method.
9853
9854 2002-08-08  Martin Baulig  <martin@gnome.org>
9855
9856         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
9857         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
9858         or loop block.
9859
9860 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
9861
9862         * driver.cs: implemented /resource option to embed managed resources.
9863
9864 2002-08-07  Martin Baulig  <martin@gnome.org>
9865
9866         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
9867         (FieldBase.HasFieldInitializer): New public property.
9868         (FieldBase.GetInitializerExpression): New public method.  Resolves and
9869         returns the field initializer and makes sure it is only resolved once.
9870         (TypeContainer.EmitFieldInitializers): Call
9871         FieldBase.GetInitializerExpression to get the initializer, this ensures
9872         that it isn't resolved multiple times.
9873
9874         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
9875         the resolving process (SimpleName/MemberLookup) that we're currently
9876         emitting a field initializer (which must not access any instance members,
9877         this is an error CS0236).
9878
9879         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
9880         argument, if the `IsFieldInitializer' flag is set, we must report and
9881         error CS0236 and not an error CS0120.   
9882
9883 2002-08-07  Martin Baulig  <martin@gnome.org>
9884
9885         * ecore.cs (IMemberExpr): New public interface.
9886         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
9887         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
9888         if the expression is an IMemberExpr.
9889
9890         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
9891         to be null, implicitly default to `this' if we're non-static in
9892         this case.  Simplified the code a lot by using the new IMemberExpr
9893         interface.  Also fixed bug #28176 here.
9894
9895 2002-08-06  Martin Baulig  <martin@gnome.org>
9896
9897         * cs-parser.jay (SimpleLookup): Removed.  We need to create
9898         ParameterReferences during semantic analysis so that we can do a
9899         type-only search when resolving Cast, TypeOf and SizeOf.
9900         (block): Pass the `current_local_parameters' to the Block's
9901         constructor.
9902
9903         * class.cs (ConstructorInitializer): Added `Parameters parameters'
9904         argument to the constructor.
9905         (ConstructorInitializer.Resolve): Create a temporary implicit
9906         block with the parameters.
9907
9908         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
9909         references here if we aren't doing a type-only search.
9910
9911         * statement.cs (Block): Added constructor which takes a
9912         `Parameters parameters' argument.
9913         (Block.Parameters): New public property.
9914
9915         * support.cs (InternalParameters.Parameters): Renamed `parameters'
9916         to `Parameters' and made it public readonly.
9917
9918 2002-08-06  Martin Baulig  <martin@gnome.org>
9919
9920         * ecore.cs (Expression.Warning): Made this public as well.
9921
9922         * report.cs (Report.Debug): Print the contents of collections.
9923
9924 2002-08-06  Martin Baulig  <martin@gnome.org>
9925
9926         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
9927         used to tell Resolve() which kinds of expressions it may return.
9928         (Expression.Resolve): Added overloaded version of this method which
9929         takes a `ResolveFlags flags' argument.  This can be used to tell
9930         Resolve() which kinds of expressions it may return.  Reports a
9931         CS0118 on error.
9932         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
9933         ResolveFlags.SimpleName.
9934         (Expression.Error118): Added overloaded version of this method which
9935         takes a `ResolveFlags flags' argument.  It uses the flags to determine
9936         which kinds of expressions are allowed.
9937
9938         * expression.cs (Argument.ResolveMethodGroup): New public method.
9939         Resolves an argument, but allows a MethodGroup to be returned.
9940         This is used when invoking a delegate.
9941
9942         * TODO: Updated a bit.
9943
9944 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9945
9946         Fixed compilation with csc.
9947
9948         * ecore.cs: Expression.Error made public. Is this correct? Should
9949         Warning be made public too?
9950
9951         * expression.cs: use ea.Location instead of ea.loc.
9952         [FIXME:  Filed as bug #28607: MCS must report these errors.]
9953
9954 2002-08-06  Martin Baulig  <martin@gnome.org>
9955
9956         * ecore.cs (Expression.loc): Moved the location here instead of
9957         duplicating it in all derived classes.
9958         (Expression.Location): New public property.
9959         (Expression.Error, Expression.Warning): Made them non-static and
9960         removed the location argument.
9961         (Expression.Warning): Added overloaded version which takes an
9962         `int level' argument.
9963         (Expression.Error118): Make this non-static and removed the
9964         expression and location arguments.
9965         (TypeExpr): Added location argument to the constructor.
9966
9967         * expression.cs (StaticCallExpr): Added location argument to
9968         the constructor.
9969         (Indirection, PointerArithmetic): Likewise.
9970         (CheckedExpr, UnCheckedExpr): Likewise.
9971         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
9972         (StringPtr): Likewise.
9973
9974
9975 2002-08-05  Martin Baulig  <martin@gnome.org>
9976
9977         * expression.cs (BaseAccess.DoResolve): Actually report errors.
9978
9979         * assign.cs (Assign.DoResolve): Check whether the source
9980         expression is a value or variable.
9981
9982         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
9983         while resolving the corresponding blocks.
9984
9985         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
9986         an error, don't silently return null.
9987
9988         * statement.cs (Block.AddVariable): Do the error reporting here
9989         and distinguish between CS0128 and CS0136.
9990         (Block.DoResolve): Report all unused labels (warning CS0164).
9991         (LabeledStatement): Pass the location to the constructor.
9992         (LabeledStatement.HasBeenReferenced): New property.
9993         (LabeledStatement.Resolve): Set it to true here.
9994
9995         * statement.cs (Return.Emit): Return success even after reporting
9996         a type mismatch error (CS0126 or CS0127), this is what csc does and
9997         it avoids confusing the users with any consecutive errors.
9998
9999 2002-08-05  Martin Baulig  <martin@gnome.org>
10000
10001         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
10002
10003         * const.cs (Const.LookupConstantValue): Catch circular definitions.
10004
10005         * expression.cs (MemberAccess.DoResolve): Silently return if an
10006         error has already been reported.
10007
10008         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
10009         error has already been reported.
10010
10011 2002-08-05  Martin Baulig  <martin@gnome.org>
10012
10013         * statement.cs (UsageVector): Only initialize the `parameters'
10014         vector if we actually have any "out" parameters.
10015
10016 2002-08-05  Martin Baulig  <martin@gnome.org>
10017
10018         * expression.cs (Binary.ResolveOperator): When combining delegates,
10019         they must have the same type.
10020
10021 2002-08-05  Martin Baulig  <martin@gnome.org>
10022
10023         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
10024         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
10025         work with the ms runtime and we also don't need it: if we're a
10026         PropertyBuilder and not in the `indexer_arguments' hash, then we
10027         are a property and not an indexer.
10028
10029         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
10030         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
10031         since the latter one doesn't work with the ms runtime.
10032
10033 2002-08-03  Martin Baulig  <martin@gnome.org>
10034
10035         Fixed bugs #27998 and #22735.
10036
10037         * class.cs (Method.IsOperator): New public field.
10038         (Method.CheckBase): Report CS0111 if there's already a method
10039         with the same parameters in the current class.  Report CS0508 when
10040         attempting to change the return type of an inherited method.
10041         (MethodData.Emit): Report CS0179 if a method doesn't have a body
10042         and it's not marked abstract or extern.
10043         (PropertyBase): New abstract base class for Property and Indexer.
10044         (PropertyBase.CheckBase): Moved here from Property and made it work
10045         for indexers.
10046         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
10047         the same so we can reuse it there.
10048         (Property, Indexer): Derive from PropertyBase.
10049         (MethodSignature.inheritable_property_signature_filter): New delegate
10050         to find properties and indexers.
10051
10052         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
10053         argument and improved error reporting.
10054
10055         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
10056         EmptyReadOnlyParameters and made it a property.
10057
10058         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
10059         version of this method which takes a `PropertyInfo indexer'.
10060         (TypeManager.RegisterIndexer): New method.
10061
10062         * class.cs: Added myself as author of this file :-)
10063
10064 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10065
10066         * class.cs: fixed compilation on windoze.
10067
10068 2002-08-03  Martin Baulig  <martin@gnome.org>
10069
10070         * interface.cs (Interface.GetInterfaceBases): Check whether all
10071         base interfaces are at least as accessible than the current one.
10072
10073         * class.cs (TypeContainer.GetClassBases): Check whether base types
10074         are at least as accessible than the current type.
10075         (TypeContainer.AsAccessible): Implemented and made non-static.
10076         (MemberBase.CheckParameters): Report errors if the accessibility
10077         checks fail.
10078
10079         * delegate.cs (Delegate.Delegate): The default visibility is
10080         internal for top-level types and private for nested types.
10081         (Delegate.Define): Report errors if the accessibility checks fail.
10082
10083         * enum.cs (Enum.Enum): The default visibility is internal for
10084         top-level types and private for nested types.
10085         (Enum.DefineType): Compute the correct visibility.
10086
10087         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
10088         function which takes a `bool is_toplevel' instead of a TypeContainer.
10089
10090         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
10091         builtin type.
10092
10093 2002-08-02  Martin Baulig  <martin@gnome.org>
10094
10095         * expression.cs (LocalVariableReferenc): Added constructor which
10096         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
10097         (LocalVariableReference.IsReadOnly): New property.
10098         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
10099         variable is readonly, use our own readonly flag to do this; you can
10100         use the new constructor to get a writable reference to a read-only
10101         variable.
10102
10103         * cs-parser.jay (foreach_statement, using_statement): Get a writable
10104         reference to the local variable.
10105
10106 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
10107
10108         * rootcontext.cs (ResolveCore): Also include System.Exception
10109
10110         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
10111         we reach an EmptyStatement.
10112
10113         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
10114         is also fine.
10115
10116         * expression.cs (Binary.ResolveOperator): Check error result in
10117         two places.
10118
10119         use brtrue/brfalse directly and avoid compares to null.
10120
10121 2002-08-02  Martin Baulig  <martin@gnome.org>
10122
10123         * class.cs (TypeContainer.Define): Define all nested interfaces here.
10124         Fixes bug #28407, added test-155.cs.
10125
10126 2002-08-01  Martin Baulig  <martin@gnome.org>
10127
10128         * class.cs (Event.EmitDefaultMethod): Make this work with static
10129         events.  Fixes #28311, added verify-3.cs.
10130
10131 2002-08-01  Martin Baulig  <martin@gnome.org>
10132
10133         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
10134         `is_disposable' fields.
10135         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
10136         `hm.is_disposable' if we're using the collection pattern.
10137         (Foreach.EmitCollectionForeach): Use the correct type for the
10138         enumerator's local variable, only emit the try/finally block if
10139         necessary (fixes #27713).
10140
10141 2002-08-01  Martin Baulig  <martin@gnome.org>
10142
10143         * ecore.cs (Expression.report118): Renamed to Error118 and made
10144         it public static.
10145
10146         * statement.cs (Throw.Resolve): Check whether the expression is of
10147         the correct type (CS0118) and whether the type derives from
10148         System.Exception (CS0155).
10149         (Catch.Resolve): New method.  Do the type lookup here and check
10150         whether it derives from System.Exception (CS0155).
10151         (Catch.CatchType, Catch.IsGeneral): New public properties.
10152
10153         * typemanager.cs (TypeManager.exception_type): Added.
10154
10155 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
10156
10157         * driver.cs: Updated About function.
10158
10159 2002-07-31  Martin Baulig  <martin@gnome.org>
10160
10161         Implemented Control Flow Analysis.
10162
10163         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
10164         (EmitContext.CurrentBranching): Added.
10165         (EmitContext.StartFlowBranching): Added.
10166         (EmitContext.EndFlowBranching): Added.
10167         (EmitContext.KillFlowBranching): Added.
10168         (EmitContext.IsVariableAssigned): Added.
10169         (EmitContext.SetVariableAssigned): Added.
10170         (EmitContext.IsParameterAssigned): Added.
10171         (EmitContext.SetParameterAssigned): Added.
10172         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
10173         Added control flow analysis stuff here.
10174
10175         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
10176         resolve the expression as lvalue.
10177         (LocalVariableReference.DoResolve): Check whether the variable has
10178         already been assigned.
10179         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
10180         the parameter as assigned here.
10181         (ParameterReference.DoResolve): Check whether the parameter has already
10182         been assigned.
10183         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
10184         expression as lvalue.
10185
10186         * statement.cs (FlowBranching): New class for the flow analysis code.
10187         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
10188         (LabeledStatement.IsDefined): New public property.
10189         (LabeledStatement.AddUsageVector): New public method to tell flow
10190         analyis that the label may be reached via a forward jump.
10191         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
10192         flow analysis.
10193         (VariableInfo.Number): New public field.  This is used by flow analysis
10194         to number all locals of a block.
10195         (Block.CountVariables): New public property.  This is the number of
10196         local variables in this block (including the locals from all parent
10197         blocks).
10198         (Block.EmitMeta): Number all the variables.
10199
10200         * statement.cs: Added flow analysis support to all classes.
10201
10202 2002-07-31  Martin Baulig  <martin@gnome.org>
10203
10204         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
10205         To get debugging messages, compile mcs with /define:MCS_DEBUG and
10206         then use this argument.
10207
10208         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
10209
10210         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
10211         use this to specify /define options.
10212
10213 2002-07-29  Martin Baulig  <martin@gnome.org>
10214
10215         * statement.cs (Fixed): Moved all code that does variable lookups
10216         and resolvings from Emit to Resolve.
10217
10218         * statement.cs (For): Moved all code that does variable lookups
10219         and resolvings from Emit to Resolve.
10220
10221         * statement.cs (Using): Moved all code that does variable lookups
10222         and resolvings from Emit to Resolve.
10223
10224 2002-07-29  Martin Baulig  <martin@gnome.org>
10225
10226         * attribute.cs (Attribute.Resolve): Explicitly catch a
10227         System.NullReferenceException when creating the
10228         CustromAttributeBuilder and report a different warning message.
10229
10230 2002-07-29  Martin Baulig  <martin@gnome.org>
10231
10232         * support.cs (ParameterData.ParameterName): Added method to
10233         get the name of a parameter.
10234
10235         * typemanager.cs (TypeManager.IsValueType): New public method.
10236
10237 2002-07-29  Martin Baulig  <martin@gnome.org>
10238
10239         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
10240         is a flag which specifies that it's either ref or out.
10241         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
10242         the out parameter to `out Parameter.Modifier mod', also set the
10243         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
10244
10245         * support.cs (InternalParameters.ParameterModifier): Distinguish
10246         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
10247         Parameter.Modifier.ISBYREF flag if it's either ref or out.
10248
10249         * expression.cs (Argument.GetParameterModifier): Distinguish
10250         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
10251         Parameter.Modifier.ISBYREF flag if it's either ref or out.
10252
10253 2002-07-29  Martin Baulig  <martin@gnome.org>
10254
10255         * expression.cs (ParameterReference.ParameterReference): Added
10256         `Location loc' argument to the constructor.
10257
10258         * cs-parser.jay: Pass location to ParameterReference.
10259
10260 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
10261
10262         * statement.cs (Try): Initialize the location.
10263
10264         * cs-parser.jay: pass location to Try.
10265
10266         * expression.cs (Unary.Reduce): Change the prototype to return
10267         whether a constant fold could be performed or not.  The result is
10268         returned in an out parameters.  In the case of Indirection and
10269         AddressOf, we want to perform the full tests.
10270
10271 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
10272
10273         * statement.cs (Statement.Emit): Flag dead code.
10274
10275 2002-07-27  Andrew Birkett  <andy@nobugs.org>
10276
10277         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
10278
10279 2002-07-27  Martin Baulig  <martin@gnome.org>
10280
10281         * class.cs (MethodData.Define): Put back call to
10282         TypeManager.AddMethod(), accidentally commented this out.
10283
10284         * report.cs (Debug): New public method to print debugging information,
10285         this is `[Conditional ("DEBUG")]'.
10286
10287 2002-07-26  Martin Baulig  <martin@gnome.org>
10288
10289         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
10290         (switch_statement): Push the current_block to the switch_stack and
10291         pop it again when we're done with the switch.
10292         (switch_section): The new block is a child of the current_block.
10293         Fixes bug #24007, added test-152.cs.
10294
10295 2002-07-27  Martin Baulig  <martin@gnome.org>
10296
10297         * expression.cs (Invocation.EmitArguments): When calling a varargs
10298         function with only its fixed arguments, we need to pass an empty
10299         array.
10300
10301 2002-07-27  Martin Baulig  <martin@gnome.org>
10302
10303         Mono 0.13 has been released.
10304
10305 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
10306
10307         * driver.cs: Rename --resource to --linkres, because that is what
10308         we do currently, we dont support --resource yet.
10309
10310         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
10311
10312 2002-07-25  Martin Baulig  <martin@gnome.org>
10313
10314         * class.cs (MethodData): New public class.  This is a `method builder'
10315         class for a method or one accessor of a Property/Indexer/Event.
10316         (MethodData.GetMethodFlags): Moved here from MemberBase.
10317         (MethodData.ApplyAttributes): Likewise.
10318         (MethodData.ApplyObsoleteAttribute): Likewise.
10319         (MethodData.ApplyConditionalAttribute): Likewise.
10320         (MethodData.ApplyDllImportAttribute): Likewise.
10321         (MethodData.CheckAbstractAndExternal): Likewise.
10322         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
10323         (MethodData.Emit): Formerly known as Method.Emit().
10324         (MemberBase): Moved everything which was specific to a single
10325         accessor/method to MethodData.
10326         (Method): Create a new MethodData and call Define() and Emit() on it.
10327         (Property, Indexer, Event): Create a new MethodData objects for each
10328         accessor and call Define() and Emit() on them.
10329
10330 2002-07-25  Martin Baulig  <martin@gnome.org>
10331
10332         Made MethodCore derive from MemberBase to reuse the code from there.
10333         MemberBase now also checks for attributes.
10334
10335         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
10336         (MemberBase.GetMethodFlags): Moved here from class Method and marked
10337         as virtual.
10338         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
10339         `CallingConventions cc' and `Attributes opt_attrs' arguments.
10340         (MemberBase.ApplyAttributes): New virtual method; applies the
10341         attributes to a method or accessor.
10342         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
10343         (MemberBase.ApplyConditionalAttribute): Likewise.
10344         (MemberBase.ApplyDllImportAttribute): Likewise.
10345         (MemberBase.CheckAbstractAndExternal): Likewise.
10346         (MethodCore.ParameterTypes): This is now a property instead of a
10347         method, it's initialized from DoDefineParameters().
10348         (MethodCore.ParameterInfo): Removed the set accessor.
10349         (MethodCore.DoDefineParameters): New protected virtual method to
10350         initialize ParameterTypes and ParameterInfo.
10351         (Method.GetReturnType): We can now simply return the MemberType.
10352         (Method.GetMethodFlags): Override the MemberBase version and add
10353         the conditional flags.
10354         (Method.CheckBase): Moved some code from Define() here, call
10355         DoDefineParameters() here.
10356         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
10357         here to avoid some larger code duplication.
10358         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
10359         ensure that abstract and external accessors don't declare a body.
10360
10361         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
10362         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
10363         lookup in the attribute's parent classes, so we need to abort as soon
10364         as we found the first match.
10365         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
10366         the attribute has no arguments.
10367
10368         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
10369         of a Method.
10370
10371 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10372
10373         * cs-parser.jay: reverted previous patch.
10374
10375 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10376
10377         * cs-parser.jay: fixed bug #22119.
10378
10379 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10380
10381         * attribute.cs: fixed compilation. The error was:
10382         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
10383         be assigned to before control leaves the current method."
10384         [FIXME:  Filed as bug #28186: MCS must report this error.]
10385
10386 2002-07-25  Martin Baulig  <martin@gnome.org>
10387
10388         * attribute.cs (Attribute.Conditional_GetConditionName): New static
10389         method to pull the condition name ouf of a Conditional attribute.
10390         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
10391         the obsolete message and error flag out of an Obsolete attribute.
10392
10393         * class.cs (Method.GetMethodFlags): New public method to get the
10394         TypeManager.MethodFlags for this method.
10395         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
10396         private methods.
10397         (Method.Define): Get and apply the Obsolete and Conditional attributes;
10398         if we're overriding a virtual function, set the new private variable
10399         `parent_method'; call the new TypeManager.AddMethod().
10400
10401         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
10402         the MethodBuilder and the Method in a PtrHashtable.
10403         (TypeManager.builder_to_method): Added for this purpose.
10404         (TypeManager.MethodFlags): Added IsObsoleteError.
10405         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
10406         Obsolete and Conditional arguments in MethodBuilders.  If we discover
10407         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
10408         the message from the attribute.
10409
10410 2002-07-24  Martin Baulig  <martin@gnome.org>
10411
10412         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
10413         preprocessor directives, ensure that the argument to #define/#undef is
10414         exactly one identifier and that it's actually an identifier.
10415
10416         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
10417         did not work ....
10418
10419 2002-07-24  Martin Baulig  <martin@gnome.org>
10420
10421         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
10422         initialize it to TypeManager.object_type in the constructor.
10423         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
10424         of the `hm.get_current' method if we're using the collection pattern.
10425         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
10426         for the explicit conversion to make it work when we're using the collection
10427         pattern and the `Current' property has a different return type than `object'.
10428         Fixes #27713.
10429
10430 2002-07-24  Martin Baulig  <martin@gnome.org>
10431
10432         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
10433         does not match, but don't report any errors.  This method is called in
10434         order for all methods in a MethodGroupExpr until a matching method is
10435         found, so we don't want to bail out if the first method doesn't match.
10436         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
10437         matches, report the 123.  Fixes #28070.
10438
10439 2002-07-24  Martin Baulig  <martin@gnome.org>
10440
10441         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
10442         TypeManager.TypeToCoreType() to the top of the method so the
10443         following equality checks will work.  Fixes #28107.
10444
10445 2002-07-24  Martin Baulig  <martin@gnome.org>
10446
10447         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
10448         operand is of type uint, and the other operand is of type sbyte,
10449         short or int, the operands are converted to type long." -
10450         Actually do what this comment already told us.  Fixes bug #28106,
10451         added test-150.cs.
10452
10453 2002-07-24  Martin Baulig  <martin@gnome.org>
10454
10455         * class.cs (MethodBase): New abstract class.  This is now a base
10456         class for Property, Indexer and Event to avoid some code duplication
10457         in their Define() and DefineMethods() methods.
10458         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
10459         generic methods for Define() and DefineMethods().
10460         (FieldBase): Derive from MemberBase, not MemberCore.
10461         (Property): Derive from MemberBase, not MemberCore.
10462         (Property.DefineMethod): Moved all the code from this method to the
10463         new MethodBase.DefineAccessor(), just call it with appropriate
10464         argumetnts.
10465         (Property.Define): Call the new Property.DoDefine(), this does some
10466         sanity checks and we don't need to duplicate the code everywhere.
10467         (Event): Derive from MemberBase, not MemberCore.
10468         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
10469         accessors, this will also make them work with interface events.
10470         (Indexer): Derive from MemberBase, not MemberCore.
10471         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
10472         (Indexer.Define): Use the new MethodBase functions.
10473
10474         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
10475         argument to the constructor.
10476         (Interface.FindMembers): Added support for interface events.
10477         (Interface.PopluateEvent): Implemented.
10478
10479         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
10480
10481 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
10482
10483         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
10484         but this is required to check for a method name being the same as
10485         the containing class.  
10486
10487         Handle this now.
10488
10489 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10490
10491         * interface.cs: initialize variable.
10492
10493 2002-07-23  Martin Baulig  <martin@gnome.org>
10494
10495         Implemented the IndexerName attribute in interfaces.
10496
10497         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
10498         name if this is an explicit interface implementation.
10499         (Indexer.InterfaceIndexerName): New public variable.  If we're
10500         implementing an interface indexer, this is the IndexerName in that
10501         interface.  Otherwise, it's the IndexerName.
10502         (Indexer.DefineMethod): If we're implementing interface indexer,
10503         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
10504         and Pending.ImplementIndexer methods.
10505         (Indexer.Define): Also define the PropertyBuilder if we're
10506         implementing an interface indexer and this is neither an explicit
10507         interface implementation nor do the IndexerName match the one in
10508         the interface.
10509
10510         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
10511         If a method is defined here, then we always need to create a proxy
10512         for it.  This is used when implementing interface indexers.
10513         (Pending.IsInterfaceIndexer): New public method.
10514         (Pending.ImplementIndexer): New public method.
10515         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
10516         This is used when implementing interface indexers to define a proxy
10517         if necessary.
10518         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
10519         define a proxy if necessary.
10520
10521         * interface.cs (Interface.IndexerName): New public variable.
10522         (Interface.PopulateIndexer): Set the IndexerName.
10523         (Interface.DefineIndexers): New private method.  Populate all the
10524         indexers and make sure their IndexerNames match.
10525
10526         * typemanager.cs (IndexerPropertyName): Added support for interface
10527         indexers.
10528
10529 2002-07-22  Martin Baulig  <martin@gnome.org>
10530
10531         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
10532         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
10533         ret if HasReturnLabel.
10534         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
10535         variables.
10536
10537         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
10538         and set the ec.LoopBeginTryCatchLevel.
10539         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
10540         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
10541         the current ec.TryCatchLevel, the branch goes out of an exception
10542         block.  In this case, we need to use Leave and not Br.
10543
10544 2002-07-22  Martin Baulig  <martin@gnome.org>
10545
10546         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
10547         block unless the block does not always return or it is contained in
10548         another try { ... } catch { ... } block.  Fixes bug #26506.
10549         Added verify-1.cs to the test suite.
10550
10551 2002-07-22  Martin Baulig  <martin@gnome.org>
10552
10553         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
10554         then we do not always return.  Fixes bug #24985.
10555
10556 2002-07-22  Martin Baulig  <martin@gnome.org>
10557
10558         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
10559         lookup on a per-class level; ie. walk up the class hierarchy until we
10560         found at least one applicable method, then choose the best among them.
10561         Fixes bug #24463 and test-29.cs.
10562
10563 2002-07-22  Martin Baulig  <martin@gnome.org>
10564
10565         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
10566         return types of the methods.  The return type is not part of the
10567         signature and we must not check it to make the `new' modifier work.
10568         Fixes bug #27999, also added test-147.cs.
10569         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
10570
10571         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
10572         on the method's return type.
10573
10574 2002-07-21  Martin Baulig  <martin@gnome.org>
10575
10576         * assign.cs: Make this work if the rightmost source is a constant and
10577         we need to do an implicit type conversion.  Also adding a few more tests
10578         to test-38.cs which should have caught this.
10579
10580         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
10581         target in the makefile for this.  The makefile.gnu is primarily intended
10582         for end-users who don't want to debug the compiler.
10583
10584 2002-07-21  Martin Baulig  <martin@gnome.org>
10585
10586         * assign.cs: Improved the Assign class so it can now handle embedded
10587         assignments (X = Y = Z = something).  As a side-effect this'll now also
10588         consume less local variables.  test-38.cs now passes with MCS, added
10589         a few new test cases to that test.
10590
10591 2002-07-20  Martin Baulig  <martin@gnome.org>
10592
10593         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
10594         instructions.  Fixes bug #27977, also added test-146.cs.
10595
10596 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10597
10598         * cs-tokenizer.cs: fixed getHex ().
10599
10600 2002-07-19  Martin Baulig  <martin@gnome.org>
10601
10602         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10603         not Type.GetType() to lookup the array type.  This is needed when
10604         we're constructing an array of a user-defined type.
10605         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10606         single-dimensional arrays, but also for single-dimensial arrays of
10607         type decimal.
10608
10609 2002-07-19  Martin Baulig  <martin@gnome.org>
10610
10611         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10612         this function is called, it's not allowed to share LocalBuilders
10613         among ILGenerators.
10614
10615 2002-07-19  Martin Baulig  <martin@gnome.org>
10616
10617         * expression.cs (Argument.Resolve): Report an error 118 when trying
10618         to pass a type as argument.
10619
10620 2002-07-18  Martin Baulig  <martin@gnome.org>
10621
10622         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10623         Conv_R_Un for the signed `long' type.
10624
10625 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10626
10627         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10628         `expr' for the temporary result, as that will fail if we do
10629         multiple resolves on the same expression.
10630
10631 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10632
10633         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10634         ec.TypeContainer for looking up aliases. 
10635
10636         * class.cs (TypeContainer): Remove LookupAlias from here.
10637
10638         * decl.cs (DeclSpace); Move here.
10639
10640 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10641
10642         * class.cs (FindMembers): Only call filter if the constructor
10643         bulider is not null.
10644
10645         Also handle delegates in `NestedTypes' now.  Now we will perform
10646         type lookups using the standard resolution process.  This also
10647         fixes a bug.
10648
10649         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10650         This uses Expressions (the limited kind that can be parsed by the
10651         tree) instead of strings.
10652
10653         * expression.cs (ComposedCast.ToString): Implement, used to flag
10654         errors since now we have to render expressions.
10655
10656         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10657         FormArrayType. 
10658
10659         * ecore.cs (SimpleName.ToString): ditto.
10660
10661         * cs-parser.jay: Instead of using strings to assemble types, use
10662         Expressions to assemble the type (using SimpleName, ComposedCast,
10663         MemberAccess).  This should fix the type lookups in declarations,
10664         because we were using a different code path for this.
10665
10666         * statement.cs (Block.Resolve): Continue processing statements
10667         even when there is an error.
10668
10669 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10670
10671         * class.cs (Event.Define): Also remove the `remove' method from
10672         the list of pending items.
10673
10674         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10675         generate more compact code. 
10676
10677 2002-07-17  Martin Baulig  <martin@gnome.org>
10678
10679         * const.cs (Const.LookupConstantValue): Add support for constant
10680         `unchecked' and `checked' expressions.
10681         Also adding test case test-140.cs for this.
10682
10683 2002-07-17  Martin Baulig  <martin@gnome.org>
10684
10685         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10686         check whether mi.ReturnType implements the IEnumerator interface; the
10687         `==' and the IsAssignableFrom() will fail in this situation.
10688
10689 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10690
10691         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10692         here too.
10693
10694 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10695
10696         * expression.cs: fixed bug #27811.
10697
10698 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10699
10700         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10701         Molaro: when we are a ref, the value already contains a pointer
10702         value, do not take the address of it.
10703
10704 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10705         * removed mb-parser.jay and mb-tokenizer.cs
10706
10707 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10708
10709         * expression.cs: check against the building corlib void type.
10710
10711 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10712
10713         * ecore.cs: fix for valuetype static readonly fields: when 
10714         initializing them, we need their address, not the address of a copy.
10715
10716 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10717
10718         * typemanager.cs: register also enum_type in corlib.
10719
10720 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10721
10722         * class.cs: allow calling this (but not base) initializers in structs.
10723
10724 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10725
10726         * ecore.cs: make sure we compare against the building base types
10727         in GetTypeSize ().
10728
10729 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10730
10731         * typemanager.cs: fix TypeToCoreType() to handle void and object
10732         (corlib gets no more typerefs after this change).
10733
10734 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10735
10736         * expression.cs (ArrayCreation.EmitArrayArguments): use
10737         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10738
10739         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10740         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10741         array indexes, the runtime actually forbids them.
10742
10743         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10744         for array arguments here.
10745
10746         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10747         instead of the default for ValueTypes.
10748
10749         (New.DoEmit): Use IsValueType instead of
10750         IsSubclassOf (value_type)
10751         (New.DoResolve): ditto.
10752         (Invocation.EmitCall): ditto.
10753
10754         * assign.cs (Assign): ditto.
10755
10756         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10757         Statements *are* currently doing part of their resolution during
10758         Emit.  
10759
10760         Expressions do always resolve during resolve, but statements are
10761         only required to propagate resolution to their children.
10762
10763 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10764
10765         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10766
10767         (LoadAssembly): Do not add the dll if it is already specified
10768
10769         (MainDriver): Add the System directory to the link path at the end,
10770         after all the other -L arguments. 
10771
10772         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10773         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10774         ldelem.u1) and using the opposite for sbytes.
10775
10776         This fixes Digger, and we can finally run it.
10777
10778         * driver.cs (UnixParseOption): Move the option parsing here.  
10779         (CSCParseOption): Implement CSC-like parsing of options.
10780
10781         We now support both modes of operation, the old Unix way, and the
10782         new CSC-like way.  This should help those who wanted to make cross
10783         platform makefiles.
10784
10785         The only thing broken is that /r:, /reference: and /lib: are not
10786         implemented, because I want to make those have the same semantics
10787         as the CSC compiler has, and kill once and for all the confussion
10788         around this.   Will be doing this tomorrow.
10789
10790         * statement.cs (Unsafe.Resolve): The state is checked during
10791         resolve, not emit, so we have to set the flags for IsUnsfe here.
10792
10793 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10794
10795         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10796         not catch the Error_ObjectRefRequired in SimpleName (as it is
10797         possible to have a class/instance variable name that later gets
10798         deambiguated), we have to check this here.      
10799
10800 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10801
10802         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10803         make static and put into Expression.
10804
10805         (Event.Define): Register the private field of the event with the 
10806         TypeManager so that GetFieldFromEvent can get at it.
10807
10808         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10809         keep track of the private field associated with an event which
10810         has no accessors.
10811
10812         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10813         private field.
10814
10815         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10816
10817 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10818
10819         * expression.cs (Binary.EmitBranchable): this routine emits the
10820         Binary expression in a branchable context.  This basically means:
10821         we need to branch somewhere, not just get the value on the stack.
10822
10823         This works together with Statement.EmitBoolExpression.
10824
10825         * statement.cs (Statement.EmitBoolExpression): Use
10826         EmitBranchable. 
10827
10828 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
10829
10830         * statement.cs (For): Reduce the number of jumps in loops.
10831
10832         (For): Implement loop inversion for the For statement.
10833
10834         (Break): We can be breaking out of a Try/Catch controlled section
10835         (foreach might have an implicit try/catch clause), so we need to
10836         use Leave instead of Br.
10837
10838         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
10839         now).  If the instace expression supports IMemoryLocation, we use
10840         the AddressOf method from the IMemoryLocation to extract the
10841         address instead of emitting the instance.
10842
10843         This showed up with `This', as we were emitting the instance
10844         always (Emit) instead of the Address of This.  Particularly
10845         interesting when This is a value type, as we dont want the Emit
10846         effect (which was to load the object).
10847
10848 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
10849
10850         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
10851
10852         * statement.cs (Checked): Set the CheckedState during the resolve
10853         process too, as the ConvCast operations track the checked state on
10854         the resolve process, and not emit.
10855
10856         * cs-parser.jay (namespace_member_declaration): Flag that we have
10857         found a declaration when we do.  This is used to flag error 1529
10858
10859         * driver.cs: Report ok when we display the help only.
10860
10861 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
10862
10863         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
10864
10865 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
10866
10867         * cs-tokenizer.cs (define): We also have to track locally the
10868         defines.  AllDefines is just used for the Conditional Attribute,
10869         but we also need the local defines for the current source code. 
10870
10871 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
10872
10873         * statement.cs (While, For, Do): These loops can exit through a
10874         Break statement, use this information to tell whether the
10875         statement is the last piece of code.
10876
10877         (Break): Flag that we break.
10878
10879         * codegen.cs (EmitContexts): New `Breaks' state variable.
10880
10881 2002-07-03  Martin Baulig  <martin@gnome.org>
10882
10883         * class.cs (TypeContainer.MethodModifiersValid): Allow override
10884         modifiers in method declarations in structs.  Otherwise, you won't
10885         be able to override things like Object.Equals().
10886
10887 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10888
10889         * class.cs (Method, Property, Indexer): Do not allow the public
10890         modifier to be used in explicit interface implementations.
10891
10892         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
10893         override modifiers in method declarations in structs
10894
10895 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
10896
10897         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
10898         integer or real overflow, report an error
10899
10900 2002-07-02  Martin Baulig  <martin@gnome.org>
10901
10902         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
10903         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
10904         to tell the runtime about our newly created System.Object and
10905         System.ValueType types.
10906
10907 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10908
10909         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
10910         struct instead of Ldarg/Starg.
10911
10912 2002-07-02  Martin Baulig  <martin@gnome.org>
10913
10914         * expression.cs (Indirection.Indirection): Call
10915         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
10916
10917 2002-07-02  Martin Baulig  <martin@gnome.org>
10918
10919         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
10920         ValueType, call TypeManager.TypeToCoreType() on it.
10921         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
10922         the OpCodes.Newarr argument.
10923
10924 2002-07-02  Martin Baulig  <martin@gnome.org>
10925
10926         * expression.cs (Invocation.EmitCall): When compiling corlib,
10927         replace all calls to the system's System.Array type to calls to
10928         the newly created one.
10929
10930         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
10931         System.Array methods.
10932         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
10933         from the system's System.Array type which must be replaced.
10934
10935 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
10936
10937         * typemanager.cs: load unverifiable_code_ctor so we can build
10938         corlib using the correct type. Avoid using GetTypeCode() with
10939         TypeBuilders.
10940         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
10941         TypeManager.object_type to allow building corlib.
10942
10943 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
10944
10945         * ecore.cs: handle System.Enum separately in LoadFromPtr().
10946
10947 2002-07-01  Martin Baulig  <martin@gnome.org>
10948
10949         * class.cs: Make the last change actually work, we need to check
10950         whether `ifaces != null' to avoid a crash.
10951
10952 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10953
10954         * class.cs: when we build structs without fields that implement
10955         interfaces, we need to add the interfaces separately, since there is
10956         no API to both set the size and add the interfaces at type creation
10957         time.
10958
10959 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10960
10961         * expression.cs: the dimension arguments to the array constructors
10962         need to be converted if they are a long.
10963
10964 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
10965
10966         * class.cs: don't emit ldarg.0 if there is no parent constructor
10967         (fixes showstopper for corlib).
10968
10969 2002-06-29  Martin Baulig  <martin@gnome.org>
10970
10971         MCS now compiles corlib on GNU/Linux :-)
10972
10973         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
10974         ie. check for MethodImplOptions.InternalCall.
10975
10976         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
10977         and TypeManager.attribute_type are null, so we must explicitly check
10978         whether parent is not null to find out whether it's an attribute type.
10979         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
10980         and SetBuilder, not only if the property is neither abstract nor external.
10981         This is necessary to set the MethodImplOptions on the accessor methods.
10982         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
10983         SetBuilder, see Property.Emit().
10984
10985         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
10986         populate "System.Object", "System.ValueType" and "System.Attribute" since
10987         they've already been populated from BootCorlib_PopulateCoreTypes().
10988
10989 2002-06-29  Martin Baulig  <martin@gnome.org>
10990
10991         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10992         is the NullLiteral, we also need to make sure that target_type is not
10993         an enum type.   
10994
10995 2002-06-29  Martin Baulig  <martin@gnome.org>
10996
10997         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10998         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10999         before calling BootstrapCorlib_ResolveDelegate ().
11000
11001 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11002
11003         * statement.cs: fixed build-breaker. All tests passed ok.
11004
11005 2002-06-27  Martin Baulig  <martin@gnome.org>
11006
11007         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
11008         for System.Decimal when compiling corlib.
11009
11010 2002-06-27  Martin Baulig  <martin@gnome.org>
11011
11012         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
11013         switch blocks which contain nothing but a default clause.
11014
11015 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
11016
11017        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
11018
11019 2002-06-27  Martin Baulig  <martin@gnome.org>
11020
11021         * ecore.cs (PropertyExpr.PropertyExpr): Call
11022         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
11023
11024         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
11025         is already a TypeBuilder.
11026
11027 2002-06-27  Martin Baulig  <martin@gnome.org>
11028
11029         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
11030         `target_type == TypeManager.array_type', not IsAssignableFrom() in
11031         the "from an array-type to System.Array" case.  This makes it work
11032         when compiling corlib.
11033
11034 2002-06-27  Martin Baulig  <martin@gnome.org>
11035
11036         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
11037         non-static PropertyExpr, set its InstanceExpression.  This makes
11038         the `ICollection.Count' property work in System/Array.cs.
11039
11040 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
11041
11042         * driver.cs: Made error handling more consistent.  Errors now
11043         tracked by Report class, so many methods which used to return int
11044         now return void.  Main() now prints success/failure and 
11045         errors/warnings message.
11046
11047         Renamed '--probe' compiler argument to '--expect-error'.  Removed
11048         the magic number return values (123 and 124).  Now, if the
11049         expected error occurs, the compiler exits with success (exit value
11050         0).  If the compilation completes without seeing that particular
11051         error, the compiler exits with failure (exit value 1).  The
11052         makefile in mcs/errors has been changed to handle the new behaviour.
11053
11054         * report.cs: Made 'expected error' number a property and renamed
11055         it from 'Probe' to 'ExpectedError'.
11056
11057         * genericparser.cs: Removed error handling support, since it is
11058         now all done by Report class.
11059
11060         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
11061         class, so parse() no longer returns an int.
11062
11063         * namespace.cs: Use Report.Error instead of GenericParser.error
11064
11065 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
11066
11067         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
11068         TypeContainer.AddOperator): At the front of the list put the
11069         explicit implementations, so they get resolved/defined first. 
11070
11071 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
11072
11073         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
11074         interface type is implemented by this TypeContainer.  Used during
11075         explicit interface implementation.
11076
11077         (Property.Define, Indexer.Define, Method.Define): Validate that
11078         the given interface in the explicit implementation is one of the
11079         base classes for the containing type.
11080
11081         Also if we are explicitly implementing an interface, but there is
11082         no match in the pending implementation table, report an error.
11083
11084         (Property.Define): Only define the property if we are
11085         not explicitly implementing a property from an interface.  Use the
11086         correct name also for those properties (the same CSC uses,
11087         although that is really not needed).
11088
11089         (Property.Emit): Do not emit attributes for explicitly implemented
11090         properties, as there is no TypeBuilder.
11091
11092         (Indexer.Emit): ditto.
11093
11094         Hiding then means that we do not really *implement* a pending
11095         implementation, which makes code fail.
11096
11097 2002-06-22  Martin Baulig  <martin@gnome.org>
11098
11099         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
11100         the return value of Object.GetType().  [FIXME: we need to do this whenever
11101         we get a type back from the reflection library].
11102
11103 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
11104
11105         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
11106
11107 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
11108
11109         * attribute.cs: Return null if we can not look up the type.
11110
11111         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
11112         the interface types found.
11113
11114         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
11115         interface types found.
11116
11117         * typemanager.cs (GetInterfaces): Make this routine returns alll
11118         the interfaces and work around the lame differences between
11119         System.Type and System.Reflection.Emit.TypeBuilder in the results
11120         result for GetInterfaces.
11121
11122         (ExpandInterfaces): Given an array of interface types, expand and
11123         eliminate repeated ocurrences of an interface.  This expands in
11124         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
11125         be IA, IB, IC.
11126
11127 2002-06-21  Martin Baulig  <martin@gnome.org>
11128
11129         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
11130         on System.Enum.
11131
11132 2002-06-21  Martin Baulig  <martin@gnome.org>
11133
11134         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
11135         and called with one of the core types, return the corresponding typebuilder for
11136         that type.
11137
11138         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
11139         element type.
11140
11141 2002-06-21  Martin Baulig  <martin@gnome.org>
11142
11143         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
11144         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
11145         (Expression.ConvertReferenceExplicit): Likewise.
11146
11147         * expression.cs (ElementAccess.DoResolve): Likewise.
11148         (ElementAccess.DoResolveLValue): Likewise.
11149
11150 2002-06-10  Martin Baulig  <martin@gnome.org>
11151
11152         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
11153         add the "value" parameter to the parameter list.
11154
11155         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
11156         to our caller.
11157
11158 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
11159
11160         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
11161         the argument to an int, uint, long or ulong, per the spec.  Also
11162         catch negative constants in array creation.
11163
11164 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
11165
11166         * class.cs: do not allow the same interface to appear twice in
11167         the definition list.
11168
11169 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
11170
11171         * ecore.cs: don't use ldlen with System.Array.
11172
11173 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
11174
11175         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
11176
11177 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
11178
11179         * modifiers.cs: produce correct field attributes for protected
11180         internal. Easy fix so miguel can work on ther harder stuff:-)
11181
11182 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
11183
11184         * pending.cs: New file.  Move the code from class.cs here.
11185         Support clearning the pending flag for all methods (when not doing
11186         explicit interface implementation).
11187
11188 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
11189
11190         * rootcontext.cs: added a couple more types needed to bootstrap.
11191
11192 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
11193
11194         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
11195         constructor in the type, instead of any constructor in the type
11196         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
11197         a bug in the Mono runtime when applying the params attribute). 
11198
11199 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
11200         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
11201
11202 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
11203
11204         * expression.cs (Unary.ResolveOperator): Use TypeManager
11205         to resolve the type.
11206
11207 2002-06-13  Ravi Pratap  <ravi@ximian.com>
11208
11209         * cs-parser.jay (enum_member_declaration): Pass in the attributes
11210         attached.
11211
11212         * enum.cs (AddEnumMember): Add support to store the attributes associated 
11213         with each member too.
11214
11215         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
11216         field builders too - this takes care of the enum member case.
11217
11218 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
11219
11220         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
11221         address-of operator on both value types and pointers.
11222
11223 2002-06-10  Martin Baulig  <martin@gnome.org>
11224
11225         * interface.cs (Interface.PopulateIndexer): Add the indexer's
11226         PropertyBuilder to the `property_builders' list.
11227
11228         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
11229         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
11230         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
11231         find any indexers which are inherited from an interface.
11232
11233 2002-06-09  Martin Baulig  <martin@gnome.org>
11234
11235         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
11236         the same type as the constant if necessary.  There's also a test-130.cs
11237         for this.
11238
11239         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
11240
11241         * typemanager.cs (TypeManager.ChangeType): Previously known as
11242         Enum.ChangeEnumType().
11243
11244 2002-06-09  Martin Baulig  <martin@gnome.org>
11245
11246         * expression.cs (Cast.TryReduce): Added support for consts.
11247
11248 2002-06-08  Ravi Pratap  <ravi@ximian.com>
11249
11250         * class.cs (Accessor): Hold attributes information so we can pass
11251         it along.
11252
11253         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
11254         Modify to pass in attributes attached to the methods.
11255
11256         (add_accessor_declaration, remove_accessor_declaration): Ditto.
11257
11258         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
11259         to handle the Accessor kind :-)
11260
11261         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
11262
11263 2002-06-08  Martin Baulig  <martin@gnome.org>
11264
11265         * expression.cs (Unary.TryReduceNegative): Added support for
11266         ULongConstants.
11267
11268 2002-06-08  Martin Baulig  <martin@gnome.org>
11269
11270         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
11271         name can't be found in the `defined_names' - the caller will do a
11272         MemberLookup in this case and thus find methods in System.Enum
11273         such as Enum.IsDefined().
11274
11275 2002-06-08  Martin Baulig  <martin@gnome.org>
11276
11277         * enum.cs (Enum.ChangeEnumType): This is a custom version of
11278         Convert.ChangeType() which works with TypeBuilder created types.
11279         (Enum.LookupEnumValue, Enum.Define): Use it here.
11280
11281         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
11282         `TypeBuilder.BaseType != null' check.
11283         (TypeContainer.FindMembers): Only lookup parent members if we
11284         actually have a parent.
11285         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
11286         (ConstructorInitializer.Resolve): Likewise.
11287
11288         * interface.cs (Interface.FindMembers): Added
11289         `TypeBuilder.BaseType != null' check.
11290
11291         * rootcontext.cs (RootContext.ResolveCore): Added
11292         "System.Runtime.CompilerServices.IndexerNameAttribute" to
11293         classes_second_stage.
11294
11295         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
11296         debug_type and trace_type when compiling with --nostdlib.       
11297
11298 2002-06-07  Martin Baulig  <martin@gnome.org>
11299
11300         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
11301         (AddField): Set it to true when adding a non-static field.
11302         (DefineType): Use `have_nonstatic_fields' to find out whether we
11303         have non-static fields, not `Fields != null'.
11304
11305 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
11306
11307         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
11308         dereferencing a null on the static-field code path)
11309
11310 2002-05-30  Martin Baulig  <martin@gnome.org>
11311
11312         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
11313         to take command line arguments.  Use reflection to call the new
11314         custom `Initialize' function on the symbol writer and pass it the
11315         command line arguments.
11316
11317         * driver.cs (--debug-args): New command line argument to pass command
11318         line arguments to the symbol writer.
11319
11320 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
11321
11322         * assign.cs (DoResolve): Forgot to do the implicit conversion to
11323         the target type for indexers and properties.  Thanks to Joe for
11324         catching this.
11325
11326 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
11327
11328         * typemanager.cs (MethodFlags): returns the method flags
11329         (Obsolete/ShouldIgnore) that control warning emission and whether
11330         the invocation should be made, or ignored. 
11331
11332         * expression.cs (Invocation.Emit): Remove previous hack, we should
11333         not do this on matching a base type, we should do this based on an attribute
11334
11335         Only emit calls to System.Diagnostics.Debug and
11336         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
11337         on the command line.
11338
11339         * rootcontext.cs: Global settings for tracing and debugging.
11340
11341         * cs-tokenizer.cs (define): New utility function to track
11342         defines.   Set the global settings for TRACE and DEBUG if found.
11343
11344 2002-05-25  Ravi Pratap  <ravi@ximian.com>
11345
11346         * interface.cs (Populate*): Pass in the TypeContainer as well as
11347         the DeclSpace as parameters so that we can create EmitContexts and
11348         then use that to apply attributes etc.
11349
11350         (PopulateMethod, PopulateEvent, PopulateProperty)
11351         (PopulateIndexer): Apply attributes everywhere.
11352
11353         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
11354         etc.
11355
11356         (ApplyAttributes): Update accordingly.
11357
11358         We now apply interface attributes for all members too.
11359
11360 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
11361
11362         * class.cs (Indexer.Define); Correctly check if we are explicit
11363         implementation (instead of checking the Name for a ".", we
11364         directly look up if the InterfaceType was specified).
11365
11366         Delay the creation of the PropertyBuilder.
11367
11368         Only create the PropertyBuilder if we are not an explicit
11369         interface implementation.   This means that explicit interface
11370         implementation members do not participate in regular function
11371         lookups, and hence fixes another major ambiguity problem in
11372         overload resolution (that was the visible effect).
11373
11374         (DefineMethod): Return whether we are doing an interface
11375         implementation. 
11376
11377         * typemanager.cs: Temporary hack until we get attributes in
11378         interfaces (Ravi is working on that) and we get IndexerName
11379         support in interfaces.
11380
11381         * interface.cs: Register the indexers as properties.
11382
11383         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
11384         warning, I have verified that this is a bug in the .NET runtime
11385         (JavaScript suffers of the same problem).
11386
11387         * typemanager.cs (MemberLookup): When looking up members for
11388         interfaces, the parent of an interface is the implicit
11389         System.Object (so we succeed in searches of Object methods in an
11390         interface method invocation.  Example:  IEnumerable x;  x.ToString
11391         ()) 
11392
11393 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
11394
11395         * class.cs (Event): Events should also register if they do
11396         implement the methods that an interface requires.
11397
11398         * typemanager.cs (MemberLookup); use the new GetInterfaces
11399         method. 
11400
11401         (GetInterfaces): The code used to lookup interfaces for a type is
11402         used in more than one place, factor it here. 
11403
11404         * driver.cs: Track the errors at the bottom of the file, we kept
11405         on going.
11406
11407         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
11408         instance if the method we are calling is static!
11409
11410 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
11411
11412         * attribute.cs (ApplyAttributes): Make this function filter out
11413         the IndexerName attribute (as that attribute in reality is never
11414         applied) and return the string constant for the IndexerName
11415         attribute. 
11416
11417         * class.cs (TypeContainer.Emit): Validate that all the indexers
11418         have the same IndexerName attribute, and if so, set the
11419         DefaultName attribute on the class. 
11420
11421         * typemanager.cs: The return value might contain other stuff (not
11422         only methods).  For instance, consider a method with an "Item"
11423         property and an Item method.
11424
11425         * class.cs: If there is a problem with the parameter types,
11426         return. 
11427
11428 2002-05-24  Ravi Pratap  <ravi@ximian.com>
11429
11430         * ecore.cs (ImplicitConversionExists): Wrapper function which also
11431         looks at user defined conversion after making a call to 
11432         StandardConversionExists - we need this for overload resolution.
11433
11434         * expression.cs : Update accordingly the various method calls.
11435
11436         This fixes 2 bugs filed against implicit user defined conversions 
11437
11438 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
11439
11440         * statement.cs: Track the result of the assignment.
11441
11442 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
11443
11444         * expression.cs (MemberAccess): Improved error reporting for
11445         inaccessible members.
11446
11447 2002-05-22  Martin Baulig  <martin@gnome.org>
11448
11449         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
11450         itself with debugging support.
11451
11452 2002-05-22  Martin Baulig  <martin@gnome.org>
11453
11454         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
11455         Removed, this isn't needed anymore.
11456
11457 2002-05-20  Martin Baulig  <martin@gnome.org>
11458
11459         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
11460         be underlying type for an enum.
11461
11462 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
11463
11464         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
11465         that splits out the loading of just the core types.
11466
11467         * rootcontext.cs (ResolveCore): Split the struct resolution in
11468         two, so we can load the enumeration underlying types before any
11469         enums are used.
11470
11471         * expression.cs (Is): Bandaid until we fix properly Switch (see
11472         bug #24985 for details).
11473
11474         * typemanager.cs (ImplementsInterface): The hashtable will contain
11475         a null if there are no interfaces implemented.
11476
11477 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
11478
11479         * cs-parser.jay (indexer_declarator): It is fine to have array
11480         parameters
11481
11482 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11483
11484         * typemanager.cs: (RegisterBuilder): New function used to register
11485         TypeBuilders that implement interfaces.  Since
11486         TypeBuilder.GetInterfaces (as usual) does not work with lame
11487         Reflection.Emit. 
11488         (AddUserType): register interfaces.
11489
11490         (ImplementsInterface): Use the builder_to_ifaces hash if we are
11491         dealing with TypeBuilder.  Also, arrays are showing up as
11492         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
11493         methods can not be invoked on them!
11494
11495         * ecore.cs (ExplicitReferenceConversionExists): Made public.
11496         (ImplicitReferenceConversionExists): Split out from
11497         StandardConversionExists. 
11498
11499         * expression.cs (As): We were only implementing one of the three
11500         cases for the as operator.  We now implement them all.
11501         (Is): Implement the various other cases for Is as well.
11502
11503         * typemanager.cs (CACHE): New define used to control if we want or
11504         not the FindMembers cache.  Seems to have a negative impact on
11505         performance currently
11506
11507         (MemberLookup): Nested types have full acess to
11508         enclosing type members
11509
11510         Remove code that coped with instance/static returns for events, we
11511         now catch this in RealFindMembers.
11512
11513         (RealFindMembers): only perform static lookup if the instance
11514         lookup did not return a type or an event.  
11515
11516 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11517
11518         * assign.cs (CompoundAssign): We pass more semantic information
11519         now to Compound Assignments than we did before: now we have all
11520         the information at hand, and now we resolve the target *before* we
11521         do the expression expansion, which allows the "CacheValue" method
11522         to have the effect we intended (before, a [x] += 1 would generate
11523         two differen ArrayAccess expressions from the ElementAccess,
11524         during the resolution process).
11525
11526         (CompoundAssign.DoResolve): Resolve target and original_source here.
11527
11528 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
11529
11530         * expression.cs (ArrayAccess): dropped debugging information. 
11531
11532         * typemanager.cs: Small bug fix: I was always returning i_members,
11533         instead of one of i_members or s_members (depending on which had
11534         the content).
11535
11536         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
11537         method is invoked before any code generation takes place, and it
11538         is a mechanism to inform that the expression will be invoked more
11539         than once, and that the method should use temporary values to
11540         avoid having side effects
11541
11542         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
11543
11544         * ecore.cs (Expression.CacheTemporaries): Provide empty default
11545         implementation.
11546
11547         * expression.cs (Indirection, ArrayAccess): Add support for
11548         CacheTemporaries in these two bad boys. 
11549
11550         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
11551         ldobj or ldind_ref.  
11552         (StoreFromPtr): Handle stobj as well.
11553
11554         * expression.cs (UnaryMutator): Share more code.
11555
11556         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
11557         down: I was not tracking the Filter function as well, which
11558         was affecting the results of the cache.
11559
11560 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
11561
11562         * attribute.cs: Remove the hack to handle the CharSet property on
11563         StructLayouts. 
11564
11565 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
11566
11567         * attribute.cs (DoResolve): More uglyness, we now only try to
11568         resolve the attribute partially, to extract the CharSet
11569         information (only if we are a StructLayout attribute).  Otherwise 
11570
11571         (GetExtraTypeInfo): Add some code to conditionally kill in the
11572         future this.   I am more and more convinced that the .NET
11573         framework has special code to handle the attribute setting on
11574         certain elements.
11575
11576         * expression.cs (IsParamsMethodApplicable): Revert my previous
11577         foreach change here, it was wrong.
11578
11579 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
11580
11581         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
11582         (pp_expr): do not abort on unknown input, just return.
11583         (eval): abort if there are pending chars.
11584
11585         * attribute.cs (Attribute.Resolve): Positional parameters are
11586         optional.  Deal with that case.
11587
11588         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
11589         the Ansi/Unicode/Auto information for the type.
11590
11591         (TypeContainer.DefineType): instantiate the EmitContext here, as
11592         we will be using it during the type definition (to resolve
11593         attributes) and during the emit phase.
11594
11595         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
11596         to pull type information out of the attributes
11597
11598         (Attribute.Resolve): track the constructor builder, and allow for
11599         multiple invocations (structs and classes will use this).
11600
11601         * ecore.cs (MemberLookupFinal): new version with all the
11602         parameters customizable.
11603
11604         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11605         constructors.  Return if the result value is null (as the error
11606         would have been flagged already by MemberLookupFinal)
11607
11608         Do not allow instances of abstract classes or interfaces to be
11609         created.
11610
11611         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11612         We have to compare the assembly property here when dealing with
11613         FamANDAssem and Assembly access modifiers, because we might be
11614         creating an assembly from *modules* (that means that we are not
11615         getting TypeBuilders for types defined in other modules that are
11616         part of this assembly).
11617
11618         (Method.Emit): If the method is marked abstract and has a body,
11619         emit an error. 
11620
11621         (TypeContainer.DefineMembers): If both the defined member and the
11622         parent name match are methods, then do not emit any warnings: let
11623         the Method.Define routine take care of flagging warnings.  But if
11624         there is a mismatch (method overrides something else, or method is
11625         overriwritten by something, then emit warning).
11626
11627         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11628         set to null, this means `do not check for the return type on the
11629         signature'. 
11630
11631         (Method.Define): set the return type for the method signature to
11632         null, so that we get methods with the same name and parameters and
11633         different return types.  This is used to flag warning 114 (you are
11634         hiding a method, and you probably want to use the new/override
11635         keywords instead).
11636
11637         * typemanager.cs (MemberLookup): Implemented proper access
11638         control, closing a long standing set of bug reports.  The problem
11639         was that the Framework only has two bits: Public and NonPublic,
11640         and NonPublic includes private and protected methods, but we need
11641         to enforce the FamANDAssem, FamOrAssem and Family. 
11642
11643 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11644
11645         * statement.cs (GotoCase): Return true: Ammounts to giving up
11646         knowledge on whether we return or not, and letting the other case
11647         be responsible for it.
11648
11649 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11650
11651         * driver.cs: Do not load directories for each file processed, only
11652         do it if there is a pattern.
11653
11654         * ecore.cs: Report readonly assigns here as well, as we might have
11655         been resolved only by MemberAccess.
11656
11657         (SimpleName.SimpleNameResolve): Also be useful for LValue
11658         resolution.   We need this to propagate assign to local readonly variables
11659
11660         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11661         do not want to reuse potential criteria memory.
11662
11663         * class.cs (MyEventBuilder): Set reflected_type;
11664
11665         * ecore.cs (Constantify): Added support for constifying bools.
11666
11667         (RootContext.LookupType): Added a cache for values looked up in
11668         the declaration space.
11669
11670         * typemanager.cs (FindMembers): Now is a front-end to
11671         RealFindMembers, and provides a two-level hashtable-based cache to
11672         the request.  
11673
11674         15% performance improvement: from 22.5 to 19.2 seconds.
11675
11676         * expression.cs (IsParamsMethodApplicable): use foreach.
11677         (Invocation.DoResolve): ditto.
11678         (New.DoResolve): ditto.
11679         (ArrayCreation.DoResolve): ditto.
11680
11681         * ecore.cs (FindMostEncompassingType): use foreach.
11682
11683         * delegate.cs (NewDelegate.DoResolve): Use foreach
11684
11685         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11686         (RemoveMethods): use foreach.
11687
11688         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11689         nested foreach statements instead of for, and also break out of
11690         the inner loop once a match is found.
11691
11692         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11693
11694 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11695
11696         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11697         we actually unwrap the expression to allow for extra information
11698         to be extracted. 
11699
11700         * expression.cs: Use Shr_Un on unsigned operations. 
11701
11702 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11703
11704         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11705         applicable operators was not being considered correctly. This closes
11706         the bug Miguel reported.
11707
11708 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11709
11710         * attribute.cs: check that the type derives from System.Attribute
11711         and report the correct error in that case (moved the duplicate code to
11712         its own method, too).
11713
11714 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11715
11716         * attribute.cs: lookup attribute type name as the spec says: first the
11717         bare attribute name and then name + "Attribute" (nant compiles with
11718         mcs after this fix).
11719
11720 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11721
11722         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11723         Because of the way we parse things, we should try to see if a
11724         UIntConstant can fit in an integer.
11725
11726 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11727
11728         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11729         when we are in an explicit context.
11730
11731         (ConvertReferenceExplicit): When converting from Iface type S to Class
11732         T make sure the rules are implemented as an OR.
11733
11734         * parameter.cs (ParameterType): Make it a property for now although the
11735         purpose really isn't anything immediate.
11736
11737         * expression.cs (Is*Applicable): Do better checking on the parameter type
11738         of a ref/out parameter. The ones from the system assemblies are already 
11739         marked with the correct type so we don't need to do any correction.
11740
11741         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11742         the object type is standard too so include that.
11743
11744 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11745
11746         * ecore.cs (StandardConversionExists): Augment with missing code:
11747         deal with IntConstant, LongConstants and Enumerations.
11748
11749         * assign.cs: Report the error, instead of failing silently
11750
11751         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11752         typecontainer that they are declared, because the
11753         typecontainer/namespace will have the list of using clauses that
11754         need to be applied.
11755
11756         Assembly Attributes were escaping the normal registration
11757         mechanism. 
11758
11759         (EmitCode): Apply attributes within an EmitContext that represents
11760         the container they were declared on.
11761
11762         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11763
11764 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11765
11766         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11767         Revamp completely - make much cleaner as we now operate only
11768         on a set of Types.
11769
11770         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11771         to implement the logic detailed in the spec more correctly.
11772
11773         (UserDefinedConversion): Update accordingly.
11774
11775 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11776
11777         * statement.cs: Return flow analysis information up.
11778
11779         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11780         and the default.
11781
11782         (token): Do not consume an extra character before calling
11783         decimal_digits.
11784
11785 2002-05-06  Piers Haken <piersh@friskit.com>
11786
11787         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11788
11789 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11790
11791         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11792         EmitContext during the instance constructor initializer
11793         resolution, to stop access to instance variables.
11794
11795         This is mandated by the spec, last paragraph of the `constructor
11796         initializers' section. 
11797
11798 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11799
11800         * cs-parser.jay, class.cs (Accessor): new class used to represent
11801         an accessor (get or set).  In the past we used `null' to represent
11802         a missing accessor.  But this is ambiguous because there was no
11803         way to tell in abstract indexers/properties if one of them was
11804         specified.
11805
11806         Now there is a way of addressing that.
11807
11808         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11809         instead of FindMembers.
11810
11811         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11812         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11813
11814         * attribute.cs: Treat indexers and properties as the same in terms
11815         of applying attributes
11816
11817         * ecore.cs (FindMostEncompassedType): Use statically initialized
11818         EmptyExpressions()s like we do elsewhere to avoid creating useless
11819         objects (and we take this out of the tight loop).
11820
11821         (GetConversionOperators): Move the code to extract the actual
11822         operators to a separate routine to clean things up.
11823
11824 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11825
11826         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
11827         events are always registered FieldBuilders.
11828
11829         * class.cs (FieldBase): New class shared by Fields 
11830
11831         * delegate.cs: If we are a toplevel delegate, use our full name.
11832         If we are a nested delegate, then only use our tail name.
11833
11834 2002-05-02  Ravi Pratap  <ravi@ximian.com>
11835
11836         * expression.cs (IsApplicable): Ensure that we add the "&" to
11837         ref/out types before comparing it with the type of the argument.
11838
11839         (IsParamsMethodApplicable): Ditto.
11840
11841         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
11842         silly me ;-)
11843
11844         * delegate.cs : Handle the case when we have more than one applicable
11845         method. Flag an error only when we finish checking all.
11846
11847 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
11848
11849         * expression.cs: Add support for boolean static initializers.
11850
11851 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
11852
11853         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
11854
11855         * parameter.cs (ComputeParameterTypes,
11856         ComputeAndDefineParameterTypes): Better error handling: now we
11857         clear the `types' cache if we fail during any of the type lookups.
11858         We also return the status code correctly to our caller
11859
11860         * delegate.cs: If we fail to define a delegate, abort the extra
11861         steps. 
11862
11863         * expression.cs (Binary.ResolveOperator): for
11864         operator==(object,object) and operator !=(object, object) we also
11865         have to verify that there is an implicit conversion from one to
11866         the other.
11867
11868         (ArrayAccess.DoResolve): Array Access can operate on
11869         non-variables. 
11870
11871 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
11872
11873         * assign.cs (CompoundAssign): A new class used as a "flag" that
11874         the assignment actually is happening as part of a compound
11875         assignment operator.
11876
11877         During compound assignment, a few new rules exist to enable things
11878         like:
11879
11880         byte b |= 1 + 2
11881
11882         From the spec:
11883
11884         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
11885         to the type of x) if y is implicitly convertible to the type of x,
11886         and the operator is a builtin operator and the return type of the
11887         operator is explicitly convertible to the type of x. 
11888
11889         * rootcontext.cs: Reset warning level to 2.  4 catches various
11890         "interesting" features in mcs, we must clean this up at some
11891         point, but currently am trying to kill other bugs ;-)
11892
11893         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
11894         in container classes as well.  
11895
11896         * expression.cs (Binary.ResolveOperator): Handle string case
11897         before anything else (as operator overloading does emit an error
11898         before doing anything else).
11899
11900         This code could go away when we move to a table driven model, but
11901         i could not come up with a good plan last night.
11902
11903 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
11904
11905         * typemanager.cs (CSharpName): reimplementation using regex.
11906         * class.cs: added null check for fields in Emit
11907         * rootcontext.cs: set warninglevel to 4
11908
11909 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
11910
11911         * typemanager.cs (CSharpName): reimplemented with Lupus
11912         suggestion.
11913
11914 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
11915
11916         * statement.cs (If): correclty implement Resolve, because we were
11917         not catching sem errors in there.  The same process is needed
11918         everywhere else. 
11919         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
11920
11921
11922         (Statement.Warning_DeadCodeFound): Factorize code.
11923         (While): Report dead code here too.
11924
11925         (Statement): Added Resolve virtual method to allow
11926         for resolution split from the emit code.
11927
11928 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11929
11930         * statement.cs (EmitBoolExpression): No longer try to resolve the
11931         expression here.    
11932         (MakeBoolean): New utility function that resolve, implicitly
11933         converts to boolean and tags the expression. 
11934
11935
11936         (If, Do): Implement dead code elimination.
11937         (While): Implement loop inversion
11938
11939         (Do, While, For, If): Resolve the expression prior to calling our
11940         code generation.
11941
11942 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
11943
11944         * class.cs:
11945           - added method Report28 (warning: program has more than one entry point)
11946           - added method IsEntryPoint, implements paragraph 10.1 of the spec
11947           - modified method Method.Define, the part at the end of the method
11948
11949         * rootcontext.cs: added static public Location EntryPointLocation;
11950           
11951         * ../errors/cs0028.cs : Add test case for the above warning.              
11952
11953         * typemanager.cs:
11954           - modified method CSharpName to allow arrays of primitive type to
11955             be printed nicely (e.g. instead of System.Int32[][] it now prints
11956             int[][])
11957           - added method CSharpSignature: returns the signature of a method
11958             in string format to be used in reporting errors, warnings, etc.
11959
11960         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
11961         with String.Empty.
11962
11963 2002-04-26  Ravi Pratap  <ravi@ximian.com>
11964
11965         * delegate.cs (Define): Fix extremely silly bug where I was
11966         setting the type of the 'object' parameter of the BeginInvoke
11967         method to System.IAsyncResult instead of System.Object ;-)
11968
11969 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11970
11971         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
11972         here. 
11973
11974         (Constructor.Emit): return if we fail to initialize the
11975         constructor.  Another door closed!  
11976
11977         * expression.cs (New.DoResolve): Improve error message (from -6 to
11978         1501).  Use DeclaredOnly lookup to find the exact constructor.
11979
11980         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
11981         loop.  This is useful.
11982
11983         * cs-parser.jay: Adjust the default parameters so that destructors
11984         have the proper signature.
11985
11986 2002-04-26  Martin Baulig  <martin@gnome.org>
11987
11988         * driver.cs (LoadAssembly): If `assembly' contains any characters
11989         which are only valid in path names and not in assembly names
11990         (currently slash, backslash and point), use Assembly.LoadFrom ()
11991         instead of Assembly.Load () on the `assembly' (before iteration
11992         over the link_paths).
11993
11994 2002-04-26  Martin Baulig  <martin@gnome.org>
11995
11996         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11997
11998 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11999
12000         * class.cs (Property): use the new typemanager.MemberLookup
12001
12002         (TypeContainer.MemberLookup): Implement using the
12003         TypeManager.MemberLookup now. 
12004
12005         * typemanager.cs: Make MemberLookup a function of the TypeManager,
12006         and return MemberInfos, so that these can be used without an
12007         EmitContext (what we had before).
12008
12009 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
12010
12011         * expression.cs: Fix the case where the argument to params if the
12012         type of the params.  I omitted handling this before.   Fixed
12013
12014 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
12015
12016         * driver.cs: Call BootCorlib_PopulateCoreType
12017
12018         * class.cs (Property.CheckBase): Check for properties only, not
12019         for all members. 
12020
12021         * interface.cs: Temporary hack: try/catch around the
12022         CustomAttributeBuilder, because I am getting an exception that I
12023         do not understand.
12024
12025         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
12026         types whose definitions are required to be there (attributes are
12027         defined before standard types).
12028
12029         Compute definitions as we boot the various types, as they are used
12030         immediately (value_type class will need object_type, but if we do
12031         not initialize object_type, we will pass a null, which will let
12032         the runtime pick the System.Object from the existing corlib, which
12033         is not what we want).
12034
12035 2002-04-22  Patrik Torstensson <totte@labs2.com>
12036
12037         * cs-tokenizer.cs: fixed a number of trim() issues.
12038
12039 2002-04-22  Ravi Pratap  <ravi@ximian.com>
12040
12041         * expression.cs (Argument.Type): Ensure that we return the correct
12042         type when we have out or ref parameters [in which case we 
12043         append a "&"].
12044
12045 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
12046
12047         * class.cs (Property, Indexer): Allow extern modifier in there. 
12048
12049         * typemanager.cs (InitBaseTypes): Initializes object_type and
12050         value_type, since those will be used early on during the bootstrap
12051         process to compile corlib.
12052
12053         (InitCoreTypes): Move code from here to InitBaseTypes.
12054
12055 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
12056
12057         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
12058         single-dimension arrays as using the ldlen opcode.  
12059
12060         Daniel Lewis discovered this optimization.  
12061
12062         * typemanager.cs: Add signature for System.Array::get_Length
12063
12064 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12065
12066         * statement.cs: report the error when the foreach does not apply to an
12067         array nor a collection.
12068
12069 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
12070
12071         * expression.cs: Add implicit conversions to the operator ~.
12072
12073         * constant.cs (DecimalConstant.Emit): Emit decimal value.
12074
12075         * typemanager.cs: Locate the decimal constructor.
12076
12077 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12078
12079         * attribute.cs: use the new property of TypeOf.
12080         * expression.cs: added 'get' property around typearg.
12081
12082         These changes fix a build breaker reported by NickD. Is this the
12083         correct way to fix?  If not, please, revert my changes and make it
12084         work :-).
12085
12086 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
12087
12088         * attribute.cs: Add support for typeof in attribute invocations.
12089         I am not sure that this is right though.
12090
12091 2002-04-14  Duncan Mak  <duncan@ximian.com>
12092
12093         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
12094         Binary.Operator.Division case.
12095
12096 2002-04-13  Ravi Pratap  <ravi@ximian.com>
12097
12098         * class.cs (DefineType): Ensure that we do a proper check on
12099         attribute types and also register it with the TypeManager.
12100
12101         (TypeContainer.Targets): The default for attribute types is
12102         AttributeTargets.All.
12103
12104         * attribute.cs (ApplyAttributes): Registering the attribute type
12105         is done elsewhere, not when we discover we have a Usage attribute.
12106
12107 2002-04-12  Ravi Pratap  <ravi@ximian.com>
12108
12109         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
12110         and get rid of is_delegate parameter.
12111
12112         * everywhere : update.
12113
12114 2002-04-12  Ravi Pratap  <ravi@ximian.com>
12115
12116         * cs-parser.jay (compilation_unit): Revamp completely to use
12117         some new ideas that I got from Rhys' grammar to solve the problems
12118         with assembly level attributes.
12119
12120         (outer_declaration): New grammar production.
12121
12122         (attribute_sections): Add.
12123
12124         (opt_attributes): Base on attribute_sections
12125
12126         (namespace_declaration): Allow opt_attributes to tackle the case
12127         when we have assembly level attributes - we are clever in this
12128         regard now ;-)
12129
12130         * attribute.cs (ApplyAttributes): Do not worry about assembly 
12131         attributes in the non-global context.
12132
12133         * rootcontext.cs (AddGlobalAttributes): Go back to using this
12134         instead of SetGlobalAttributes.
12135
12136         * class.cs, rootcontext.cs : Ensure we define and generate 
12137         attribute types before anything else.
12138
12139         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
12140         and flag the new error -20 for the case when the attribute type
12141         does not have valid targets specified. csc does not catch this.
12142
12143         * ../errors/errors.txt : update for error # -20
12144
12145 2002-04-11  Ravi Pratap  <ravi@ximian.com>
12146
12147         * support.cs (InternalParameters.ParameterModifier): Do some null
12148         checking and return sane values.
12149
12150         * class.cs (Method.Define): If we are a PInvoke method, ensure
12151         that we are static and extern. Report error # 601
12152
12153         * ../errors/cs0601.cs : Add test case for the above error.
12154
12155 2002-04-07  Ravi Pratap  <ravi@ximian.com>
12156
12157         * rootcontext.cs (attribute_types): We need to keep type of
12158         all attribute types separately and emit code for them first.
12159
12160         (RegisterAttribute) : Implement.
12161
12162         * class.cs (DefineType): Check if the current Type is a custom
12163         attribute type and register it accordingly.
12164
12165         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
12166         adding the first attribute twice and rename to
12167
12168         (SetGlobalAttributes): this.
12169
12170         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
12171         lookups.
12172
12173         * attribute.cs (ApplyAttributes): Take an additional argument telling us
12174         if we are processing global arguments. Hmm, I am unsure of this.
12175
12176 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12177
12178         * expression.cs: added static array of strings to avoid calling
12179         Enum.ToString () for Operator in Binary. Significant recover of
12180         performance.
12181
12182 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
12183
12184         * class.cs (FindMembers): Allow the Builders of the various
12185         members to be null.  If they are skip them.  This only happens
12186         during the PInvoke declaration.
12187
12188 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
12189
12190         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
12191         failure, so we do not keep going afterwards.
12192
12193         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
12194         wanted to pass `false' as the `is_delegate' argument.  If this is
12195         the case, why not use delegate_type == null to mean `is_delegate =
12196         false' and anything else as is_delegate = true.
12197
12198 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
12199
12200         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
12201         code for the section, not the beginning of the tests.
12202
12203 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
12204
12205         * cfold.cs: Handle operator + (Enum x, Underlying x) 
12206
12207         * expression.cs (Binary): same.  Warn about errors where we have
12208         Enum/Enum in operator + as well.
12209
12210 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
12211
12212         * statement.cs:
12213                 - added support for switch(bool)
12214                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
12215                 - add TableSwitchEmit() to handle table-based switch statements
12216
12217 2002-04-05  Ravi Pratap  <ravi@ximian.com>
12218
12219         * expression.cs (Invocation.OverloadResolve): Factor out code which
12220         does parameter compatibility checking with arguments so that we can 
12221         re-use the code even from Delegate.VerifyApplicability
12222
12223         (VerifyArgumentsCompat): Move above code here.
12224
12225         * delegate.cs (VerifyApplicability): Get rid of duplicate code
12226         and instead make a call to the above method.
12227
12228 2002-03-31  Ravi Pratap  <ravi@ximian.com>
12229
12230         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
12231         We use it to keep track of classes which are attribute types.
12232
12233 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
12234
12235         * delegate.cs (Delegate.Define): Correctly define the types in the
12236         presence of fixed and array parameters.
12237
12238         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
12239         doing FindMembers.
12240
12241         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
12242         include NonPublic after the first iteration.
12243
12244         * class.cs (Indexer.CheckBase): Only check if both parents are
12245         non-null. 
12246
12247         * cs-parser.jay (accessor_body): If empty, set to null.
12248
12249         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
12250         same code path here to resolve constants names that we did have in
12251         MemberAccess.DoResolve.  There is too much code duplicated here.
12252
12253 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
12254
12255         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
12256
12257         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
12258         to MakeUnionSet.
12259
12260         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
12261         tokens, numbers and strings.
12262
12263         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
12264         parenthesis.
12265
12266         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
12267         asyncronous parameters and the regular parameters.  
12268
12269         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
12270         specify the target directory.
12271
12272         * expression.cs: (This.DoResolve): Simplify
12273         (As.Emit): Optimize, do not generate IsInst if the expression is
12274         always of the given type.
12275
12276         (Is.DoResolve): Bug fix, we were reporting both always/never for
12277         the is expression.
12278
12279         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
12280         creating too many unnecessary arrays.
12281
12282 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
12283
12284         * class.cs (EmitFieldInitializer): Use Assign expression to assign
12285         fields instead of rolling our own initializer.   Takes care of all
12286         implicit conversions, and drops unnecessary static checks/argument.
12287
12288 2002-03-31  Dick Porter  <dick@ximian.com>
12289
12290         * driver.cs: use the GetDirectories() return values properly, and
12291         use "/" as path separator.
12292
12293 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
12294
12295         * expression.cs (Unary): Optimize - - expr into expr.
12296         (Binary): Optimize a + (-b) into a -b.
12297
12298         * codegen.cs (CodeGen): Made all methods static.
12299
12300 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
12301
12302         * rootcontext.cs: 
12303
12304         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
12305         TypeBuilder property.
12306
12307         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
12308         instead. 
12309
12310         * tree.cs: Removed the various RecordXXXX, and replaced with a
12311         single RecordDecl.  Removed all the accessor methods, and just
12312         left a single access point Type 
12313
12314         * enum.cs: Rename DefineEnum to DefineType.
12315
12316         * decl.cs: New abstract method `DefineType' used to unify the
12317         Defines for Enumerations, Interfaces, TypeContainers and
12318         Delegates.
12319
12320         (FindType): Moved LookupInterfaceOrClass here.  Moved the
12321         LookupBaseClasses method that used to live in class.cs and
12322         interface.cs here, and renamed to FindType.
12323
12324         * delegate.cs: Implement DefineType.  Take advantage of the
12325         refactored pattern for locating the parent builder without taking
12326         the parent_builder argument (which we know does not work if we are
12327         nested, and triggering a toplevel definition).
12328
12329 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12330
12331         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
12332         accessibility of a member has changed during override and report
12333         an error if so.
12334
12335         * class.cs (Method.Define, Property.Define): Only complain on
12336         overrides if the method is private, any other accessibility is
12337         fine (and since we just checked the permission is the same, we are
12338         good to go).
12339
12340         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
12341         and elif are processed always.  The other pre-processing
12342         directives are only processed if we are "taking" the path
12343
12344 2002-03-29  Martin Baulig  <martin@gnome.org>
12345
12346         * class.cs (Method.Emit): Only emit symbolic debugging info if the
12347         current location is not Null.
12348
12349         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
12350         a separate method so we can profile it.
12351
12352         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
12353         `span.Seconds' are just seconds, but no minutes or hours.
12354         (MainDriver): Profile the CodeGen.SaveSymbols calls.
12355
12356 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12357
12358         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
12359         Remove the gratuitous set of Final:
12360
12361                                 // If an interface implementation, then we can set Final.
12362                                 if (((flags & MethodAttributes.Abstract) == 0) &&
12363                                     implementing.DeclaringType.IsInterface)
12364                                         flags |= MethodAttributes.Final;
12365
12366         I do not know what I was smoking when I used that.
12367
12368
12369         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
12370         step into fixing the name resolution issues for delegates and
12371         unifying the toplevel name resolution.
12372
12373 2002-03-28  Martin Baulig  <martin@gnome.org>
12374
12375         * class.cs (Method.Emit): If we have a symbol writer, call its
12376         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
12377         tell it about the current method.
12378
12379         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
12380         writer that we're going to emit the first byte of IL code for a new
12381         statement (a new source line).
12382         (EmitContext.EmitTopBlock): If we have a symbol writer, call
12383         EmitContext.Mark() before emitting any code.
12384
12385         * location.cs (SymbolDocument): Return null when we're Null.
12386
12387         * statement.cs (Statement): Moved the `Location loc' variable here.
12388         (Statement.EmitBoolExpression): If we have a symbol writer, call
12389         ec.Mark() before emitting any code to tell it that we're at the
12390         beginning of a new statement.
12391         (StatementExpression): Added `Location' argument to the constructor.
12392         (Block): Added public readonly variable `StartLocation' and public
12393         variable `EndLocation'.  The latter is to be set using SetEndLocation().
12394         (Block): Added constructor which takes a start and end location.
12395         (Block.SetEndLocation): New method. This sets the end location.
12396         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
12397         local variables we create.
12398         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
12399         each statement and do also mark the begin and end of the block.
12400
12401         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
12402         tell it the current lexer.Location, use Location.Null for the end of the
12403         block.
12404         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
12405         current block, set its end location using SetEndLocation().
12406         (statement_expression): StatementExpression constructor now takes the
12407         lexer.Location as additional argument.
12408         (for_statement, declare_local_variables): Likewise.
12409         (declare_local_variables): When creating a new implicit block, use the
12410         new Block constructor and pass it the lexer.Location.
12411
12412 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12413
12414         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
12415         members also on the parent interfaces recursively.
12416
12417 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
12418
12419         * report.cs: Use new formats, since Gonzalo finished the missing
12420         bits. 
12421
12422         * expression.cs (Binary.ResolveOperator): added missing operator|
12423         operator& and operator^ for bool/bool.
12424
12425         * cs-parser.jay: CheckDef now takes a Location argument that is
12426         used to report errors more precisly (instead of reporting the end
12427         of a definition, we try to track something which is a lot closer
12428         to the source of the problem).
12429
12430         * cs-tokenizer.cs: Track global token use, so we can properly flag
12431         the use of #define/#undef after the first token has been seen.
12432
12433         Also, rename the reportXXXX to Error_DescriptiveName
12434
12435         * decl.cs (DeclSpace.IsTopLevel): Move property here from
12436         TypeContainer, so that Enum and Interface can use this too.
12437
12438         * class.cs (TypeContainer.LookupInterfaceOrClass,
12439         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
12440         `builder' argument.  Typically this was used to pass the parent
12441         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
12442         the definition).  
12443
12444         The problem is that a nested class could trigger the definition of
12445         a toplevel class, and the builder would be obviously wrong in that
12446         case. 
12447
12448         So we drop this argument, and we compute dynamically the
12449         TypeBuilder/ModuleBuilder (the correct information was available
12450         to us anyways from DeclSpace.Parent)
12451
12452         * interface.cs (Interface.DefineInterface): Drop builder
12453         parameter cleanup like class.cs
12454
12455         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
12456         like class.cs
12457
12458         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
12459         values. 
12460
12461         (Try.Emit): Propagate the returns value from the statement.
12462
12463         (Return.Emit): Even if we are leavning 
12464
12465         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
12466
12467         * modifiers.cs: Fix the computation of MethodAttributes flags.
12468
12469 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
12470
12471         * driver.cs: allow compilation of files that start with '/'.
12472         Add a default case when checking the argument of --target.
12473
12474 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
12475
12476         * interface.cs: Implement the same search algorithm for types in
12477         the interface code.
12478
12479         * delegate.cs: Do not allow multiple definition.
12480
12481         * Recovered ChangeLog that got accidentally amputated
12482
12483         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
12484
12485         * rootcontext.cs: Load manually enum to allow core classes to
12486         contain enumerations.
12487
12488         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
12489         Update to new static methods in TypeManager.
12490
12491         * typemanager.cs (GetMethod, GetConstructor): Use our
12492         implementation of FindMembers to find the members, since during
12493         corlib compilation, the types are TypeBuilders and GetMethod and
12494         GetConstructor do not work.
12495
12496         Make all methods in TypeManager static.
12497
12498         (InitCodeHelpers): Split the functionality from
12499         the InitCodeTypes function.
12500
12501         * driver.cs: Call InitCodeHelpers after we have populated the
12502         types. 
12503
12504         * cs-parser.jay (delegate_declaration): we did not used to compute
12505         the delegate name correctly for void delegates.
12506
12507 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
12508
12509         * rootcontext.cs (RootContext): Init the interface_resolve_order
12510         and type_container_resolve_order always.
12511
12512         (ResolveCore, BootstrapCorlib_ResolveClass,
12513         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
12514         compiler when compiling with --nostdlib
12515
12516         * class.cs (TypeContainer.DefineType): Check that our parent is
12517         not null.  This test is most important when we are bootstraping
12518         the core types.
12519
12520         * codegen.cs: Split out the symbol writing code.
12521
12522 2002-03-25  Martin Baulig  <martin@gnome.org>
12523
12524         * driver.cs (-g): Made -g an alias for --debug.
12525
12526 2002-03-24  Martin Baulig  <martin@gnome.org>
12527
12528         * codegen.cs (SymbolWriter): New public variable. Returns the
12529         current symbol writer.
12530         (CodeGen): Added `bool want_debugging_support' argument to the
12531          constructor. If true, tell the ModuleBuild that we want debugging
12532         support and ask it for the ISymbolWriter.
12533         (Save): If we have a symbol writer, call it's Close() method after
12534         saving the assembly.
12535
12536         * driver.c (--debug): New command line argument to create a
12537         debugger information file.
12538
12539         * location.cs (SymbolDocument): New public property. Returns an
12540         ISymbolDocumentWriter object for the current source file or null
12541         if we don't have a symbol writer.
12542
12543 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
12544
12545         * driver.cs (LoadAssembly): Correctly return when all the paths
12546         have been tried and not before.
12547
12548         * statement.cs (Switch.Emit): return the actual coverage for this
12549         statement (returns/not-returns)
12550
12551         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
12552         switch of the statement if we are the last switch section.  That
12553         kills two problems: try/catch problems (we used to emit an empty
12554         nop at the end) and switch statements where all branches would
12555         return. 
12556
12557 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
12558
12559         * driver.cs: Add default assemblies (the equivalent to the
12560         Microsoft CSC.RSP file)
12561
12562         * cs-tokenizer.cs: When updating `cols and setting it to zero,
12563         also update tokens_seen and set it to false.
12564
12565         * driver.cs: Implement --recurse for Mike.
12566
12567         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
12568         correctly splitting out the paths.
12569
12570 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
12571
12572         * interface.cs (Interface.PopulateProperty): Instead of using
12573         `parent' as the declaration space for the set parameters, use
12574         `this' 
12575
12576         * support.cs (InternalParameters): InternalParameters constructor
12577         takes a DeclSpace instead of a TypeContainer.
12578
12579         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
12580         types are being initialized, load the address of it before calling
12581         the function.  
12582
12583         (New): Provide a mechanism to disable the generation of local
12584         value type temporaries when the caller will be providing us with
12585         an address to store it.
12586
12587         (ArrayCreation.EmitDynamicInitializers): Use it.
12588
12589 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
12590
12591         * expression.cs (Invocation.EmitArguments): Only probe for array
12592         property if there is more than one argument.  Sorry about that.
12593
12594         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
12595         empty param arrays.
12596
12597         * class.cs (Method.LabelParameters): Fix incorrect code path that
12598         prevented the `ParamArrayAttribute' from being applied to the
12599         params attribute.
12600
12601 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12602
12603         * support.cs (ReflectionParameters): Correctly compute whether the
12604         last argument is a params array.  Fixes the problem with
12605         string.Split ('a')
12606
12607         * typemanager.cs: Make the assemblies array always be non-null
12608         (empty, but non-null)
12609
12610         * tree.cs (RecordDecl): New function that abstracts the recording
12611         of names.  This reports error 101, and provides a pointer to the
12612         previous declaration.  Fixes a crash in the compiler.
12613
12614         * cs-parser.jay (constructor_declaration): Update to new grammar,
12615         and provide a constructor_body that can be empty.
12616
12617 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12618
12619         * driver.cs: Add support for --resources.
12620
12621         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12622         Make all types for the various array helper methods be integer.
12623
12624         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12625         CheckState to ConvCast.
12626
12627         (ConvCast): Now it takes a `checked' state argument, to avoid
12628         depending on the emit context for the conversion, and just using
12629         the resolve time setting.
12630
12631         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12632         instead of Invocation.EmitArguments.  We do not emit the original
12633         arguments, instead we emit those which have been converted to
12634         unsigned int expressions.
12635
12636         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12637
12638         * codegen.cs: ditto.
12639
12640         * expression.cs (LocalVariableReference): Drop the use of the
12641         Store function that depended on the variable index.
12642
12643         * statement.cs (VariableInfo): Drop the `Idx' property from this
12644         class, as this is not taking into account the indexes for
12645         temporaries tat we generate during the execution, getting the
12646         indexes wrong.
12647
12648         * class.cs: First emit class initializers, then call the parent
12649         constructor. 
12650
12651         * expression.cs (Binary): Fix opcode emision.
12652         (UnaryMutator.EmitCode): Support checked code generation
12653
12654         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12655         matches for events for both the Static and Instance scans,
12656         pointing to the same element.   Fix that.
12657
12658 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12659
12660         * rootcontext.cs (ResolveTree): Always set the
12661         interface_resolve_order, because nested interfaces will be calling
12662         into us.
12663
12664         * class.cs (GetInterfaceOrClass): Track the same resolution
12665         process used by TypeManager.LookupType.  This fixes the nested
12666         type lookups in class declarations (separate path from
12667         LookupType). 
12668
12669         (TypeContainer.DefineType): Also define nested interfaces.
12670         (TypeContainer.RegisterOrder): New public function used to
12671         register the order in which child interfaces need to be closed.
12672
12673         Nested interfaces need to be closed after their parents have been
12674         created. 
12675
12676         * interface.cs (InterfaceAttr): Put all the logic for computing
12677         the interface attribute here. 
12678
12679         (DefineInterface): Register our interface order with the
12680         RootContext or with the TypeContainer depending on the case.
12681
12682 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12683
12684         * cs-parser.jay: rework foreach statement to work with the new
12685         changes to the policy on SimpleNames.
12686
12687         * report.cs: support Stacktrace on warnings as well.
12688
12689         * makefile: drop --unsafe and /unsafe from the compile.
12690
12691 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12692
12693         * ecore.cs (StandardConversionExists): Modify to take an Expression
12694         as the first parameter. Ensure we do null -> reference type conversion
12695         checking.
12696
12697         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12698         temporary Expression objects.
12699
12700 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12701
12702         * interface.cs: workaround bug in method overloading resolution
12703         (there is already a bugzilla bug for it).
12704
12705 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12706
12707         We could also solve this problem by having a separate path for
12708         performing type lookups, instead of DoResolve, we could have a
12709         ResolveType entry point, and only participating pieces of the
12710         production (simplename, deref, array) would implement this. 
12711
12712         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12713         signal SimpleName to only resolve type names and not attempt to
12714         resolve anything else.
12715
12716         * expression.cs (Cast): Set the flag.
12717
12718         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12719
12720         * class.cs: Only report 108 if there is no `new' modifier.
12721
12722         * cs-parser.jay: rework foreach statement to work with the new
12723         changes to the policy on SimpleNames.
12724
12725         * report.cs: support Stacktrace on warnings as well.
12726
12727         * makefile: drop --unsafe and /unsafe from the compile.
12728
12729 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12730
12731         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12732         lookups here, instead of doing that at parse time.  This means
12733         that our grammar will not introduce `LocalVariableReferences' as
12734         expressions at this point.  That solves the problem of code like
12735         this:
12736
12737         class X {
12738            static void Main ()
12739            { int X = 1;
12740             { X x = null }}}
12741
12742         This is only half the fix.  The full fix requires parameters to
12743         also be handled in this way.
12744
12745         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12746         makes the use more obvious of the DeclSpace.  The
12747         ec.TypeContainer.TypeBuilder is now only used to pull the
12748         TypeBuilder for it.
12749
12750         My theory is that I can get rid of the TypeBuilder completely from
12751         the EmitContext, and have typecasts where it is used (from
12752         DeclSpace to where it matters).  
12753
12754         The only pending problem is that the code that implements Aliases
12755         is on TypeContainer, and probably should go in DeclSpace.
12756
12757         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12758         lookups here, instead of doing that at parse time.  This means
12759         that our grammar will not introduce `LocalVariableReferences' as
12760         expressions at this point.  That solves the problem of code like
12761         this:
12762
12763         class X {
12764            static void Main ()
12765            { int X = 1;
12766             { X x = null }}}
12767
12768         This is only half the fix.  The full fix requires parameters to
12769         also be handled in this way.
12770
12771         * class.cs (Property.DefineMethod): When implementing an interface
12772         method, set newslot, when implementing an abstract method, do not
12773         set the flag (before we tried never setting it, or always setting
12774         it, which is the difference).
12775         (Indexer.DefineMethod): same.
12776         (Method.DefineMethod): same.
12777
12778         * ecore.cs: Only set the status used flag if we get back a Field.
12779
12780         * attribute.cs: Temporary hack, so Paolo can keep working.
12781
12782 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12783
12784         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12785         the unmanaged type in the case we have a MarshalAs attribute.
12786
12787         (Resolve): Handle the case when we are parsing the special MarshalAs
12788         attribute [we need to store the unmanaged type to use later]
12789
12790         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12791         MarshalAs Attribute.
12792
12793         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12794         on parameters and accordingly set the marshalling info.
12795
12796 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12797
12798         * class.cs: Optimizing slightly by removing redundant code after
12799         we switched to the `NoTypes' return value.
12800         (Property.DefineMethod): use NoTypes here too.
12801
12802         This fixes the bug I introduced in my last batch of changes.
12803
12804 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12805
12806         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12807
12808         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12809         Enums since those are types too. 
12810
12811         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12812
12813         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12814         thanks to a call during the lookup process.
12815
12816 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12817
12818         * statement.cs (Foreach): Lots of work to accomodate a particular
12819         kind of foreach statement that I had not kept in mind.  It is
12820         possible to have foreachs on classes that provide a GetEnumerator
12821         method that return objects that implement the "pattern" for using
12822         a foreach, there is no need to support GetEnumerator
12823         specifically. 
12824
12825         This is needed to compile nant.
12826
12827         * decl.cs: Only report 114 if the member is not `Finalize' and if
12828         the warning level is at least 2.
12829
12830         * class.cs: Moved the compare function from Method to
12831         MethodSignature. 
12832
12833         (MethodSignature.InheritableMemberSignatureCompare): Add new
12834         filter function that is used to extract inheritable methods from a
12835         class. 
12836
12837         (Method.Define): Use the new `inheritable_method_signature_filter'
12838         delegate
12839
12840         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
12841         command. 
12842
12843 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
12844
12845         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
12846
12847         * cs-parser.jay: Add opt_semicolon to the interface declaration.
12848
12849         * expression.cs: Pass location information to
12850         ConvertImplicitStandard. 
12851
12852         * class.cs: Added debugging code to track return values from
12853         interfaces. 
12854
12855 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
12856
12857         * expression.cs (Is.DoResolve): If either side of the `is' is an
12858         interface, do not flag the warning.
12859
12860         * ecore.cs (ImplicitReferenceConversion): We need a separate test
12861         for interfaces
12862
12863         * report.cs: Allow for --fatal to be used with --probe.
12864
12865         * typemanager.cs (NoTypes): Move the definition for the empty Type
12866         array here. 
12867
12868         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
12869         properties. 
12870         (TypeContainer.DefineProxy): New function used to proxy to parent
12871         implementations when implementing interfaces.
12872         (TypeContainer.ParentImplements): used to lookup if our parent
12873         implements a public function that is required by an interface.
12874         (TypeContainer.VerifyPendingMethods): Hook this up.
12875
12876         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
12877         `modules' and `assemblies' arraylists into arrays.  We only grow
12878         these are the very early start up of the program, so this improves
12879         the speedof LookupType (nicely measured).
12880
12881         * expression.cs (MakeByteBlob): Replaced unsafe code with
12882         BitConverter, as suggested by Paolo.
12883
12884         * cfold.cs (ConstantFold.Binary): Special case: perform constant
12885         folding of string concatenation, but if either side is a string,
12886         and the other is not, then return null, and let the runtime use
12887         the concatenation on the string plus the object (using
12888         `Object.ToString'). 
12889
12890 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
12891
12892         Constant Folding has been implemented now.
12893
12894         * expression.cs (Unary.Reduce): Do not throw an exception, catch
12895         the error instead on types that are not supported in one's
12896         complement. 
12897
12898         * constant.cs (Constant and all children): New set of functions to
12899         perform implict and explicit conversions.
12900
12901         * ecore.cs (EnumConstant): Implement the new functions to perform
12902         conversion by proxying to the child expression.
12903
12904         * codegen.cs: (ConstantCheckState): Constant evaluation has its
12905         own separate setting that can not be turned off from the command
12906         line using --unchecked or --checked and is only controlled using
12907         the checked/unchecked statements and expressions.  This setting is
12908         used by the constant folder to flag errors.
12909
12910         * expression.cs (CheckedExpr, UncheckedExpr): Set the
12911         ConstantCheckState as well.   
12912
12913         During Resolve, they also have to flag the state, because the
12914         constant folder runs completely in the Resolve phase.
12915
12916         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
12917         well.
12918
12919 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12920
12921         * cfold.cs: New file, this file contains the constant folder.
12922
12923         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
12924         argument to track whether we are using the resulting address to
12925         load or store a value and provide better error messages. 
12926
12927         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
12928         new AddressOf arguments.
12929
12930         * statement.cs (Foreach.EmitCollectionForeach): Update
12931
12932         * expression.cs (Argument.Emit): Call AddressOf with proper
12933         arguments to track usage.
12934
12935         (New.DoEmit): Call AddressOf with new arguments.
12936
12937         (Unary.Emit): Adjust AddressOf call.
12938
12939 2002-03-01  Ravi Pratap  <ravi@ximian.com>
12940
12941         * cs-parser.jay (member_access): Change the case for pre-defined types
12942         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
12943         this suggestion.
12944
12945         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
12946         a method body.
12947
12948         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
12949         essentially like methods and apply attributes like MethodImplOptions to them too.
12950
12951         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
12952         not being null.
12953
12954         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
12955         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
12956         is the DeclSpace.
12957
12958         * Update code everywhere accordingly.
12959
12960         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
12961
12962         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
12963
12964 2002-02-28  Ravi Pratap  <ravi@ximian.com>
12965
12966         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
12967         try performing lookups against those instead of jumping straight into using
12968         the 'using' clauses.
12969
12970         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
12971
12972         (LookupType): Perform lookups in implicit parents too.
12973
12974         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
12975         sequence as RootContext.LookupType. 
12976
12977         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
12978         the various cases of namespace lookups into this method.
12979
12980 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12981
12982         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
12983         in positional arguments)
12984
12985         * class.cs (Operator): Update the AllowedModifiers to contain
12986         extern. 
12987
12988         * cs-parser.jay: Update operator declaration to allow for the
12989         operator body to be empty.
12990
12991         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12992         values. 
12993
12994 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12995
12996         * class.cs (Method.Emit): Label parameters.
12997
12998         * driver.cs: Return 1 or 0 as the program exit code.
12999
13000 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
13001
13002         * expression.cs: Special case the `null' object when trying to
13003         auto-compute the type, as anything can be explicitly converted to
13004         that. 
13005
13006         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
13007         spotting this Paolo.
13008
13009         (Expression.ImplicitNumericConversion): Perform comparissions of
13010         the type using the underlying type in the case of an enumeration
13011         rather than using the enumeration type for the compare.
13012
13013         Cope with the underlying == type case, which is not possible to
13014         catch before. 
13015
13016         (Expression.ConvertNumericExplicit): Perform comparissions of
13017         the type using the underlying type in the case of an enumeration
13018         rather than using the enumeration type for the compare.
13019
13020         * driver.cs: If the user does not supply an extension, assume .exe
13021
13022         * cs-parser.jay (if_statement): Rewrote so that we can track the
13023         location for the if statement.
13024
13025         * expression.cs (Binary.ConstantFold): Only concat strings when
13026         the operation is "+", not everything ;-)
13027
13028         * statement.cs (Statement.EmitBoolExpression): Take a location
13029         argument. 
13030         (If, While, Do): Track location.
13031
13032         * expression.cs (Binary.ResolveOperator): In the object + string
13033         case, I was missing a call to ConvertImplicit
13034
13035 2002-02-25  Ravi Pratap  <ravi@ximian.com>
13036
13037         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
13038         Location arguments. Ensure we use RootContext.LookupType to do our work
13039         and not try to do a direct Type.GetType and ModuleBuilder.GetType
13040
13041         * interface.cs (PopulateMethod): Handle the type of the parameter being
13042         null gracefully.
13043
13044         * expression.cs (Invocation.BetterFunction): Handle the case when we 
13045         have a params method with no fixed arguments and a call is made with no
13046         arguments.
13047
13048 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
13049
13050         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
13051         the verbatim-string-literal
13052
13053         * support.cs (InternalParameters.ParameterModifier): handle null
13054         fixed parameters.
13055         (InternalParameters.ParameterType): ditto.
13056
13057         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
13058         duplicating the name of the variable parameter.
13059         (GetParameterByName): Fix bug where we were not looking up array
13060         paramters if they were the only present (thanks Paolo!).
13061         (GetParameterInfo): We only have an empty set of types if both
13062         fixed and array are set to null.
13063         (GetParameterInfo-idx): Handle FixedParameter == null
13064
13065         * cs-parser.jay: Handle the case where there is no catch
13066         statements (missing null test).
13067
13068 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
13069
13070         * driver.cs (MainDriver): Be conservative on our command line
13071         handling.
13072
13073         Catch DirectoryNotFoundException when calling GetFiles.
13074
13075         (SplitPathAndPattern): Used to split the input specification into
13076         a path and a pattern that we can feed to Directory.GetFiles.
13077
13078 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
13079
13080         * statement.cs (Fixed): Implement the last case of the Fixed
13081         statement (string handling).
13082
13083         * expression.cs (StringPtr): New class used to return a char * to
13084         a string;  Used by the Fixed statement.
13085
13086         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
13087
13088         * expression.cs (Binary.ResolveOperator): Remove redundant
13089         MemberLookup pn parent type.
13090         Optimize union call, we do not need a union if the types are the same.
13091         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
13092         type.
13093
13094         Specialize the use of MemberLookup everywhere, instead of using
13095         the default settings. 
13096
13097         (StackAlloc): Implement stackalloc keyword.
13098
13099         * cs-parser.jay: Add rule to parse stackalloc.
13100
13101         * driver.cs: Handle /h, /help, /?
13102
13103         * expression.cs (MakeByteBlob): Removed the hacks we had in place
13104         before we supported unsafe code.
13105
13106         * makefile: add --unsafe to the self compilation of mcs.
13107
13108 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
13109
13110         * expression.cs (PointerArithmetic): New class that is used to
13111         perform pointer arithmetic.
13112         (Binary.Resolve): Handle pointer arithmetic
13113         Handle pointer comparission.
13114         (ArrayPtr): Utility expression class that is used to take the
13115         address of an array.
13116
13117         (ElementAccess): Implement array access for pointers
13118
13119         * statement.cs (Fixed): Implement fixed statement for arrays, we
13120         are missing one more case before we are done.
13121
13122         * expression.cs (Indirection): Implement EmitAssign and set the
13123         ExprClass to Variable.  This allows pointer dereferences to be
13124         treated as variables, and to have values assigned to them.
13125
13126         * ecore.cs (Expression.StoreFromPtr): New utility function to
13127         store values dereferencing.
13128
13129 2002-02-20  Ravi Pratap  <ravi@ximian.com>
13130
13131         * expression.cs (Binary.ResolveOperator): Ensure that we are
13132         not trying to operate on a void type - this fixes the reported
13133         bug.
13134
13135         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
13136         the parent implementation is sealed.
13137
13138         * ../errors/cs0239.cs : Add.
13139
13140         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
13141
13142         * typemanager.cs (unverifiable_code_type): Corresponds to 
13143         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
13144         which have unsafe code in them.
13145
13146         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
13147         unsafe context.
13148
13149 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
13150
13151         * cs-tokenizer.cs: Add support for @"litreal strings"
13152
13153         Make tokenizer accept pre-processor directives
13154         on any column (remove the old C-like limitation). 
13155
13156         * rootcontext.cs (EmitCode): Emit any global attributes.
13157         (AddGlobalAttributes): Used to keep track of assembly attributes. 
13158
13159         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
13160
13161         * cs-parser.jay: Add support for global attributes.  
13162
13163 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
13164
13165         * expression.cs (Indirection): New helper class.  Unary will
13166         create Indirection classes to be able to implement the
13167         IMemoryLocation interface on it.
13168
13169 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
13170
13171         * cs-parser.jay (fixed_statement): reference the right statement.
13172
13173         * statement.cs (Fixed.Emit): Finish implementing the fixed
13174         statement for the &x case.
13175
13176 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
13177
13178         * class.cs (Property.Define, Method.Define): Remove newslot when
13179         `implementing'.  
13180
13181         * modifiers.cs: My use of NewSlot when `Abstract' was set was
13182         wrong.  NewSlot should only be used if the `new' keyword is present.
13183
13184         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
13185         locating our system dir.  Sorry about this.
13186
13187 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
13188
13189         * driver.cs (GetSystemDir): Compute correctly the location of our
13190         system assemblies.  I was using the compiler directory instead of
13191         the library directory.
13192
13193 2002-02-13  Ravi Pratap  <ravi@ximian.com>
13194
13195         * expression.cs (BetterFunction): Put back in what Miguel commented out
13196         since it is the correct fix. The problem is elsewhere ;-)
13197
13198         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
13199         parameters of the parms method are themselves compatible or not !
13200
13201         (StandardConversionExists): Fix very dangerous bug where we were forgetting
13202         to check that a class implements an interface before saying that an implicit
13203         conversion was allowed. Use ImplementsInterface to do the checking.
13204
13205 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
13206
13207         * class.cs (Method.Define): Track whether we are an explicit
13208         implementation or not.  And only call DefineMethodOverride if we
13209         are an explicit implementation.
13210
13211         (Property.DefineMethod): Ditto.
13212
13213 2002-02-11  Ravi Pratap  <ravi@ximian.com>
13214
13215         * expression.cs (BetterFunction): Catch hideous bug which was
13216          preventing us from detecting ambiguous calls due to implicit casts i.e
13217         cs0121.
13218
13219 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
13220
13221         * support.cs (Pair): Remove un-needed method.  I figured why I was
13222         getting the error in cs-parser.jay, the variable in a foreach loop
13223         is readonly, and the compiler does not really treat this as a variable.
13224
13225         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
13226         instead of EQUALS in grammar.  
13227
13228         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
13229
13230         * expression.cs (Unary.DoResolve): Check whether the argument is
13231         managed or not.
13232
13233 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
13234
13235         * support.cs: Api for Pair to set a value.  Despite the fact that
13236         the variables are public the MS C# compiler refuses to compile
13237         code that accesses the field if the variable is part of a foreach
13238         statement. 
13239
13240         * statement.cs (Fixed): Begin implementation of the fixed
13241         statement.
13242
13243         (Block.AddVariable): Return the VariableInfo on success and null
13244         on failure instead of true/false. 
13245
13246         * cs-parser.jay (foreach): Catch errors on variables already
13247         defined (we were ignoring this value before) and properly unwind
13248         the block hierarchy
13249
13250         (fixed_statement): grammar for the fixed statement.
13251
13252 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
13253
13254         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
13255         pointer types to be incretemented.
13256
13257         (SizeOf): Implement.
13258
13259         * cs-parser.jay (pointer_member_access): Implement
13260         expr->IDENTIFIER production.
13261
13262         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
13263         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
13264         on safe contexts.
13265
13266         (Unary): Implement indirection.
13267
13268         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
13269         use in non-unsafe context).
13270
13271         (SimpleName.DoResolve): Check for pointers in field access on safe
13272         contexts. 
13273
13274         (Expression.LoadFromPtr): Factor the load-indirect code in this
13275         function.  This was duplicated in UnboxCast and ParameterReference
13276
13277 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
13278
13279         * expression.cs (ComposedCast): report an error if a pointer cast
13280         is used in a safe region.
13281
13282         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
13283         pointer type casts in unsafe context.
13284
13285         * codegen.cs (EmitContext): Set up IsUnsafe.
13286
13287         * cs-parser.jay (non_expression_type): Add productions for pointer
13288         casts. 
13289
13290         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
13291         code.  We should not use force into static mode if the method is
13292         not virtual.  Fixes bug in MIS
13293
13294         * statement.cs (Do.Emit, While.Emit, For.Emit,
13295         Statement.EmitBoolExpression): Add support to Do and While to
13296         propagate infinite loop as `I do return' semantics.
13297
13298         Improve the For case to also test for boolean constants.
13299
13300         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
13301         to the list of attributes we can add.
13302
13303         Remove `EmitContext' argument.
13304
13305         * class.cs (Method.Define): Apply parameter attributes.
13306         (Constructor.Define): Apply parameter attributes.
13307         (MethodCore.LabelParameters): Move here the core of labeling
13308         parameters. 
13309
13310         * support.cs (ReflectionParameters.ParameterModifier,
13311         InternalParameters.ParameterModifier): Use IsByRef on the type and
13312         only return the OUT bit for these parameters instead of in/out/ref
13313         flags.
13314
13315         This is because I miss-understood things.  The ParameterInfo.IsIn
13316         and IsOut represent whether the parameter has the [In] and [Out]
13317         attributes set.  
13318
13319 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
13320
13321         * ecore.cs (FieldExpr.Emit): Release temporaries.
13322
13323         * assign.cs (LocalTemporary.Release): new function.
13324
13325         * codegen.cs (EmitContext.GetTemporaryStorage,
13326         EmitContext.FreeTemporaryStorage): Rework the way we deal with
13327         temporary storage.  Now we can "put back" localbuilders when we
13328         are done with them
13329
13330 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
13331
13332         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
13333         need to make a copy of the variable to generate verifiable code.
13334
13335 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
13336
13337         * driver.cs: Compute dynamically the system directory.
13338
13339         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
13340         Slower, but more generally useful.  Used by the abstract
13341         registering implementation. 
13342
13343         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
13344         the rules for the special rule on Type/instances.  First check if
13345         we have the same name, and if so, try that special static path
13346         rather than the instance path.
13347
13348 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
13349
13350         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
13351         for, while and if.
13352
13353         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
13354         Enum, ValueType, Delegate or Array for non-corlib compiles.
13355
13356         * cs-tokenizer.cs: Catch long identifiers (645)
13357
13358         * typemanager.cs (IndexerPropetyName): Ravi never tested this
13359         piece of code.
13360
13361         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
13362         fix, we were returning too early, so we were not registering
13363         pending methods from abstract classes.
13364
13365         Do not register pending methods if the class is abstract.
13366
13367         * expression.cs (Conditional.DoResolve): Report circular implicit
13368         conversions when we neecd to compute it for conditional
13369         expressions. 
13370
13371         (Is.DoResolve): If the expression is always of the provided type,
13372         flag warning 183.  If the expression can not ever be of the
13373         provided type flag warning 184.
13374
13375         * class.cs: Catch 169 as well.
13376
13377         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
13378         read. 
13379
13380 2002-01-18  Nick Drochak  <ndrochak@gol.com>
13381
13382         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
13383
13384 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
13385
13386         * interface.cs: (PopulateMethod): Check for pointers being defined
13387         only if the unsafe context is active.
13388         (PopulateProperty): ditto.
13389         (PopulateIndexer): ditto.
13390
13391         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
13392         specified.  If pointers are present, make sure that they are
13393         present in an unsafe context.
13394         (Constructor, Constructor.Define): ditto.
13395         (Field, Field.Define): ditto.
13396         (Property, Property.Define): ditto.
13397         (Event, Event.Define): ditto.
13398
13399         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
13400         hashtable if there are classes or structs defined.
13401
13402         * expression.cs (LocalVariableReference.DoResolve): Simplify this
13403         code, as the constant resolution moved.
13404
13405         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
13406         the metadata, so we can flag error 133. 
13407
13408         * decl.cs (MemberCore.UnsafeOK): New function to test that a
13409         pointer is being declared in an unsafe context.
13410
13411 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
13412
13413         * modifiers.cs (Modifiers.Check): Require a Location argument.
13414         Report error 227 for Unsafe use.
13415
13416         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
13417
13418         * statement.cs (For.Emit): If the test is null, then report that
13419         we do `return', as we wont reach anything afterwards.
13420
13421         (Switch.SwitchGoverningType): Track the expression that matched
13422         the conversion.
13423
13424         * driver.cs: Allow negative numbers as an error code to flag.
13425
13426         * cs-parser.jay: Handle 1551.
13427
13428         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
13429
13430 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13431
13432         * cs-parser.jay: Report 1518 (type declaration can only contain
13433         class, struct, interface, enum or delegate)
13434
13435         (switch_label): Report 1523 (keywords `case' or `default' must
13436         preced code)
13437
13438         (opt_switch_sections): Report 1522 (empty switch)
13439
13440         * driver.cs: Report 1515 (response file specified multiple times)
13441         Report 1516 (Source file specified multiple times).
13442
13443         * expression.cs (Argument.Resolve): Signal 1510
13444
13445         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
13446         access not allowed in static code)
13447
13448 2002-01-11  Ravi Pratap  <ravi@ximian.com>
13449
13450         * typemanager.cs (IsPointerType): Utility method which we are going
13451         to need a lot.
13452
13453         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
13454         the object type, so we take care of that.
13455
13456         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
13457
13458         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
13459         added to non-params parameters :-)
13460
13461         * typemanager.cs (CSharpName): Include 'void' type too. 
13462
13463         (void_ptr_type): Include in the set of core types.
13464
13465         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
13466         duplicating code.
13467
13468         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
13469         an unsafe context.
13470
13471         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
13472         completely forgotten about it.
13473
13474 2002-01-10  Ravi Pratap  <ravi@ximian.com>
13475
13476         * cs-parser.jay (pointer_type): Add. This begins our implementation
13477         of parsing rules for unsafe code.
13478
13479         (unsafe_statement): Implement.
13480
13481         (embedded_statement): Modify to include the above.
13482
13483         * statement.cs (Unsafe): Implement new class for unsafe blocks.
13484
13485         * codegen.cs (EmitContext.InUnsafe): Add. This determines
13486         if the current context is an unsafe one.
13487
13488         * cs-parser.jay (local_variable_pointer_type): Since local variable types
13489         are handled differently, we need separate rules for them.
13490
13491         (local_variable_declaration): Update to use local_variable_pointer_type
13492         to allow variable declarations of unmanaged pointer types.
13493
13494         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
13495         in unsafe contexts.
13496
13497         * ../errors/cs0214.cs : Add.
13498
13499 2002-01-16  Nick Drochak  <ndrochak@gol.com>
13500
13501         * makefile: remove 'response' file when cleaning.
13502
13503 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13504
13505         * cs-parser.jay: Report 1524.
13506
13507 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
13508
13509         * typemanager.cs (RegisterMethod): drop checking if we have
13510         registered this from here
13511
13512 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
13513
13514         * class.cs (Method.EmitDestructor): Implement calling our base
13515         destructor. 
13516
13517         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
13518         value of InFinally.
13519
13520         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
13521         this routine and will wrap the call in a try/catch block.  Deal
13522         with the case.
13523
13524 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
13525
13526         * ecore.cs (Expression.MemberLookup): instead of taking a
13527         parameter `same_type' that was used to tell whether we could
13528         access private members we compute our containing type from the
13529         EmitContext.
13530
13531         (FieldExpr): Added partial support for volatile fields.  This does
13532         not work for volatile fields exposed from assemblies, as I can not
13533         figure out how to extract the modreq from it.
13534
13535         Updated all the source files to use this.
13536
13537         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
13538         because it is referenced by MemberLookup very often. 
13539
13540 2002-01-09  Ravi Pratap  <ravi@ximian.com>
13541
13542         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
13543         TypeBuilder.GetCustomAttributes to retrieve what we need.
13544
13545         Get rid of redundant default_member_attr_type as this is the same as
13546         default_member_type which already exists.
13547
13548         * interface.cs, attribute.cs : Update accordingly.
13549
13550 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
13551
13552         * typemanager.cs: Enable IndexerPropertyName again.  It does not
13553         work for TYpeBuilders though.  Ravi, can you please fix this?
13554
13555         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
13556
13557         * expression.cs (Argument.Emit): Handle the case of ref objects
13558         being passed to ref functions;  
13559
13560         (ParameterReference.EmitLoad): Loads the content of the pointer
13561         without dereferencing.
13562
13563 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13564
13565         * cs-tokenizer.cs: Implemented the pre-processing expressions.
13566
13567 2002-01-08  Ravi Pratap  <ravi@ximian.com>
13568
13569         * class.cs (Indexer.DefineMethod): Incorporate the interface
13570         type in the name of the method if we are doing explicit interface
13571         implementation.
13572
13573         * expression.cs (ConversionExists): Remove as it is completely obsolete.
13574
13575         (BetterConversion): Fix extremely trivial bug where we were referring to
13576         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
13577         again !
13578
13579         * ../errors/bug16.cs : Add although we have fixed it.
13580
13581 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13582
13583         * expression.cs (BaseIndexer): Begin implementation.
13584
13585         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
13586
13587         * cs-parser.jay (indexer_declarator): Use qualified_identifier
13588         production directly to remove a shift/reduce, and implement
13589         explicit interface implementation.
13590
13591         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
13592         after a floating point suffix.
13593
13594         * expression.cs (DoNumericPromotions): Improved the conversion for
13595         uint/uint.  If we have a constant, we avoid doing a typecast to a
13596         larger type.
13597
13598         * class.cs (Indexer): Implement explicit interface implementation
13599         for indexers.
13600
13601 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13602
13603         * class.cs: make the default instance constructor public and hidebysig.
13604
13605 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13606
13607         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13608         so we can call it from elsewhere.
13609
13610         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13611         we emit it internally if the class has a defined indexer; otherwise the user
13612         emits it by decorating the class definition with the DefaultMemberAttribute.
13613
13614         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13615         attribute is not used on a type which defines an indexer.
13616
13617         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13618         character when we skip whitespace.
13619
13620         * ../errors/cs0646.cs : Add.
13621
13622 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13623
13624         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13625         again. 
13626
13627         * makefile: Add practical target `mcs3.exe' which builds the third
13628         generation compiler. 
13629
13630         * expression.cs (New): Fix structures constructor calling.
13631
13632         * class.cs (Property, Method, Indexer): Emit Final flag on the
13633         method if we are an interface implementation and we are not
13634         abstract. 
13635
13636         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13637         whether this property is referencing a `base' method.
13638
13639         * expression.cs (Invocation.EmitCall): take an extra argument:
13640         is_base, this is used to determine whether the `call' or
13641         `callvirt' opcode should be used.
13642
13643
13644         * delegate.cs: update EmitCall.
13645
13646         * class.cs (Method.Define): Set NewSlot for the cases where we are
13647         not implementing an interface method.
13648
13649         (Property.Define): ditto.
13650
13651 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13652
13653         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13654         'r'.  Allows mcs to parse itself fully.
13655
13656 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13657
13658         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13659         of the number of initializers that require the InitializeArray method.
13660
13661         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13662         update the above field where necessary.
13663
13664         (MakeByteBlob): Update accordingly.
13665
13666         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13667         greater than 2.
13668
13669         (EmitDynamicInitializers): Update in accordance with the new optimization.
13670
13671         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13672         same OpCode applies.
13673
13674         * cs-parser.jay : Fix some glaring errors I introduced.
13675
13676 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13677
13678         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13679         so that we can check for name clashes there too.
13680
13681         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13682         for interface indexers.
13683
13684         * interfaces.cs (Define): Emit the default member attribute.
13685
13686         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13687         variable was being referred to while setting the value ;-)
13688
13689 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13690
13691         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13692         byte-by-byte information when we know the data is zero.
13693
13694         Make the block always a multiple of 4, because
13695         DefineInitializedData has a bug.
13696
13697         * assign.cs: Fix, we should assign from the temporary, not from
13698         the source. 
13699
13700         * expression.cs (MakeByteBlob): Fix my incorrect code.
13701
13702 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13703
13704         * typemanager.cs (EnumToUnderlying): This function is used to get
13705         the underlying type from an enumeration, because it does not
13706         always work. 
13707
13708         * constant.cs: Use the I4_S form for values between -128 and 127.
13709
13710         * statement.cs (Block.LookupLabel): Looks up a label.
13711         (Block): Drop support for labeled blocks.
13712
13713         (LabeledStatement): New kind of statement that represents a label
13714         only.
13715
13716         (Goto): Finally implement this bad boy.
13717
13718         * cs-parser.jay: Update to reflect new mechanism to implement
13719         labels.
13720
13721 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13722
13723         * codegen.cs (EmitContext.This): a codegen property that keeps the
13724         a single instance of this instead of creating many different this
13725         instances. 
13726
13727         * delegate.cs (Delegate.DoResolve): Update to use the property;
13728
13729         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13730
13731         * expression.cs (BaseAccess.DoResolve): Ditto.
13732
13733 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13734
13735         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13736         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13737
13738         (InitCoreTypes): Update accordingly.
13739
13740         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13741         so we can quickly store the state.
13742
13743         (ApplyAttributes): Set the correct implementation flags
13744         for InternalCall methods.
13745
13746 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13747
13748         * expression.cs (EmitCall): if a method is not virtual, then do
13749         not use callvirt on it.
13750
13751         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13752         user defined stuff) requires the use of stobj, which takes an
13753         address on the stack instead of an array and an index.  So emit
13754         the Ldelema operation for it.
13755
13756         (EmitStoreOpcode): Use stobj for valuetypes.
13757
13758         (UnaryMutator.EmitCode): Use the right 1 value depending on
13759         whether we are dealing with int64/uint64, float or doubles.
13760
13761         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13762         constructors that I implemented last night.
13763
13764         (Constructor.IsDefault): Fix to work properly for static
13765         constructors.
13766
13767         * cs-parser.jay (CheckDef): report method signature errors.
13768         Update error number 103 to be 132.
13769
13770         * decl.cs: New AdditionResult enumeration value: MethodExists.
13771         Although we do this check for methods later on in the semantic
13772         analysis, catching repeated default constructors is so easy that
13773         we catch these here. 
13774
13775         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13776         promotions code.
13777
13778         (ParameterReference.EmitAssign, Emit): handle
13779         bools as bytes.
13780
13781         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13782         (ArrayAccess.EmitStoreOpcode): ditto.
13783
13784         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13785
13786         * expression.cs (MakeByteBlob): Complete all the missing types
13787         (uint, short, ushort, byte, sbyte)
13788
13789         * class.cs: Only init instance field initializers on instance
13790         constructors. 
13791
13792         Rename `constructors' to instance_constructors. 
13793
13794         (TypeContainer.AddConstructor): Only add constructors to the list
13795         if it is not static.
13796
13797         Make sure that we handle default_static_constructor independently
13798         everywhere where we handle instance_constructors
13799
13800 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13801
13802         * class.cs: Do not lookup or create a base initializer for a
13803         static constructor.
13804
13805         (ConstructorInitializer.Resolve): use the proper type to lookup
13806         for constructors.
13807
13808         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13809
13810         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13811         in DeclSpace. 
13812
13813         * decl.cs: CloseType is now an virtual method, the default
13814         implementation just closes this type.
13815
13816 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13817
13818         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13819         to PreserveSig by default. Also emit HideBySig on such methods.
13820
13821         Basically, set the defaults to standard values.
13822
13823         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13824         argument, if candidate is better, it can't be worse than the best !
13825
13826         (Invocation): Re-write bits to differentiate between methods being
13827         applicable in their expanded form and their normal form - for params
13828         methods of course.
13829
13830         Get rid of use_standard everywhere as only standard conversions are allowed
13831         in overload resolution. 
13832
13833         More spec conformance.
13834
13835 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13836
13837         * driver.cs: Add --timestamp, to see where the compiler spends
13838         most of its time.
13839
13840         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
13841         `this' in static code.
13842
13843         (SimpleName.DoResolve): Implement in terms of a helper function
13844         that allows static-references to be passed upstream to
13845         MemberAccess.
13846
13847         (Expression.ResolveWithSimpleName): Resolve specially simple
13848         names when called by MemberAccess to implement the special
13849         semantics. 
13850
13851         (Expression.ImplicitReferenceConversion): Handle conversions from
13852         Null to reference types before others, as Null's type is
13853         System.Object. 
13854
13855         * expression.cs (Invocation.EmitCall): Handle the special case of
13856         calling methods declared on a reference type from a ValueType
13857         (Base classes System.Object and System.Enum)
13858
13859         (MemberAccess.Resolve): Only perform lookups on Enumerations if
13860         the left hand side is a TypeExpr, not on every enumeration. 
13861
13862         (Binary.Resolve): If types are reference types, then do a cast to
13863         object on operators != and == of both arguments.
13864
13865         * typemanager.cs (FindMembers): Extract instance and static
13866         members if requested.
13867
13868         * interface.cs (PopulateProperty): Use void_type instead of null
13869         as the return type for the setter method.
13870
13871         (PopulateIndexer): ditto.
13872
13873 2001-12-27  Ravi Pratap  <ravi@ximian.com>
13874
13875         * support.cs (ReflectionParameters): Fix minor bug where we
13876         were examining the wrong parameter for the ParamArray attribute.
13877
13878         Cope with requests for the type of the parameter at position
13879         greater than the params parameter's. We now return the element
13880         type of the params array as that makes more sense.
13881
13882         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
13883         accordingly as we no longer have to extract the element type
13884         ourselves.
13885
13886         (Invocation.OverloadResolve): Update.
13887
13888 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13889
13890         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
13891         against IEnumerator, test whether the return value is a descendant
13892         of the IEnumerator interface.
13893
13894         * class.cs (Indexer.Define): Use an auxiliary method to implement
13895         the other bits of the method definition.  Begin support for
13896         explicit interface implementation.
13897
13898         (Property.DefineMethod): Use TypeManager.void_type instead of null
13899         for an empty return value.
13900
13901 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
13902
13903         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
13904         dealing with a FieldExpr which is composed of a FieldBuilder, in
13905         the code path we did extract the constant, but we should have
13906         obtained the underlying value to be able to cast it (otherwise we
13907         end up in an infinite loop, this is what Ravi was running into).
13908
13909         (ArrayCreation.UpdateIndices): Arrays might be empty.
13910
13911         (MemberAccess.ResolveMemberAccess): Add support for section
13912         14.5.4.1 that deals with the special case of E.I when E is a type
13913         and something else, that I can be a reference to a static member.
13914
13915         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
13916         handle a particular array type to create byte blobs, it is just
13917         something we dont generate byteblobs for.
13918
13919         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
13920         arguments. 
13921
13922         * location.cs (Push): remove the key from the hashtable that we
13923         are about to add.   This happens for empty files.
13924
13925         * driver.cs: Dispose files after we have parsed them.
13926
13927         (tokenize): new function that only runs the tokenizer on its
13928         input, for speed testing.
13929
13930 2001-12-26  Ravi Pratap  <ravi@ximian.com>
13931
13932         * class.cs (Event.Define): Define the private field only if there
13933         are no accessors defined.
13934
13935         * expression.cs (ResolveMemberAccess): If there is no associated
13936         field with the event, that means we have an event defined with its
13937         own accessors and we should flag error cs0070 since transforming
13938         ourselves into a field is not valid in that case.
13939
13940         * ecore.cs (SimpleName.DoResolve): Same as above.
13941
13942         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
13943         and charset to sane values.
13944
13945 2001-12-25  Ravi Pratap  <ravi@ximian.com>
13946
13947         * assign.cs (DoResolve): Perform check on events only if they 
13948         are being accessed outside the declaring type.
13949
13950         * cs-parser.jay (event_declarations): Update rules to correctly
13951         set the type of the implicit parameter etc.
13952
13953         (add_accessor, remove_accessor): Set current local parameters.
13954
13955         * expression.cs (Binary): For delegate addition and subtraction,
13956         cast the return value from the method into the appropriate delegate
13957         type.
13958
13959 2001-12-24  Ravi Pratap  <ravi@ximian.com>
13960
13961         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
13962         of these as the workaround is unnecessary.
13963
13964         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
13965         delegate data - none of that is needed at all.
13966
13967         Re-write bits to extract the instance expression and the delegate method
13968         correctly.
13969
13970         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
13971         on delegates too.
13972
13973         * attribute.cs (ApplyAttributes): New method to take care of common tasks
13974         of attaching attributes instead of duplicating code everywhere.
13975
13976         * everywhere : Update code to do attribute emission using the above method.
13977
13978 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13979
13980         * expression.cs (IsParamsMethodApplicable): if there are not
13981         parameters, return immediately.
13982
13983         * ecore.cs: The 0 literal can be implicity converted to an enum
13984         type. 
13985
13986         (SimpleName.DoResolve): First lookup the type, then lookup the
13987         members. 
13988
13989         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13990         want to get its address.  If the InstanceExpression is not
13991         addressable, store the result in a temporary variable, then get
13992         the address of it.
13993
13994         * codegen.cs: Only display 219 errors on warning level or above. 
13995
13996         * expression.cs (ArrayAccess): Make it implement the
13997         IMemoryLocation interface.
13998
13999         (Binary.DoResolve): handle the operator == (object a, object b)
14000         and operator != (object a, object b) without incurring into a
14001         BoxedCast (because 5 != o should never be performed).
14002
14003         Handle binary enumerator operators.
14004
14005         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
14006         value type, otherwise use Ldelem_ref.
14007
14008         Use precomputed names;
14009
14010         (AddressOf): Implement address of
14011
14012         * cs-parser.jay (labeled_statement): Fix recursive block
14013         addition by reworking the production.
14014
14015         * expression.cs (New.DoEmit): New has a special case:
14016                 
14017                  If we are dealing with a ValueType, we have a few
14018                  situations to deal with:
14019                 
14020                     * The target of New is a ValueType variable, that is
14021                       easy, we just pass this as the variable reference
14022                 
14023                     * The target of New is being passed as an argument,
14024                       to a boxing operation or a function that takes a
14025                       ValueType.
14026                 
14027                       In this case, we need to create a temporary variable
14028                       that is the argument of New.
14029
14030
14031 2001-12-23  Ravi Pratap  <ravi@ximian.com>
14032
14033         * rootcontext.cs (LookupType): Check that current_type is not null before
14034         going about looking at nested types.
14035
14036         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
14037         not implement the IAssignMethod interface any more.
14038
14039         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
14040         where we tranform them into FieldExprs if they are being resolved from within
14041         the declaring type.
14042
14043         * ecore.cs (SimpleName.DoResolve): Do the same here.
14044
14045         * assign.cs (DoResolve, Emit): Clean up code considerably. 
14046
14047         * ../errors/bug10.cs : Add.
14048
14049         * ../errors/cs0070.cs : Add.
14050
14051         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
14052
14053         * assign.cs : Get rid of EventIsLocal everywhere.
14054
14055 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
14056
14057         * ecore.cs (ConvertIntLiteral): finished the implementation.
14058
14059         * statement.cs (SwitchLabel): Convert the value we are using as a
14060         key before looking up the table.
14061
14062 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
14063
14064         * codegen.cs (EmitTopBlock): Require a Location argument now.
14065
14066         * cs-parser.jay (constructor_declarator): We need to setup
14067         current_local_parameters before we parse the
14068         opt_constructor_initializer, to allow the variables to be bound
14069         to the constructor arguments.
14070
14071         * rootcontext.cs (LookupType): First lookup nested classes in our
14072         class and our parents before we go looking outside our class.
14073
14074         * expression.cs (ConstantFold): Extract/debox the values at the
14075         beginnning. 
14076
14077         * rootcontext.cs (EmitCode): Resolve the constants first before we
14078         resolve the types.  This is not really needed, but it helps debugging.
14079
14080         * statement.cs: report location.
14081
14082         * cs-parser.jay: pass location to throw statement.
14083
14084         * driver.cs: Small bug fix.
14085
14086         * report.cs: Updated format to be 4-zero filled digits.
14087
14088 2001-12-22  Ravi Pratap  <ravi@ximian.com>
14089
14090         * expression.cs (CheckIndices): Fix minor bug where the wrong
14091         variable was being referred to ;-)
14092
14093         (DoEmit): Do not call EmitStaticInitializers when the 
14094         underlying type is System.Object.
14095
14096 2001-12-21  Ravi Pratap  <ravi@ximian.com>
14097
14098         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
14099         and do the usual workaround for SRE.
14100
14101         * class.cs (MyEventBuilder.EventType): New member to get at the type
14102         of the event, quickly.
14103
14104         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
14105
14106         * assign.cs (Assign.DoResolve): Handle the case when the target
14107         is an EventExpr and perform the necessary checks.
14108
14109         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
14110         interface.
14111
14112         (SimpleName.MemberStaticCheck): Include check for EventExpr.
14113
14114         (EventExpr): Set the type in the constructor itself since we 
14115         are meant to be born fully resolved.
14116
14117         (EventExpr.Define): Revert code I wrote earlier.
14118                 
14119         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
14120         instance expression is null. The instance expression is a This in that case
14121         or a null, depending on whether it is a static method or not.
14122
14123         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
14124         refers to more than one method.
14125
14126         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
14127         and accordingly flag errors.
14128
14129 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
14130
14131         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
14132
14133 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
14134
14135         * location.cs (ToString): Provide useful rutine.
14136
14137 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
14138
14139         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
14140         objects, return the actual integral boxed.
14141
14142         * statement.cs (SwitchLabel): define an ILLabel for each
14143         SwitchLabel. 
14144
14145         (Switch.CheckSwitch): If the value is a Literal, extract
14146         the underlying literal.
14147
14148         Also in the unused hashtable we had, add the SwitchLabel so we can
14149         quickly look this value up.
14150
14151         * constant.cs: Implement a bunch of new constants.  Rewrite
14152         Literal based on this.  Made changes everywhere to adapt to this.
14153
14154         * expression.cs (Expression.MakeByteBlob): Optimize routine by
14155         dereferencing array only once, and also copes with enumrations.
14156
14157         bytes are two bytes wide, not one.
14158
14159         (Cast): Perform constant conversions.
14160
14161         * ecore.cs (TryImplicitIntConversion): Return literals instead of
14162         wrappers to the literals here.
14163
14164         * expression.cs (DoNumericPromotions): long literals can converted
14165         to ulong implicity (this is taken care of elsewhere, but I was
14166         missing this spot).
14167
14168         * ecore.cs (Expression.Literalize): Make the return type Literal,
14169         to improve type checking.
14170
14171         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
14172
14173 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
14174
14175         * literal.cs: Revert code from ravi that checked the bounds.  The
14176         bounds are sane by the definition of the type itself. 
14177
14178         * typemanager.cs: Fix implementation of ImplementsInterface.  We
14179         need to actually look up in our parent hierarchy for interfaces
14180         implemented. 
14181
14182         * const.cs: Use the underlying type for enumerations
14183
14184         * delegate.cs: Compute the basename for the delegate creation,
14185         that should fix the delegate test case, and restore the correct
14186         Type Lookup semantics in rootcontext
14187
14188         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
14189         referencing a nested type with the Reflection API is using the "+"
14190         sign. 
14191
14192         * cs-parser.jay: Do not require EOF token at the end.
14193
14194 2001-12-20  Ravi Pratap  <ravi@ximian.com>
14195
14196         * rootcontext.cs (LookupType): Concatenate type names with
14197         a '.' instead of a '+' The test suite passes again.
14198
14199         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
14200         field of the enumeration.
14201
14202         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
14203         the case when the member is an EventExpr.
14204
14205         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
14206         static has an associated instance expression.
14207
14208         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
14209
14210         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
14211
14212         * class.cs (Event.Define): Register event and perform appropriate checks
14213         for error #111.
14214
14215         We define the Add and Remove methods even if the use provides none because
14216         in that case, we provide default implementations ourselves.
14217
14218         Define a private field of the type of the event. This is done by the CSC compiler
14219         and we should be doing it too ;-)
14220
14221         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
14222         More methods we use in code we generate.
14223
14224         (multicast_delegate_type, delegate_type): Two separate types since the distinction
14225         is important.
14226
14227         (InitCoreTypes): Update accordingly for the above.
14228
14229         * class.cs (Event.Emit): Generate code for default accessors that we provide
14230
14231         (EmitDefaultMethod): Do the job in the above.
14232
14233         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
14234         appropriate place.
14235
14236 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
14237
14238         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
14239         builders even if we were missing one.
14240
14241         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
14242         pass the Basename as our class name instead of the Name.  The
14243         basename will be correctly composed for us.
14244
14245         * parameter.cs (Paramters): Now takes a Location argument.
14246
14247         * decl.cs (DeclSpace.LookupType): Removed convenience function and
14248         make all the code call directly LookupType in RootContext and take
14249         this chance to pass the Location information everywhere.
14250
14251         * Everywhere: pass Location information.
14252
14253 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
14254
14255         * class.cs (Constructor.Define): Updated way of detecting the
14256         length of the parameters.
14257
14258         (TypeContainer.DefineType): Use basename as the type name for
14259         nested types.
14260
14261         (TypeContainer.Define): Do not recursively define types here, as
14262         definition is taken care in order by the RootContext.
14263
14264         * tree.cs: Keep track of namespaces in a per-file basis.
14265
14266         * parameter.cs (Parameter.ComputeSignature): Update to use
14267         DeclSpace. 
14268
14269         (Parameters.GetSignature): ditto.
14270
14271         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
14272         instead of a TypeContainer.
14273
14274         (Interface.SemanticAnalysis): Use `this' instead of our parent to
14275         resolve names.  Because we need to be resolve in our context, not
14276         our parents.
14277
14278         * driver.cs: Implement response files.
14279
14280         * class.cs (TypeContainer.DefineType): If we are defined, do not
14281         redefine ourselves.
14282
14283         (Event.Emit): Emit the code for add/remove handlers.
14284         (Event.Define): Save the MethodBuilders for add/remove.
14285
14286         * typemanager.cs: Use pair here too.
14287
14288         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
14289         DictionaryEntry requires the first argument to be non-null.  
14290
14291         (enum_declaration): Compute full name for registering the
14292         enumeration.
14293
14294         (delegate_declaration): Instead of using
14295         formal_parameter_list, use opt_formal_parameter_list as the list
14296         can be empty.
14297
14298         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
14299         (EventParsing): New property that controls whether `add' and
14300         `remove' are returned as tokens or identifiers (for events);
14301
14302 2001-12-19  Ravi Pratap  <ravi@ximian.com>
14303
14304         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
14305         use MyEventBuilder only and let it wrap the real builder for us.
14306
14307         (MyEventBuilder): Revamp constructor etc.
14308
14309         Implement all operations that we perform on EventBuilder in precisely the same
14310         way here too.
14311
14312         (FindMembers): Update to use the EventBuilder member.
14313
14314         (Event.Emit): Update accordingly.
14315
14316 2001-12-18  Ravi Pratap  <ravi@ximian.com>
14317
14318         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
14319         by calling the appropriate methods.
14320
14321         (GetCustomAttributes): Make stubs as they cannot possibly do anything
14322         useful.
14323
14324         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
14325
14326 2001-12-17  Ravi Pratap  <ravi@ximian.com>
14327
14328         * delegate.cs (Delegate.Populate): Check that the return type
14329         and various parameters types are indeed accessible.
14330
14331         * class.cs (Constructor.Define): Same here.
14332
14333         (Field.Define): Ditto.
14334
14335         (Event.Define): Ditto.
14336
14337         (Operator.Define): Check that the underlying Method defined itself
14338         correctly - so it's MethodBuilder should not be null.
14339
14340         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
14341         expression happens to be null.
14342
14343         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
14344         members but as of now we don't seem to be able to do anything really useful with it.
14345
14346         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
14347         not the EventBuilder.
14348
14349 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
14350
14351         * cs-tokenizer.cs: Add support for defines.
14352         Add support for #if, #elif, #else, #endif
14353
14354         (eval_var): evaluates a variable.
14355         (eval): stubbed for evaluating functions.
14356
14357         * cs-parser.jay: Pass the defines information
14358
14359         * driver.cs: Add --define command line option.
14360
14361         * decl.cs: Move MemberCore here.
14362
14363         Make it the base class for DeclSpace.  This allows us to catch and
14364         report 108 and 109 for everything now.
14365
14366         * class.cs (TypeContainer.Define): Extract all the members
14367         before populating and emit the warning 108 (new keyword required
14368         to override) instead of having each member implement this.
14369
14370         (MemberCore.Define): New abstract method, we will be using this in
14371         the warning reporting engine in Populate.
14372
14373         (Operator.Define): Adjust to new MemberCore protocol. 
14374
14375         * const.cs (Const): This does not derive from Expression, it is a
14376         temporary object we use to create fields, it is a MemberCore. 
14377
14378         * class.cs (Method.Define): Allow the entry point to be in a
14379         specific class.
14380
14381         * driver.cs: Rewrite the argument handler to clean it up a bit.
14382
14383         * rootcontext.cs: Made it just an auxiliary namespace feature by
14384         making everything static.
14385
14386         * driver.cs: Adapt code to use RootContext type name instead of
14387         instance variable.
14388
14389         * delegate.cs: Remove RootContext argument.
14390
14391         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
14392         argument. 
14393
14394         * class.cs (Event.Define): The lookup can fail.
14395
14396         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
14397
14398         * expression.cs: Resolve the this instance before invoking the code.
14399
14400 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
14401
14402         * cs-parser.jay: Add a production in element_access that allows
14403         the thing to become a "type" reference.  This way we can parse
14404         things like "(string [])" as a type.
14405
14406         Note that this still does not handle the more complex rules of
14407         casts. 
14408
14409
14410         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
14411
14412         * ecore.cs: (CopyNewMethods): new utility function used to
14413         assemble the list of methods from running FindMembers.
14414
14415         (MemberLookup): Rework FindMembers so that 
14416
14417 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
14418
14419         * class.cs (TypeContainer): Remove Delegates who fail to be
14420         defined.
14421
14422         * delegate.cs (Populate): Verify that we dont get null return
14423         values.   TODO: Check for AsAccessible.
14424
14425         * cs-parser.jay: Use basename to emit error 574 (destructor should
14426         have the same name as container class), not the full name.
14427
14428         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
14429         possible representation.  
14430
14431         Also implements integer type suffixes U and L.
14432
14433 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
14434
14435         * expression.cs (ArrayCreation.DoResolve): We need to do the
14436         argument resolution *always*.
14437
14438         * decl.cs: Make this hold the namespace.  Hold the root context as
14439         well.
14440         (LookupType): Move here.
14441
14442         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
14443
14444         * location.cs (Row, Name): Fixed the code, it was always returning
14445         references to the first file.
14446
14447         * interface.cs: Register properties defined through interfaces.
14448
14449         * driver.cs: Add support for globbing on the command line
14450
14451         * class.cs (Field): Make it derive from MemberCore as well.
14452         (Event): ditto.
14453
14454 2001-12-15  Ravi Pratap  <ravi@ximian.com>
14455
14456         * class.cs (Event::Define): Check that the type of the event is a delegate
14457         type else flag error #66.
14458
14459         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
14460         same.
14461
14462         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
14463         values of EntryPoint, CharSet etc etc.
14464
14465         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
14466
14467         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
14468         be null and we should ignore this. I am not sure if this is really clean. Apparently,
14469         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
14470         which needs this to do its work.
14471
14472         * ../errors/cs0066.cs : Add.
14473
14474 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
14475
14476         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
14477         helper functions.
14478
14479         * class.cs: (MethodSignature.MethodSignature): Removed hack that
14480         clears out the parameters field.
14481         (MemberSignatureCompare): Cleanup
14482
14483         (MemberCore): New base class used to share code between MethodCore
14484         and Property.
14485
14486         (RegisterRequiredImplementations) BindingFlags.Public requires
14487         either BindingFlags.Instace or Static.  Use instance here.
14488
14489         (Property): Refactored code to cope better with the full spec.
14490
14491         * parameter.cs (GetParameterInfo): Return an empty array instead
14492         of null on error.
14493
14494         * class.cs (Property): Abstract or extern properties have no bodies.
14495
14496         * parameter.cs (GetParameterInfo): return a zero-sized array.
14497
14498         * class.cs (TypeContainer.MethodModifiersValid): Move all the
14499         method modifier validation to the typecontainer so we can reuse
14500         this on properties.
14501
14502         (MethodCore.ParameterTypes): return an empty sized array of types.
14503
14504         (Property.Define): Test property modifier validity.
14505
14506         Add tests for sealed/override too.
14507
14508         (Method.Emit): abstract or extern methods have no bodies.
14509
14510 2001-12-14  Ravi Pratap  <ravi@ximian.com>
14511
14512         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
14513         thing.
14514
14515         (Method::Define, ::Emit): Modify accordingly.
14516
14517         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
14518
14519         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
14520
14521         * makefile: Pass in /unsafe.
14522
14523 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
14524
14525         * class.cs (MakeKey): Kill routine.
14526
14527         * class.cs (TypeContainer.Define): Correctly define explicit
14528         method implementations (they require the full interface name plus
14529         the method name).
14530
14531         * typemanager.cs: Deply the PtrHashtable here and stop using the
14532         lame keys.  Things work so much better.
14533
14534         This of course broke everyone who depended on `RegisterMethod' to
14535         do the `test for existance' test.  This has to be done elsewhere.
14536
14537         * support.cs (PtrHashtable): A hashtable that avoid comparing with
14538         the object stupid Equals method (because, that like fails all over
14539         the place).  We still do not use it.
14540
14541         * class.cs (TypeContainer.SetRequiredInterface,
14542         TypeContainer.RequireMethods): Killed these two routines and moved
14543         all the functionality to RegisterRequiredImplementations.
14544
14545         (TypeContainer.RegisterRequiredImplementations): This routine now
14546         registers all the implementations required in an array for the
14547         interfaces and abstract methods.  We use an array of structures
14548         which can be computed ahead of time to reduce memory usage and we
14549         also assume that lookups are cheap as most classes will not
14550         implement too many interfaces.
14551
14552         We also avoid creating too many MethodSignatures.
14553
14554         (TypeContainer.IsInterfaceMethod): Update and optionally does not
14555         clear the "pending" bit if we find that there are problems with
14556         the declaration.
14557
14558         (TypeContainer.VerifyPendingMethods): Update to report errors of
14559         methods that look like implementations but are not.
14560
14561         (TypeContainer.Define): Add support for explicit interface method
14562         implementation. 
14563
14564 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
14565
14566         * typemanager.cs: Keep track of the parameters here instead of
14567         being a feature of the TypeContainer.
14568
14569         * class.cs: Drop the registration of parameters here, as
14570         InterfaceMethods are also interface declarations.
14571
14572         * delegate.cs: Register methods with the TypeManager not only with
14573         the TypeContainer.  This code was buggy.
14574
14575         * interface.cs: Full registation here.
14576
14577 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
14578
14579         * expression.cs: Remove reducer for binary expressions, it can not
14580         be done this way.
14581
14582         * const.cs: Put here the code that used to go into constant.cs
14583
14584         * constant.cs: Put here the code for constants, this is a new base
14585         class for Literals.
14586
14587         * literal.cs: Make Literal derive from Constant.
14588
14589 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
14590
14591         * statement.cs (Return.Emit): Report error 157 if the user
14592         attempts to return from a finally block.
14593
14594         (Return.Emit): Instead of emitting a return, jump to the end of
14595         the function.
14596
14597         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
14598         LocalBuilder to store the result of the function.  ReturnLabel is
14599         the target where we jump.
14600
14601
14602 2001-12-09  Radek Doulik  <rodo@ximian.com>
14603
14604         * cs-parser.jay: remember alias in current namespace
14605
14606         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14607         namespaces
14608
14609         * class.cs (LookupAlias): lookup alias in my_namespace
14610
14611         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14612         aliases hashtable
14613         (LookupAlias): lookup alias in this and if needed in parent
14614         namespaces
14615
14616 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14617
14618         * support.cs: 
14619
14620         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14621         making things static.  I need this to avoid passing the
14622         TypeContainer when calling ParameterType.
14623
14624         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14625         that did string manipulation to compute the type and then call
14626         GetType.  Use Parameter.ParameterType instead.
14627
14628         * cs-tokenizer.cs: Consume the suffix for floating values.
14629
14630         * expression.cs (ParameterReference): figure out whether this is a
14631         reference parameter or not.  Kill an extra variable by computing
14632         the arg_idx during emission.
14633
14634         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14635         function that returns whether a parameter is an out/ref value or not.
14636
14637         (Parameter.ParameterType): The type of the parameter (base,
14638         without ref/out applied).
14639
14640         (Parameter.Resolve): Perform resolution here.
14641         (Parameter.ExternalType): The full type (with ref/out applied).
14642
14643         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14644         support for expressions on the using statement.
14645
14646 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14647
14648         * statement.cs (Using.EmitLocalVariableDecls): Split the
14649         localvariable handling of the using statement.
14650
14651         (Block.EmitMeta): Keep track of variable count across blocks.  We
14652         were reusing slots on separate branches of blocks.
14653
14654         (Try.Emit): Emit the general code block, we were not emitting it. 
14655
14656         Check the type of the declaration to be an IDisposable or
14657         something that can be implicity converted to it. 
14658
14659         Emit conversions if required.
14660
14661         * ecore.cs (EmptyExpression): New utility class.
14662         (Expression.ImplicitConversionExists): New utility function.
14663
14664 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14665
14666         * statement.cs (Using): Implement.
14667
14668         * expression.cs (LocalVariableReference): Support read only variables.
14669
14670         * statement.cs: Remove the explicit emit for the Leave opcode.
14671         (VariableInfo): Add a readonly field.
14672
14673 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14674
14675         * ecore.cs (ConvCast): new class used to encapsulate the various
14676         explicit integer conversions that works in both checked and
14677         unchecked contexts.
14678
14679         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14680         properly generate the overflow opcodes.
14681
14682 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14683
14684         * statement.cs: The correct type for the EmptyExpression is the
14685         element_type, not the variable type.  Ravi pointed this out.
14686
14687 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14688
14689         * class.cs (Method::Define): Handle PInvoke methods specially
14690         by using DefinePInvokeMethod instead of the usual one.
14691
14692         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14693         above to do the task of extracting information and defining the method.
14694
14695 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14696
14697         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14698         of the condition for string type.
14699
14700         (Emit): Move that here. 
14701
14702         (ArrayCreation::CheckIndices): Keep string literals in their expression
14703         form.
14704
14705         (EmitDynamicInitializers): Handle strings appropriately.
14706
14707 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14708
14709         * codegen.cs (EmitContext): Replace multiple variables with a
14710         single pointer to the current Switch statement.
14711
14712         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14713         EmitContext.
14714
14715 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14716
14717         * statement.cs 
14718
14719         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14720         default'.
14721
14722         (Foreach.Emit): Foreach on arrays was not setting
14723         up the loop variables (for break/continue).
14724
14725         (GotoCase): Semi-implented.
14726
14727 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14728
14729         * attribute.cs (CheckAttribute): Handle system attributes by using
14730         Attribute.GetAttributes to examine information we need.
14731
14732         (GetValidPlaces): Same here.
14733
14734         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14735
14736         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14737
14738         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14739
14740         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14741
14742         (Method::Emit): Handle the case when we are a PInvoke method.
14743
14744 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14745
14746         * expression.cs: Use ResolveWithSimpleName on compound names.
14747
14748 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14749
14750         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14751         before trying to reduce it.
14752
14753         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14754
14755         * constant.cs (LookupConstantValue): Implement.
14756
14757         (EmitConstant): Use the above in emitting the constant.
14758
14759         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14760         that are user-defined by doing a LookupConstantValue on them.
14761
14762         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14763         too, like above.
14764
14765 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14766
14767         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14768
14769         (BaseAccess.DoResolve): Implement.
14770
14771         (MemberAccess.DoResolve): Split this routine into a
14772         ResolveMemberAccess routine that can be used independently
14773
14774 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14775
14776         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14777         As that share bits of the implementation.  Is returns a boolean,
14778         while As returns the Type that is being probed.
14779
14780 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14781
14782         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14783         instead of a Literal - much easier.
14784
14785         (EnumInTransit): Remove - utterly useless :-)
14786
14787         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14788
14789         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14790
14791         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14792         chain when we have no associated expression.
14793
14794 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14795
14796         * constant.cs (Define): Use Location while reporting the errror.
14797
14798         Also emit a warning when 'new' is used and there is no inherited
14799         member to hide.
14800
14801         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14802         populated.
14803
14804         (LookupEnumValue): Implement to lookup an enum member's value and define it
14805         if necessary.
14806
14807         (Populate): Re-write accordingly to use the above routine.
14808
14809 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14810
14811         * expression.cs (This): Fix prototype for DoResolveLValue to
14812         override the base class DoResolveLValue.
14813
14814         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14815         declarations) 
14816
14817         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14818         (we need to load the address of the field here).  This fixes
14819         test-22. 
14820
14821         (FieldExpr.DoResolveLValue): Call the DoResolve
14822         function to initialize the Instance expression.
14823
14824         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14825         correctly the GetEnumerator operation on a value type.
14826
14827         * cs-parser.jay: Add more simple parsing error catches.
14828
14829         * statement.cs (Switch): Add support for string switches.
14830         Handle null specially.
14831
14832         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
14833
14834 2001-11-28  Ravi Pratap  <ravi@ximian.com>
14835
14836         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
14837
14838         (declare_local_constant): New helper function.
14839
14840         * statement.cs (AddConstant): Keep a separate record of constants
14841
14842         (IsConstant): Implement to determine if a variable is a constant.
14843
14844         (GetConstantExpression): Implement.
14845
14846         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
14847
14848         * statement.cs (IsVariableDefined): Re-write.
14849
14850 2001-11-27  Ravi Pratap  <ravi@ximian.com>
14851
14852         * class.cs (TypeContainer::FindMembers): Look for constants
14853         in the case when we are looking for MemberTypes.Field
14854
14855         * expression.cs (MemberAccess::DoResolve): Check that in the
14856         case we are a FieldExpr and a Literal, we are not being accessed
14857         by an instance reference.
14858
14859         * cs-parser.jay (local_constant_declaration): Implement.
14860
14861         (declaration_statement): Implement for constant declarations.
14862
14863 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
14864
14865         * statement.cs (Switch): Catch double defaults.
14866
14867         (Switch): More work on the switch() statement
14868         implementation.  It works for integral values now, need to finish
14869         string support.
14870
14871
14872 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14873
14874         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
14875         integer literals into other integer literals.  To be used by
14876         switch. 
14877
14878 2001-11-24  Ravi Pratap  <ravi@ximian.com>
14879
14880         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
14881         some memory.
14882
14883         (EmitDynamicInitializers): Cope with the above since we extract data
14884         directly from ArrayData now.
14885
14886         (ExpectInitializers): Keep track of whether initializers are mandatory
14887         or not.
14888
14889         (Bounds): Make it a hashtable to prevent the same dimension being 
14890         recorded for every element in that dimension.
14891
14892         (EmitDynamicInitializers): Fix bug which prevented the Set array method
14893         from being found.
14894
14895         Also fix bug which was causing the indices to be emitted in the reverse
14896         order.
14897
14898 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14899
14900         * expression.cs (ArrayCreation): Implement the bits that Ravi left
14901         unfinished.  They do not work, because the underlying code is
14902         sloppy.
14903
14904 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14905
14906         * cs-parser.jay: Remove bogus fixme.
14907
14908         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
14909         on Switch statement.
14910
14911 2001-11-23  Ravi Pratap  <ravi@ximian.com>
14912
14913         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
14914         the same. 
14915
14916         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
14917         parameter. Apparently, any expression is allowed. 
14918
14919         (ValidateInitializers): Update accordingly.
14920
14921         (CheckIndices): Fix some tricky bugs thanks to recursion.
14922
14923         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
14924         I was being completely brain-dead.
14925
14926         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
14927         and re-write acordingly.
14928
14929         (DelegateInvocation): Re-write accordingly.
14930
14931         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
14932
14933         (MakeByteBlob): Handle types more correctly.
14934
14935         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
14936         initialization from expressions but it is incomplete because I am a complete
14937         Dodo :-|
14938
14939 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14940
14941         * statement.cs (If.Emit): Fix a bug that generated incorrect code
14942         on If.  Basically, we have to return `true' (ie, we do return to
14943         our caller) only if both branches of the if return.
14944
14945         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
14946         short-circuit operators, handle them as short circuit operators. 
14947
14948         (Cast.DoResolve): Resolve type.
14949         (Cast.Cast): Take an expression as the target type.
14950
14951         * cs-parser.jay (cast_expression): Remove old hack that only
14952         allowed a limited set of types to be handled.  Now we take a
14953         unary_expression and we resolve to a type during semantic
14954         analysis.
14955
14956         Use the grammar productions from Rhys to handle casts (this is
14957         not complete like Rhys syntax yet, we fail to handle that corner
14958         case that C# has regarding (-x), but we will get there.
14959
14960 2001-11-22  Ravi Pratap  <ravi@ximian.com>
14961
14962         * class.cs (EmitFieldInitializer): Take care of the case when we have a
14963         field which is an array type.
14964
14965         * cs-parser.jay (declare_local_variables): Support array initialization too.
14966
14967         * typemanager.cs (MakeKey): Implement.
14968
14969         (everywhere): Use the above appropriately.
14970
14971         * cs-parser.jay (for_statement): Update for array initialization while
14972         declaring variables.
14973
14974         * ecore.cs : The error message was correct, it's the variable's names that
14975         were misleading ;-) Make the code more readable.
14976
14977         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
14978         the correct type etc.
14979
14980         (ConvertExplicit): Handle Enum types by examining the underlying type.
14981
14982 2001-11-21  Ravi Pratap  <ravi@ximian.com>
14983
14984         * parameter.cs (GetCallingConvention): Always return
14985         CallingConventions.Standard for now.
14986
14987 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14988
14989         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14990         and `r' after calling DoNumericPromotions.
14991
14992         * ecore.cs: Fix error message (the types were in the wrong order).
14993
14994         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14995         BindingFlags.Instance as well 
14996
14997         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14998         implicit int literal conversion in an empty cast so that we
14999         propagate the right type upstream.
15000
15001         (UnboxCast): new class used to unbox value types.
15002         (Expression.ConvertExplicit): Add explicit type conversions done
15003         by unboxing.
15004
15005         (Expression.ImplicitNumericConversion): Oops, forgot to test for
15006         the target type before applying the implicit LongLiterals to ULong
15007         literal cast.
15008
15009 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
15010
15011         * cs-parser.jay (for_statement): Reworked the way For works: now
15012         we declare manually any variables that are introduced in
15013         for_initializer to solve the problem of having out-of-band code
15014         emition (that is what got for broken).
15015
15016         (declaration_statement): Perform the actual variable declaration
15017         that used to be done in local_variable_declaration here.
15018
15019         (local_variable_declaration): Do not declare anything, just pass
15020         the information on a DictionaryEntry
15021
15022 2001-11-20  Ravi Pratap  <ravi@ximian.com>
15023
15024         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
15025         re-write of the logic to now make it recursive.
15026
15027         (UpdateIndices): Re-write accordingly.
15028
15029         Store element data in a separate ArrayData list in the above methods.
15030
15031         (MakeByteBlob): Implement to dump the array data into a byte array.
15032
15033 2001-11-19  Ravi Pratap  <ravi@ximian.com>
15034
15035         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
15036         into CheckIndices.
15037
15038         * constant.cs (Define): Implement.
15039
15040         (EmitConstant): Re-write fully.
15041
15042         Pass in location info.
15043
15044         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
15045         respectively.
15046
15047         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
15048         DictionaryEntry since we need location info too.
15049
15050         (constant_declaration): Update accordingly.
15051
15052         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
15053         code into another method : UpdateIndices.
15054
15055 2001-11-18  Ravi Pratap  <ravi@ximian.com>
15056
15057         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
15058         some type checking etc.
15059
15060 2001-11-17  Ravi Pratap  <ravi@ximian.com>
15061
15062         * expression.cs (ArrayCreation::ValidateInitializers): Implement
15063         bits to provide dimension info if the user skips doing that.
15064
15065         Update second constructor to store the rank correctly.
15066
15067 2001-11-16  Ravi Pratap  <ravi@ximian.com>
15068
15069         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
15070         and try to implement.
15071
15072         * ../errors/cs0150.cs : Add.
15073
15074         * ../errors/cs0178.cs : Add.
15075
15076 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
15077
15078         * statement.cs: Implement foreach on multi-dimensional arrays. 
15079
15080         * parameter.cs (Parameters.GetParameterByName): Also lookup the
15081         name of the params argument.
15082
15083         * expression.cs: Use EmitStoreOpcode to get the right opcode while
15084         initializing the array.
15085
15086         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
15087         we can use this elsewhere.
15088
15089         * statement.cs: Finish implementation of foreach for single
15090         dimension arrays.
15091
15092         * cs-parser.jay: Use an out-of-band stack to pass information
15093         around, I wonder why I need this.
15094
15095         foreach_block: Make the new foreach_block the current_block.
15096
15097         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
15098         function used to return a static Parameters structure.  Used for
15099         empty parameters, as those are created very frequently.
15100
15101         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
15102
15103 2001-11-15  Ravi Pratap  <ravi@ximian.com>
15104
15105         * interface.cs : Default modifier is private, not public. The
15106         make verify test passes again.
15107
15108 2001-11-15  Ravi Pratap  <ravi@ximian.com>
15109
15110         * support.cs (ReflectionParameters): Fix logic to determine
15111         whether the last parameter is a params one. Test 9 passes again.
15112
15113         * delegate.cs (Populate): Register the builders we define with
15114         RegisterParameterForBuilder. Test 19 passes again.
15115
15116         * cs-parser.jay (property_declaration): Reference $6 instead
15117         of $$ to get at the location.
15118
15119         (indexer_declaration): Similar stuff.
15120
15121         (attribute): Ditto.
15122
15123         * class.cs (Property): Register parameters for the Get and Set methods
15124         if they exist. Test 23 passes again.
15125
15126         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
15127         call to EmitArguments as we are sure there aren't any params arguments. 
15128         Test 32 passes again.
15129
15130         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
15131         IndexOutOfRangeException. 
15132
15133         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
15134         Test 33 now passes again.
15135
15136 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
15137
15138         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
15139         broke a bunch of things.  Will have to come up with a better way
15140         of tracking locations.
15141
15142         * statement.cs: Implemented foreach for single dimension arrays.
15143
15144 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15145
15146         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
15147         an error.  This removes the lookup from the critical path.
15148
15149         * cs-parser.jay: Removed use of temporary_loc, which is completely
15150         broken. 
15151
15152 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
15153
15154         * support.cs (ReflectionParameters.ParameterModifier): Report
15155         whether the argument is a PARAMS argument or not.
15156
15157         * class.cs: Set the attribute `ParamArrayAttribute' on the
15158         parameter argument.
15159
15160         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
15161         and cons_param_array_attribute (ConstructorInfo for
15162         ParamArrayAttribute)., 
15163
15164         * codegen.cs: Emit the return using the `Return' statement, that
15165         way we can report the error correctly for missing return values. 
15166
15167         * class.cs (Method.Emit): Clean up.
15168
15169         * expression.cs (Argument.Resolve): Take another argument: the
15170         location where this argument is used.  Notice that this is not
15171         part of the "Argument" class as to reduce the size of the
15172         structure (we know the approximate location anyways).
15173
15174         Test if the argument is a variable-reference, if not, then
15175         complain with a 206.
15176
15177         (Argument.Emit): Emit addresses of variables.
15178
15179         (Argument.FullDesc): Simplify.
15180
15181         (Invocation.DoResolve): Update for Argument.Resolve.
15182
15183         (ElementAccess.DoResolve): ditto.
15184
15185         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
15186         method should be virtual, as this method is always virtual.
15187
15188         (NewDelegate.DoResolve): Update for Argument.Resolve.
15189
15190         * class.cs (ConstructorInitializer.DoResolve): ditto.
15191
15192         * attribute.cs (Attribute.Resolve): ditto.
15193
15194 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
15195
15196         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
15197
15198         * expression.cs (ParameterReference): Drop IStackStorage and implement
15199         IAssignMethod instead. 
15200
15201         (LocalVariableReference): ditto.
15202
15203         * ecore.cs (FieldExpr): Drop IStackStorage and implement
15204         IAssignMethod instead. 
15205
15206 2001-11-13  Miguel de Icaza <miguel@ximian.com>
15207
15208         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
15209         enumerations that are used in heavily used structures derive from
15210         byte in a laughable and pathetic attempt to reduce memory usage.
15211         This is the kind of pre-optimzations that you should not do at
15212         home without adult supervision.
15213
15214         * expression.cs (UnaryMutator): New class, used to handle ++ and
15215         -- separatedly from the other unary operators.  Cleans up the
15216         code, and kills the ExpressionStatement dependency in Unary.
15217
15218         (Unary): Removed `method' and `Arguments' from this class, making
15219         it smaller, and moving it all to SimpleCall, so I can reuse this
15220         code in other locations and avoid creating a lot of transient data
15221         strucutres when not required.
15222
15223         * cs-parser.jay: Adjust for new changes.
15224
15225 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
15226
15227         * enum.cs (Enum.Populate): If there is a failure during
15228         definition, return
15229
15230         * cs-parser.jay (opt_enum_base): we used to catch type errors
15231         here, but this is really incorrect.  The type error should be
15232         catched during semantic analysis.
15233
15234 2001-12-11  Ravi Pratap  <ravi@ximian.com>
15235
15236         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
15237         current_local_parameters as expected since I, in my stupidity, had forgotten
15238         to do this :-)
15239
15240         * attribute.cs (GetValidPlaces): Fix stupid bug.
15241
15242         * class.cs (Method::Emit): Perform check on applicability of attributes.
15243
15244         (Constructor::Emit): Ditto.
15245
15246         (Field::Emit): Ditto.
15247
15248         (Field.Location): Store location information.
15249
15250         (Property, Event, Indexer, Operator): Ditto.
15251
15252         * cs-parser.jay (field_declaration): Pass in location for each field.
15253
15254         * ../errors/cs0592.cs : Add.
15255
15256 2001-11-12  Ravi Pratap  <ravi@ximian.com>
15257
15258         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
15259
15260         (InitCoreTypes): Update accordingly.
15261
15262         (RegisterAttrType, LookupAttr): Implement.
15263
15264         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
15265         info about the same.
15266
15267         (Resolve): Update to populate the above as necessary.
15268
15269         (Error592): Helper.
15270
15271         (GetValidPlaces): Helper to the above.
15272
15273         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
15274
15275         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
15276
15277 2001-11-12  Ravi Pratap  <ravi@ximian.com>
15278
15279         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
15280
15281         * ../errors/cs0617.cs : Add.
15282
15283 2001-11-11  Ravi Pratap  <ravi@ximian.com>
15284
15285         * enum.cs (Emit): Rename to Populate to be more consistent with what
15286         we expect it to do and when exactly it is called.
15287
15288         * class.cs, rootcontext.cs : Update accordingly.
15289
15290         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
15291         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
15292
15293         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
15294
15295         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
15296         of a fieldinfo using the above, when dealing with a FieldBuilder.
15297
15298 2001-11-10  Ravi Pratap  <ravi@ximian.com>
15299
15300         * ../errors/cs0031.cs : Add.
15301
15302         * ../errors/cs1008.cs : Add.
15303
15304         * ../errrors/cs0543.cs : Add.
15305
15306         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
15307         enum type.
15308
15309         (FindMembers): Implement.
15310
15311         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
15312         enums and delegates too.
15313
15314         (enum_types): Rename to builder_to_enum.
15315
15316         (delegate_types): Rename to builder_to_delegate.
15317
15318         * delegate.cs (FindMembers): Implement.
15319
15320 2001-11-09  Ravi Pratap  <ravi@ximian.com>
15321
15322         * typemanager.cs (IsEnumType): Implement.
15323
15324         * enum.cs (Emit): Re-write parts to account for the underlying type
15325         better and perform checking etc.
15326
15327         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
15328         of the underlying type.
15329
15330         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
15331         value
15332
15333         * enum.cs (error31): Helper to report error #31.
15334
15335         * cs-parser.jay (enum_declaration): Store location of each member too.
15336
15337         * enum.cs (member_to_location): New hashtable. 
15338
15339         (AddEnumMember): Update location hashtable.
15340
15341         (Emit): Use the location of each member while reporting errors.
15342
15343 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15344
15345         * cs-parser.jay: A for_initializer if is a
15346         local_variable_declaration really ammount to have an implicit
15347         block with the variable declaration and no initializer for for.
15348
15349         * statement.cs (For.Emit): Cope with null initializers.
15350
15351         This fixes the infinite loop on for initializers.
15352
15353 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
15354
15355         * enum.cs: More cleanup.
15356
15357         * ecore.cs: Remove dead code.
15358
15359         * class.cs (Property.Emit): More simplification.
15360         (Event.Emit): ditto.
15361
15362         Reworked to have less levels of indentation.
15363
15364 2001-11-08  Ravi Pratap  <ravi@ximian.com>
15365
15366         * class.cs (Property): Emit attributes.
15367
15368         (Field): Ditto.
15369
15370         (Event): Ditto.
15371
15372         (Indexer): Ditto.
15373
15374         (Operator): Ditto.
15375
15376         * enum.cs (Emit): Ditto.
15377
15378         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
15379         Enums too.
15380
15381         * class.cs (Field, Event, etc.): Move attribute generation into the
15382         Emit method everywhere.
15383
15384         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
15385         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
15386         as we had no way of defining nested enums !
15387
15388         * rootcontext.cs : Adjust code accordingly.
15389
15390         * typemanager.cs (AddEnumType): To keep track of enum types separately.
15391
15392 2001-11-07  Ravi Pratap  <ravi@ximian.com>
15393
15394         * expression.cs (EvalConstantExpression): Move into ecore.cs
15395
15396         * enum.cs (Enum): Rename some members and make them public and readonly
15397         according to our convention.
15398
15399         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
15400         nothing else.
15401
15402         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
15403
15404         (Enum::Emit): Write a simple version for now which doesn't try to compute
15405         expressions. I shall modify this to be more robust in just a while.
15406
15407         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
15408
15409         (TypeContainer::CloseType): Create the Enum types too.
15410
15411         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
15412
15413         * expression.cs (EvalConstantExpression): Get rid of completely.
15414
15415         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
15416         user-defined values and other cases.
15417
15418         (IsValidEnumLiteral): Helper function.
15419
15420         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
15421         out there in the case we had a literal FieldExpr.
15422
15423         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
15424
15425         (Literalize): Revamp a bit to take two arguments.
15426
15427         (EnumLiteral): New class which derives from Literal to wrap enum literals.
15428
15429 2001-11-06  Ravi Pratap  <ravi@ximian.com>
15430
15431         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
15432
15433         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
15434
15435         (Resolve): Use the above to ensure we have proper initializers.
15436
15437 2001-11-05  Ravi Pratap  <ravi@ximian.com>
15438
15439         * expression.cs (Expression::EvalConstantExpression): New method to 
15440         evaluate constant expressions.
15441
15442         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
15443
15444 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
15445
15446         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
15447         in an array.
15448
15449         (Binary.ResolveOperator): Handle operator != (object a, object b)
15450         and operator == (object a, object b);
15451
15452         (Binary.DoNumericPromotions): Indicate whether the numeric
15453         promotion was possible.
15454
15455         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
15456         Implement.  
15457
15458         Made the ArrayAccess implement interface IAssignMethod instead of
15459         IStackStore as the order in which arguments are passed reflects
15460         this.
15461
15462         * assign.cs: Instead of using expr.ExprClass to select the way of
15463         assinging, probe for the IStackStore/IAssignMethod interfaces.
15464
15465         * typemanager.cs: Load InitializeArray definition.
15466
15467         * rootcontext.cs (RootContext.MakeStaticData): Used to define
15468         static data that can be used to initialize arrays. 
15469
15470 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
15471
15472         * expression.cs: Handle operator== and operator!= for booleans.
15473
15474         (Conditioal.Reduce): Implement reducer for the ?: operator.
15475
15476         (Conditional.Resolve): Implement dead code elimination.
15477
15478         (Binary.Resolve): Catch string literals and return a new
15479         concatenated string.
15480
15481         (Unary.Reduce): Implement reduction of unary expressions.
15482
15483         * ecore.cs: Split out the expression core handling here.
15484
15485         (Expression.Reduce): New method used to perform constant folding
15486         and CSE.  This is needed to support constant-expressions. 
15487
15488         * statement.cs (Statement.EmitBoolExpression): Pass true and false
15489         targets, and optimize for !x.
15490
15491 2001-11-04  Ravi Pratap  <ravi@ximian.com>
15492
15493         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
15494         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
15495         set custom atttributes.
15496
15497         * literal.cs (Literal::GetValue): New abstract method to return the actual
15498         value of the literal, cast as an object.
15499
15500         (*Literal): Implement GetValue method.
15501
15502         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
15503         expressions to the arraylist but objects of type Argument.
15504
15505         * class.cs (TypeContainer::Emit): Emit our attributes too.
15506
15507         (Method::Emit, Constructor::Emit): Ditto.
15508
15509         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
15510         to be ignoring earlier.
15511
15512 2001-11-03  Ravi Pratap  <ravi@ximian.com>
15513
15514         * attribute.cs (AttributeSection::Define): Implement to do the business
15515         of constructing a CustomAttributeBuilder.
15516
15517         (Attribute): New trivial class. Increases readability of code.  
15518
15519         * cs-parser.jay : Update accordingly.
15520
15521         (positional_argument_list, named_argument_list, named_argument): New rules
15522
15523         (attribute_arguments): Use the above so that we are more correct.
15524
15525 2001-11-02  Ravi Pratap  <ravi@ximian.com>
15526
15527         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
15528         to perform all checks for a method with a params parameter.
15529
15530         (Invocation::OverloadResolve): Update to use the above method and therefore
15531         cope correctly with params method invocations.
15532
15533         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
15534         params too.
15535
15536         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
15537         constructors in our parent too because we can't afford to miss out on 
15538         protected ones ;-)
15539
15540         * attribute.cs (AttributeSection): New name for the class Attribute
15541
15542         Other trivial changes to improve readability.
15543
15544         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
15545         use the new class names.
15546
15547 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15548
15549         * class.cs (Method::Define): Complete definition for params types too
15550
15551         (Indexer::Define): Ditto.
15552
15553         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
15554         Cope everywhere with a request for info about the array parameter.
15555
15556 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15557
15558         * tree.cs (RecordNamespace): Fix up to check for the correct key.
15559
15560         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
15561         local_variable_type to extract the string corresponding to the type.
15562
15563         (local_variable_type): Fixup the action to use the new helper method.
15564
15565         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
15566         go.
15567
15568         * expression.cs : Clean out code which uses the above.
15569
15570 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15571
15572         * typemanager.cs (RegisterMethod): Check if we already have an existing key
15573         and bale out if necessary by returning a false.
15574
15575         (RegisterProperty): Ditto.
15576
15577         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
15578         and print out appropriate error messages.
15579
15580         * interface.cs (everywhere): Ditto.
15581
15582         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
15583         location to constructor.
15584
15585         * class.cs (Property, Event, Indexer): Update accordingly.
15586
15587         * ../errors/cs111.cs : Added.
15588
15589         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
15590         of a method, as laid down by the spec.
15591
15592         (Invocation::OverloadResolve): Use the above method.
15593
15594 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15595
15596         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
15597         now take a TypeContainer and a Parameters object.
15598
15599         (ParameterData): Modify return type of ParameterModifier method to be 
15600         Parameter.Modifier and not a string.
15601
15602         (ReflectionParameters, InternalParameters): Update accordingly.
15603
15604         * expression.cs (Argument::GetParameterModifier): Same here.
15605
15606         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15607         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15608         symbol in it at all so maybe this is only for now.
15609
15610 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15611
15612         * support.cs (InternalParameters): Constructor now takes an extra argument 
15613         which is the actual Parameters class.
15614
15615         (ParameterDesc): Update to provide info on ref/out modifiers.
15616
15617         * class.cs (everywhere): Update call to InternalParameters to pass in
15618         the second argument too.
15619
15620         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15621         to return the modifier info [ref/out etc]
15622
15623         (InternalParameters, ReflectionParameters): Implement the above.
15624
15625         * expression.cs (Argument::ParameterModifier): Similar function to return
15626         info about the argument's modifiers.
15627
15628         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15629         too.
15630
15631         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15632         a new SetFormalParameters object which we pass to InternalParameters.
15633
15634 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15635
15636         * expression.cs (NewArray): Merge into the ArrayCreation class.
15637
15638 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15639
15640         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15641         NewUserdefinedArray into one as there wasn't much of a use in having
15642         two separate ones.
15643
15644         * expression.cs (Argument): Change field's name to ArgType from Type.
15645
15646         (Type): New readonly property which returns the proper type, taking into 
15647         account ref/out modifiers.
15648
15649         (everywhere): Adjust code accordingly for the above.
15650
15651         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15652         whether we are emitting for a ref or out parameter.
15653
15654         * expression.cs (Argument::Emit): Use the above field to set the state.
15655
15656         (LocalVariableReference::Emit): Update to honour the flag and emit the
15657         right stuff.
15658
15659         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15660
15661         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15662
15663         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15664
15665         (ReflectionParameters, InternalParameters): Implement the above method.
15666
15667         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15668         reporting errors.
15669
15670         (Invocation::FullMethodDesc): Ditto. 
15671
15672 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15673
15674         * cs-parser.jay: Add extra production for the second form of array
15675         creation. 
15676
15677         * expression.cs (ArrayCreation): Update to reflect the above
15678         change. 
15679
15680         * Small changes to prepare for Array initialization.
15681
15682 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15683
15684         * typemanager.cs (ImplementsInterface): interface might be null;
15685         Deal with this problem;
15686
15687         Also, we do store negative hits on the cache (null values), so use
15688         this instead of calling t.GetInterfaces on the type everytime.
15689
15690 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15691
15692         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15693
15694         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15695         split functionality out into different classes.
15696
15697         (New::FormArrayType): Move into NewBuiltinArray.
15698
15699         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15700         quite useless.
15701
15702         (NewBuiltinArray): New class to handle creation of built-in arrays.
15703
15704         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15705         account creation of one-dimensional arrays.
15706
15707         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15708
15709         (NewUserdefinedArray::DoResolve): Implement.
15710
15711         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15712
15713         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15714         we maintain inside the TypeManager. This is necessary to perform lookups on the
15715         module builder.
15716
15717         (LookupType): Update to perform GetType on the module builders too.     
15718
15719         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15720
15721         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15722
15723 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15724
15725         * expression.cs (New::DoResolve): Implement guts of array creation.
15726
15727         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15728
15729 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15730
15731         * expression.cs: Fix bug I introduced lsat night that broke
15732         Delegates. 
15733
15734         (Expression.Resolve): Report a 246 error (can not resolve name)
15735         if we find a SimpleName in the stream.
15736
15737         (Expression.ResolveLValue): Ditto.
15738
15739         (Expression.ResolveWithSimpleName): This function is a variant of
15740         ResolveName, this one allows SimpleNames to be returned without a
15741         warning.  The only consumer of SimpleNames is MemberAccess
15742
15743 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15744
15745         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15746         might arrive here.  I have my doubts that this is correct.
15747
15748         * statement.cs (Lock): Implement lock statement.
15749
15750         * cs-parser.jay: Small fixes to support `lock' and `using'
15751
15752         * cs-tokenizer.cs: Remove extra space
15753
15754         * driver.cs: New flag --checked, allows to turn on integer math
15755         checking. 
15756
15757         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15758         Threading.Monitor.Exit 
15759
15760 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15761
15762         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15763         Expression Class to be IndexerAccess.
15764
15765         Notice that Indexer::DoResolve sets the eclass to Value.
15766
15767 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15768
15769         * class.cs (TypeContainer::Emit): Emit code for indexers.
15770
15771         * assign.cs (IAssignMethod): New interface implemented by Indexers
15772         and Properties for handling assignment.
15773
15774         (Assign::Emit): Simplify and reuse code. 
15775
15776         * expression.cs (IndexerAccess, PropertyExpr): Implement
15777         IAssignMethod, clean up old code. 
15778
15779 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15780
15781         * typemanager.cs (ImplementsInterface): New method to determine if a type
15782         implements a given interface. Provides a nice cache too.
15783
15784         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15785         method.
15786
15787         (ConvertReferenceExplicit): Ditto.
15788
15789         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15790         various methods, with correct names etc.
15791
15792         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15793         Operator.UnaryNegation.
15794
15795         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15796         we have a unary plus or minus operator.
15797
15798         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15799         UnaryMinus.
15800
15801         * everywhere : update accordingly.
15802
15803         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15804         respectively.
15805
15806         * class.cs (Method::Define): For the case where we are implementing a method
15807         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15808         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15809
15810 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15811
15812         * interface.cs (FindMembers): Implement to work around S.R.E
15813         lameness.
15814
15815         * typemanager.cs (IsInterfaceType): Implement.
15816
15817         (FindMembers): Update to handle interface types too.
15818
15819         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15820         use IsAssignableFrom as that is not correct - it doesn't work.
15821
15822         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15823         and accordingly override EmitStatement.
15824
15825         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15826         using the correct logic :-)
15827
15828 2001-10-19  Ravi Pratap  <ravi@ximian.com>
15829
15830         * ../errors/cs-11.cs : Add to demonstrate error -11 
15831
15832 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
15833
15834         * assign.cs (Assign::Resolve): Resolve right hand side first, and
15835         then pass this as a hint to ResolveLValue.
15836
15837         * expression.cs (FieldExpr): Add Location information
15838
15839         (FieldExpr::LValueResolve): Report assignment to readonly
15840         variable. 
15841
15842         (Expression::ExprClassFromMemberInfo): Pass location information.
15843
15844         (Expression::ResolveLValue): Add new method that resolves an
15845         LValue. 
15846
15847         (Expression::DoResolveLValue): Default invocation calls
15848         DoResolve. 
15849
15850         (Indexers): New class used to keep track of indexers in a given
15851         Type. 
15852
15853         (IStackStore): Renamed from LValue, as it did not really describe
15854         what this did.  Also ResolveLValue is gone from this interface and
15855         now is part of Expression.
15856
15857         (ElementAccess): Depending on the element access type
15858
15859         * typemanager.cs: Add `indexer_name_type' as a Core type
15860         (System.Runtime.CompilerServices.IndexerNameAttribute)
15861
15862         * statement.cs (Goto): Take a location.
15863
15864 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15865
15866         * delegate.cs (Delegate::VerifyDelegate): New method to verify
15867         if two delegates are compatible.
15868
15869         (NewDelegate::DoResolve): Update to take care of the case when
15870         we instantiate a delegate from another delegate.
15871
15872         * typemanager.cs (FindMembers): Don't even try to look up members
15873         of Delegate types for now.
15874
15875 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15876
15877         * delegate.cs (NewDelegate): New class to take care of delegate
15878         instantiation.
15879
15880         * expression.cs (New): Split the delegate related code out into 
15881         the NewDelegate class.
15882
15883         * delegate.cs (DelegateInvocation): New class to handle delegate 
15884         invocation.
15885
15886         * expression.cs (Invocation): Split out delegate related code into
15887         the DelegateInvocation class.
15888
15889 2001-10-17  Ravi Pratap  <ravi@ximian.com>
15890
15891         * expression.cs (New::DoResolve): Implement delegate creation fully
15892         and according to the spec.
15893
15894         (New::DoEmit): Update to handle delegates differently.
15895
15896         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
15897         because of which we were printing out arguments in reverse order !
15898
15899         * delegate.cs (VerifyMethod): Implement to check if the given method
15900         matches the delegate.
15901
15902         (FullDelegateDesc): Implement.
15903
15904         (VerifyApplicability): Implement.
15905
15906         * expression.cs (Invocation::DoResolve): Update to accordingly handle
15907         delegate invocations too.
15908
15909         (Invocation::Emit): Ditto.
15910
15911         * ../errors/cs1593.cs : Added.
15912
15913         * ../errors/cs1594.cs : Added.
15914
15915         * delegate.cs (InstanceExpression, TargetMethod): New properties.
15916
15917 2001-10-16  Ravi Pratap  <ravi@ximian.com>
15918
15919         * typemanager.cs (intptr_type): Core type for System.IntPtr
15920
15921         (InitCoreTypes): Update for the same.
15922
15923         (iasyncresult_type, asynccallback_type): Ditto.
15924
15925         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
15926         correct.
15927
15928         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
15929         too.
15930
15931         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
15932         the builders for the 4 members of a delegate type :-)
15933
15934         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
15935         type.
15936
15937         * expression.cs (New::DoResolve): Implement guts for delegate creation.
15938
15939         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
15940
15941 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
15942
15943         * statement.cs (Break::Emit): Implement.   
15944         (Continue::Emit): Implement.
15945
15946         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15947         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15948         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15949         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
15950         end loop
15951
15952         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
15953         properties that track the label for the current loop (begin of the
15954         loop and end of the loop).
15955
15956 2001-10-15  Ravi Pratap  <ravi@ximian.com>
15957
15958         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
15959         use of emitting anything at all.
15960
15961         * class.cs, rootcontext.cs : Get rid of calls to the same.
15962
15963         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
15964
15965         (Populate): Define the constructor correctly and set the implementation
15966         attributes.
15967
15968         * typemanager.cs (delegate_types): New hashtable to hold delegates that
15969         have been defined.
15970
15971         (AddDelegateType): Implement.
15972
15973         (IsDelegateType): Implement helper method.
15974
15975         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
15976
15977         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
15978         and accordingly handle it.
15979
15980         * delegate.cs (Populate): Take TypeContainer argument.
15981         Implement bits to define the Invoke method. However, I still haven't figured out
15982         how to take care of the native int bit :-(
15983
15984         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
15985         Qualify the name of the delegate, not its return type !
15986
15987         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
15988         conversion.
15989
15990         (StandardConversionExists): Checking for array types turns out to be recursive.
15991
15992         (ConvertReferenceExplicit): Implement array conversion.
15993
15994         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15995
15996 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15997
15998         * cs-parser.jay (delegate_declaration): Store the fully qualified
15999         name as it is a type declaration.
16000
16001         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
16002         readonly.
16003
16004         (DefineDelegate): Renamed from Define. Does the same thing essentially,
16005         as TypeContainer::DefineType.
16006
16007         (Populate): Method in which all the definition of the various methods (Invoke)
16008         etc is done.
16009
16010         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
16011         see.
16012
16013         (CloseDelegate): Finally creates the delegate.
16014
16015         * class.cs (TypeContainer::DefineType): Update to define delegates.
16016         (Populate, Emit and CloseType): Do the same thing here too.
16017
16018         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
16019         delegates in all these operations.
16020
16021 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
16022
16023         * expression.cs: LocalTemporary: a new expression used to
16024         reference a temporary that has been created.
16025
16026         * assign.cs: Handle PropertyAccess back here, so that we can
16027         provide the proper semantic access to properties.
16028
16029         * expression.cs (Expression::ConvertReferenceExplicit): Implement
16030         a few more explicit conversions. 
16031
16032         * modifiers.cs: `NEW' modifier maps to HideBySig.
16033
16034         * expression.cs (PropertyExpr): Make this into an
16035         ExpressionStatement, and support the EmitStatement code path. 
16036
16037         Perform get/set error checking, clean up the interface.
16038
16039         * assign.cs: recognize PropertyExprs as targets, and if so, turn
16040         them into toplevel access objects.
16041
16042 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
16043
16044         * expression.cs: PropertyExpr::PropertyExpr: use work around the
16045         SRE.
16046
16047         * typemanager.cs: Keep track here of our PropertyBuilders again to
16048         work around lameness in SRE.
16049
16050 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
16051
16052         * expression.cs (LValue::LValueResolve): New method in the
16053         interface, used to perform a second resolution pass for LValues. 
16054
16055         (This::DoResolve): Catch the use of this in static methods.
16056
16057         (This::LValueResolve): Implement.
16058
16059         (This::Store): Remove warning, assigning to `this' in structures
16060         is 
16061
16062         (Invocation::Emit): Deal with invocation of
16063         methods on value types.  We need to pass the address to structure
16064         methods rather than the object itself.  (The equivalent code to
16065         emit "this" for structures leaves the entire structure on the
16066         stack instead of a pointer to it). 
16067
16068         (ParameterReference::DoResolve): Compute the real index for the
16069         argument based on whether the method takes or not a `this' pointer
16070         (ie, the method is static).
16071
16072         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
16073         value types returned from functions when we need to invoke a
16074         method on the sturcture.
16075
16076
16077 2001-10-11  Ravi Pratap  <ravi@ximian.com>
16078
16079         * class.cs (TypeContainer::DefineType): Method to actually do the business of
16080         defining the type in the Modulebuilder or Typebuilder. This is to take
16081         care of nested types which need to be defined on the TypeBuilder using
16082         DefineNestedMethod.
16083
16084         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
16085         methods in RootContext, only ported to be part of TypeContainer.
16086
16087         (TypeContainer::GetInterfaceOrClass): Ditto.
16088
16089         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
16090
16091         * interface.cs (Interface::DefineInterface): New method. Does exactly
16092         what RootContext.CreateInterface did earlier, only it takes care of nested types 
16093         too.
16094
16095         (Interface::GetInterfaces): Move from RootContext here and port.
16096
16097         (Interface::GetInterfaceByName): Same here.
16098
16099         * rootcontext.cs (ResolveTree): Re-write.
16100
16101         (PopulateTypes): Re-write.
16102
16103         * class.cs (TypeContainer::Populate): Populate nested types too.
16104         (TypeContainer::Emit): Emit nested members too.
16105
16106         * typemanager.cs (AddUserType): Do not make use of the FullName property,
16107         instead just use the name argument passed in as it is already fully
16108         qualified.
16109
16110         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
16111         to TypeContainer mapping to see if a type is user-defined.
16112
16113         * class.cs (TypeContainer::CloseType): Implement. 
16114
16115         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
16116         the default constructor.
16117
16118         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
16119         twice.
16120
16121         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
16122
16123         * interface.cs (CloseType): Create the type here.
16124
16125         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
16126         the hierarchy.
16127
16128         Remove all the methods which are now in TypeContainer.
16129
16130 2001-10-10  Ravi Pratap  <ravi@ximian.com>
16131
16132         * delegate.cs (Define): Re-write bits to define the delegate
16133         correctly.
16134
16135 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
16136
16137         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
16138
16139         * expression.cs (ImplicitReferenceConversion): handle null as well
16140         as a source to convert to any reference type.
16141
16142         * statement.cs (Return): Perform any implicit conversions to
16143         expected return type.  
16144
16145         Validate use of return statement.  
16146
16147         * codegen.cs (EmitContext): Pass the expected return type here.
16148
16149         * class.cs (Method, Constructor, Property): Pass expected return
16150         type to EmitContext.
16151
16152 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
16153
16154         * expression.cs: Make DoResolve take an EmitContext instead of a
16155         TypeContainer.
16156
16157         Replaced `l' and `location' for `loc', for consistency.
16158
16159         (Error, Warning): Remove unneeded Tc argument.
16160
16161         * assign.cs, literal.cs, constant.cs: Update to new calling
16162         convention. 
16163
16164         * codegen.cs: EmitContext now contains a flag indicating whether
16165         code is being generated in a static method or not.
16166
16167         * cs-parser.jay: DecomposeQI, new function that replaces the old
16168         QualifiedIdentifier.  Now we always decompose the assembled
16169         strings from qualified_identifier productions into a group of
16170         memberaccesses.
16171
16172 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
16173
16174         * rootcontext.cs: Deal with field-less struct types correctly now
16175         by passing the size option to Define Type.
16176
16177         * class.cs: Removed hack that created one static field. 
16178
16179 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
16180
16181         * statement.cs: Moved most of the code generation here. 
16182
16183 2001-10-09  Ravi Pratap  <ravi@ximian.com>
16184
16185         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
16186         seem very right.
16187
16188         (ElementAccess): Remove useless bits for now - keep checks as the spec
16189         says.
16190
16191 2001-10-08  Ravi Pratap  <ravi@ximian.com>
16192
16193         * expression.cs (ElementAccess::DoResolve): Remove my crap code
16194         and start performing checks according to the spec.
16195
16196 2001-10-07  Ravi Pratap  <ravi@ximian.com>
16197
16198         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
16199         rank_specifiers instead.
16200
16201         (rank_specifiers): Change the order in which the rank specifiers are stored
16202
16203         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
16204
16205         * expression.cs (ElementAccess): Implement the LValue interface too.
16206
16207 2001-10-06  Ravi Pratap  <ravi@ximian.com>
16208
16209         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
16210         except that user defined conversions are not included.
16211
16212         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
16213         perform the conversion of the return type, if necessary.
16214
16215         (New::DoResolve): Check whether we are creating an array or an object
16216         and accordingly do the needful.
16217
16218         (New::Emit): Same here.
16219
16220         (New::DoResolve): Implement guts of array creation.
16221
16222         (New::FormLookupType): Helper function.
16223
16224 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
16225
16226         * codegen.cs: Removed most of the code generation here, and move the
16227         corresponding code generation bits to the statement classes. 
16228
16229         Added support for try/catch/finalize and throw.
16230
16231         * cs-parser.jay: Added support for try/catch/finalize.
16232
16233         * class.cs: Catch static methods having the flags override,
16234         virtual or abstract.
16235
16236         * expression.cs (UserCast): This user cast was not really doing
16237         what it was supposed to do.  Which is to be born in fully resolved
16238         state.  Parts of the resolution were being performed at Emit time! 
16239
16240         Fixed this code.
16241
16242 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
16243
16244         * expression.cs: Implicity convert the result from UserCast.
16245
16246 2001-10-05  Ravi Pratap  <ravi@ximian.com>
16247
16248         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
16249         prevented it from working correctly. 
16250
16251         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
16252         merely ConvertImplicit.
16253
16254 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
16255
16256         * typemanager.cs: Make the LookupTypeContainer function static,
16257         and not per-instance.  
16258
16259         * class.cs: Make static FindMembers (the one that takes a Type
16260         argument). 
16261
16262         * codegen.cs: Add EmitForeach here.
16263
16264         * cs-parser.jay: Make foreach a toplevel object instead of the
16265         inline expansion, as we need to perform semantic analysis on it. 
16266
16267 2001-10-05  Ravi Pratap  <ravi@ximian.com>
16268
16269         * expression.cs (Expression::ImplicitUserConversion): Rename to
16270         UserDefinedConversion.
16271
16272         (Expression::UserDefinedConversion): Take an extra argument specifying 
16273         whether we look for explicit user conversions too.
16274
16275         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
16276
16277         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
16278
16279         (ExplicitUserConversion): Make it a call to UserDefinedConversion
16280         with the appropriate arguments.
16281
16282         * cs-parser.jay (cast_expression): Record location too.
16283
16284         * expression.cs (Cast): Record location info.
16285
16286         (Expression::ConvertExplicit): Take location argument.
16287
16288         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
16289         to determine if we are doing explicit conversions.
16290
16291         (UserCast::Emit): Update accordingly.
16292
16293         (Expression::ConvertExplicit): Report an error if everything fails.
16294
16295         * ../errors/cs0030.cs : Add.
16296
16297 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
16298
16299         * modifiers.cs: If the ABSTRACT keyword is present, also set the
16300         virtual and newslot bits. 
16301
16302         * class.cs (TypeContainer::RegisterRequiredImplementations):
16303         Record methods we need.
16304
16305         (TypeContainer::MakeKey): Helper function to make keys for
16306         MethodBases, since the Methodbase key is useless.
16307
16308         (TypeContainer::Populate): Call RegisterRequiredImplementations
16309         before defining the methods.   
16310
16311         Create a mapping for method_builders_to_methods ahead of time
16312         instead of inside a tight loop.
16313
16314         (::RequireMethods):  Accept an object as the data to set into the
16315         hashtable so we can report interface vs abstract method mismatch.
16316
16317 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16318
16319         * report.cs: Make all of it static.
16320
16321         * rootcontext.cs: Drop object_type and value_type computations, as
16322         we have those in the TypeManager anyways.
16323
16324         Drop report instance variable too, now it is a global.
16325
16326         * driver.cs: Use try/catch on command line handling.
16327
16328         Add --probe option to debug the error reporting system with a test
16329         suite. 
16330
16331         * report.cs: Add support for exiting program when a probe
16332         condition is reached.
16333
16334 2001-10-03  Ravi Pratap  <ravi@ximian.com>
16335
16336         * expression.cs (Binary::DoNumericPromotions): Fix the case when
16337         we do a forcible conversion regardless of type, to check if 
16338         ForceConversion returns a null.
16339
16340         (Binary::error19): Use location to report error.
16341
16342         (Unary::error23): Use location here too.
16343
16344         * ../errors/cs0019.cs : Check in.
16345
16346         * ../errors/cs0023.cs : Check in.
16347
16348         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
16349         case of a non-null MethodInfo object with a length of 0 !
16350
16351         (Binary::ResolveOperator): Flag error if overload resolution fails to find
16352         an applicable member - according to the spec :-)
16353         Also fix logic to find members in base types.
16354
16355         (Unary::ResolveOperator): Same here.
16356
16357         (Unary::report23): Change name to error23 and make first argument a TypeContainer
16358         as I was getting thoroughly confused between this and error19 :-)
16359
16360         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
16361         (::FindMostEncompassedType): Implement.
16362         (::FindMostEncompassingType): Implement.
16363         (::StandardConversionExists): Implement.
16364
16365         (UserImplicitCast): Re-vamp. We now need info about most specific
16366         source and target types so that we can do the necessary conversions.
16367
16368         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
16369         mathematical union with no duplicates.
16370
16371 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16372
16373         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
16374         in order from base classes to child classes, so that we can in
16375         child classes look up in our parent for method names and
16376         attributes (required for handling abstract, virtual, new, override
16377         constructs: we need to instrospect our base class, and if we dont
16378         populate the classes in order, the introspection might be
16379         incorrect.  For example, a method could query its parent before
16380         the parent has any methods and would determine that the parent has
16381         no abstract methods (while it could have had them)).
16382
16383         (RootContext::CreateType): Record the order in which we define the
16384         classes.
16385
16386 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
16387
16388         * class.cs (TypeContainer::Populate): Also method definitions can
16389         fail now, keep track of this.
16390
16391         (TypeContainer::FindMembers): Implement support for
16392         DeclaredOnly/noDeclaredOnly flag.
16393
16394         (Constructor::Emit) Return the ConstructorBuilder.
16395
16396         (Method::Emit) Return the MethodBuilder. 
16397         Check for abstract or virtual methods to be public.
16398
16399         * rootcontext.cs (RootContext::CreateType): Register all the
16400         abstract methods required for the class to be complete and the
16401         interface methods that must be implemented. 
16402
16403         * cs-parser.jay: Report error 501 (method requires body if it is
16404         not marked abstract or extern).
16405
16406         * expression.cs (TypeOf::Emit): Implement.
16407
16408         * typemanager.cs: runtime_handle_type, new global type.
16409
16410         * class.cs (Property::Emit): Generate code for properties.
16411
16412 2001-10-02  Ravi Pratap  <ravi@ximian.com>
16413
16414         * expression.cs (Unary::ResolveOperator): Find operators on base type
16415         too - we now conform exactly to the spec.
16416
16417         (Binary::ResolveOperator): Same here.
16418
16419         * class.cs (Operator::Define): Fix minor quirk in the tests.
16420
16421         * ../errors/cs0215.cs : Added.
16422
16423         * ../errors/cs0556.cs : Added.
16424
16425         * ../errors/cs0555.cs : Added.
16426
16427 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16428
16429         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
16430         single integer which is really efficient
16431
16432 2001-10-01  Ravi Pratap  <ravi@ximian.com>
16433
16434         *  expression.cs (Expression::ImplicitUserConversion): Use location
16435         even in the case when we are examining True operators.
16436  
16437         * class.cs (Operator::Define): Perform extensive checks to conform
16438         with the rules for operator overloading in the spec.
16439
16440         * expression.cs (Expression::ImplicitReferenceConversion): Implement
16441         some of the other conversions mentioned in the spec.
16442
16443         * typemanager.cs (array_type): New static member for the System.Array built-in
16444         type.
16445
16446         (cloneable_interface): For System.ICloneable interface.
16447
16448         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
16449         we start resolving the tree and populating types.
16450
16451         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
16452  
16453 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16454
16455         * expression.cs (Expression::ExprClassFromMemberInfo,
16456         Expression::Literalize): Create literal expressions from
16457         FieldInfos which are literals.
16458
16459         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
16460         type casts, because they were wrong.  The test suite in tests
16461         caught these ones.
16462
16463         (ImplicitNumericConversion): ushort to ulong requires a widening
16464         cast. 
16465
16466         Int32 constant to long requires widening cast as well.
16467
16468         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
16469         for integers because the type on the stack is not i4.
16470
16471 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
16472
16473         * expression.cs (report118): require location argument. 
16474
16475         * parameter.cs: Do not dereference potential null value.
16476
16477         * class.cs: Catch methods that lack the `new' keyword when
16478         overriding a name.  Report warnings when `new' is used without
16479         anything being there to override.
16480
16481         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
16482
16483         * class.cs: Only add constructor to hashtable if it is non-null
16484         (as now constructors can fail on define).
16485
16486         (TypeManager, Class, Struct): Take location arguments.
16487
16488         Catch field instance initialization in structs as errors.
16489
16490         accepting_filter: a new filter for FindMembers that is static so
16491         that we dont create an instance per invocation.
16492
16493         (Constructor::Define): Catch errors where a struct constructor is
16494         parameterless 
16495
16496         * cs-parser.jay: Pass location information for various new
16497         constructs. 
16498
16499         * delegate.cs (Delegate): take a location argument.
16500
16501         * driver.cs: Do not call EmitCode if there were problesm in the
16502         Definition of the types, as many Builders wont be there. 
16503
16504         * decl.cs (Decl::Decl): Require a location argument.
16505
16506         * cs-tokenizer.cs: Handle properly hex constants that can not fit
16507         into integers, and find the most appropiate integer for it.
16508
16509         * literal.cs: Implement ULongLiteral.
16510
16511         * rootcontext.cs: Provide better information about the location of
16512         failure when CreateType fails.
16513
16514 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
16515
16516         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
16517         as well.
16518
16519         * expression.cs (Binary::CheckShiftArguments): Add missing type
16520         computation.
16521         (Binary::ResolveOperator): Add type to the logical and and logical
16522         or, Bitwise And/Or and Exclusive Or code paths, it was missing
16523         before.
16524
16525         (Binary::DoNumericPromotions): In the case where either argument
16526         is ulong (and most signed types combined with ulong cause an
16527         error) perform implicit integer constant conversions as well.
16528
16529 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16530
16531         * expression.cs (UserImplicitCast): Method should always be
16532         non-null. 
16533         (Invocation::BetterConversion): Simplified test for IntLiteral.
16534
16535         (Expression::ImplicitNumericConversion): Split this routine out.
16536         Put the code that performs implicit constant integer conversions
16537         here. 
16538
16539         (Expression::Resolve): Become a wrapper around DoResolve so we can
16540         check eclass and type being set after resolve.
16541
16542         (Invocation::Badness): Remove this dead function
16543
16544         (Binary::ResolveOperator): Do not compute the expensive argumnets
16545         unless we have a union for it.
16546
16547         (Probe::Emit): Is needs to do an isinst and then
16548         compare against null.
16549
16550         (::CanConvert): Added Location argument.  If the Location argument
16551         is null (Location.Null), then we do not report errors.  This is
16552         used by the `probe' mechanism of the Explicit conversion.  We do
16553         not want to generate an error for something that the user
16554         explicitly requested to be casted.  But the pipeline for an
16555         explicit cast first tests for potential implicit casts.
16556
16557         So for now, if the Location is null, it means `Probe only' to
16558         avoid adding another argument.   Might have to revise this
16559         strategy later.
16560
16561         (ClassCast): New class used to type cast objects into arbitrary
16562         classes (used in Explicit Reference Conversions).
16563
16564         Implement `as' as well.
16565
16566         Reverted all the patches from Ravi below: they were broken:
16567
16568                 * The use of `level' as a mechanism to stop recursive
16569                   invocations is wrong.  That was there just to catch the
16570                   bug with a strack trace but not as a way of addressing
16571                   the problem.
16572
16573                   To fix the problem we have to *understand* what is going
16574                   on and the interactions and come up with a plan, not
16575                   just get things going.
16576
16577                 * The use of the type conversion cache that I proposed
16578                   last night had an open topic: How does this work across
16579                   protection domains.  A user defined conversion might not
16580                   be public in the location where we are applying the
16581                   conversion, a different conversion might be selected
16582                   (ie, private A->B (better) but public B->A (worse),
16583                   inside A, A->B applies, but outside it, B->A will
16584                   apply).
16585
16586                 * On top of that (ie, even if the above is solved),
16587                   conversions in a cache need to be abstract.  Ie, `To
16588                   convert from an Int to a Short use an OpcodeCast', not
16589                   `To convert from an Int to a Short use the OpcodeCast on
16590                   the variable 5' (which is what this patch was doing).
16591
16592 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16593
16594         * expression.cs (Invocation::ConversionExists): Re-write to use
16595         the conversion cache
16596
16597         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
16598         cache all conversions done, not just user-defined ones.
16599
16600         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16601         to determine if a conversion exists instead of acutually trying to 
16602         perform the conversion. It's faster too.
16603
16604         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16605         and only then attempt the implicit conversion.
16606
16607 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16608
16609         * expression.cs (ConvertImplicit): Use a cache for conversions
16610         already found. Check level of recursion and bail out if necessary.
16611
16612 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16613
16614         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16615         Export standard methods that we expect for string operations.
16616
16617         * statement.cs (Block::UsageWarning): Track usage of variables and
16618         report the errors for not used variables.
16619
16620         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16621         operator. 
16622
16623 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16624
16625         * codegen.cs: remove unnneded code 
16626
16627         * expression.cs: Removed BuiltinTypeAccess class
16628
16629         Fix the order in which implicit conversions are
16630         done.  
16631
16632         The previous fixed dropped support for boxed conversions (adding a
16633         test to the test suite now)
16634
16635         (UserImplicitCast::CanConvert): Remove test for source being null,
16636         that code is broken.  We should not feed a null to begin with, if
16637         we do, then we should track the bug where the problem originates
16638         and not try to cover it up here.
16639
16640         Return a resolved expression of type UserImplicitCast on success
16641         rather than true/false.  Ravi: this is what I was talking about,
16642         the pattern is to use a static method as a "constructor" for
16643         objects. 
16644
16645         Also, do not create arguments until the very last minute,
16646         otherwise we always create the arguments even for lookups that
16647         will never be performed. 
16648
16649         (UserImplicitCast::Resolve): Eliminate, objects of type
16650         UserImplicitCast are born in a fully resolved state. 
16651
16652         * typemanager.cs (InitCoreTypes): Init also value_type
16653         (System.ValueType). 
16654
16655         * expression.cs (Cast::Resolve): First resolve the child expression.
16656
16657         (LValue): Add new method AddressOf to be used by
16658         the `&' operator.  
16659
16660         Change the argument of Store to take an EmitContext instead of an
16661         ILGenerator, because things like FieldExpr need to be able to call
16662         their children expression to generate the instance code. 
16663
16664         (Expression::Error, Expression::Warning): Sugar functions for
16665         reporting errors.
16666
16667         (Expression::MemberLookup): Accept a TypeContainer instead of a
16668         Report as the first argument.
16669
16670         (Expression::ResolvePrimary): Killed.  I still want to improve
16671         this as currently the code is just not right.
16672
16673         (Expression::ResolveMemberAccess): Simplify, but it is still
16674         wrong. 
16675
16676         (Unary::Resolve): Catch errors in AddressOf operators.
16677
16678         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16679         index to a byte for the short-version, or the compiler will choose
16680         the wrong Emit call, which generates the wrong data.
16681
16682         (ParameterReference::Emit, ::Store): same.
16683
16684         (FieldExpr::AddressOf): Implement.
16685
16686         * typemanager.cs: TypeManager: made public variable instead of
16687         property.
16688
16689         * driver.cs: document --fatal.
16690
16691         * report.cs (ErrorMessage, WarningMessage): new names for the old
16692         Error and Warning classes.
16693
16694         * cs-parser.jay (member_access): Turn built-in access to types
16695         into a normal simplename
16696
16697 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16698
16699         * expression.cs (Invocation::BetterConversion): Fix to cope
16700         with q being null, since this was introducing a bug.
16701
16702         * expression.cs (ConvertImplicit): Do built-in conversions first.
16703
16704 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16705
16706         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16707
16708 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16709
16710         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16711         I had introduced long ago (what's new ?).
16712
16713         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16714         the work of all the checking. 
16715         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16716         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16717
16718         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16719         that is the right way. 
16720
16721         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16722         overloading resolution. Use everywhere instead of cutting and pasting code.
16723
16724         (Binary::ResolveOperator): Use MakeUnionSet.
16725
16726         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16727         we have to convert to bool types. Not complete yet.
16728
16729 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16730
16731         * typemanager.cs (TypeManager::CSharpName): support ushort.
16732
16733         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16734         to provide an expression that performsn an implicit constant int
16735         conversion (section 6.1.6).
16736         (Expression::ConvertImplicitRequired): Reworked to include
16737         implicit constant expression conversions.
16738
16739         (Expression::ConvertNumericExplicit): Finished.
16740
16741         (Invocation::Emit): If InstanceExpression is null, then it means
16742         that we perform a call on this.
16743
16744 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16745
16746         * expression.cs (Unary::Emit): Remove some dead code.
16747         (Probe): Implement Resolve and Emit for `is'.
16748         (Expression::ConvertImplicitRequired): Attempt to do constant
16749         expression conversions here.  Maybe should be moved to
16750         ConvertImplicit, but I am not sure.
16751         (Expression::ImplicitLongConstantConversionPossible,
16752         Expression::ImplicitIntConstantConversionPossible): New functions
16753         that tell whether is it possible to apply an implicit constant
16754         expression conversion.
16755
16756         (ConvertNumericExplicit): Started work on explicit numeric
16757         conversions.
16758
16759         * cs-parser.jay: Update operator constants.
16760
16761         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16762         (Parameters::GetSignature): Hook up VerifyArgs here.
16763         (Parameters::VerifyArgs): Verifies that no two arguments have the
16764         same name. 
16765
16766         * class.cs (Operator): Update the operator names to reflect the
16767         ones that the spec expects (as we are just stringizing the
16768         operator names).
16769
16770         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16771         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16772         previous usage did only work for our methods.
16773         (Expression::ConvertImplicit): Handle decimal implicit numeric
16774         conversions as well.
16775         (Expression::InternalTypeConstructor): Used to invoke constructors
16776         on internal types for default promotions.
16777
16778         (Unary::Emit): Implement special handling for the pre/post
16779         increment/decrement for overloaded operators, as they need to have
16780         the same semantics as the other operators.
16781
16782         (Binary::ResolveOperator): ditto.
16783         (Invocation::ConversionExists): ditto.
16784         (UserImplicitCast::Resolve): ditto.
16785
16786 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16787
16788         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16789         operator, return after emitting body. Regression tests pass again !
16790
16791         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16792         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16793         (Invocation::OverloadResolve): Ditto.
16794         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16795
16796         * everywhere : update calls to the above methods accordingly.
16797
16798 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16799
16800         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16801
16802         * expression.cs (ExpressionStatement): New base class used for
16803         expressions that can appear in statements, so that we can provide
16804         an alternate path to generate expression that do not leave a value
16805         on the stack.
16806
16807         (Expression::Emit, and all the derivatives): We no longer return
16808         whether a value is left on the stack or not.  Every expression
16809         after being emitted leaves a single value on the stack.
16810
16811         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16812         facilties of ExpressionStatement if possible.
16813
16814         * cs-parser.jay: Update statement_expression.
16815
16816 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16817
16818         * driver.cs: Change the wording of message
16819
16820 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16821
16822         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16823         the type of the expression to the return type of the method if
16824         we have an overloaded operator match ! The regression tests pass again !
16825         (Unary::ResolveOperator): Ditto.
16826
16827         * expression.cs (Invocation::ConversionExists): Correct the member lookup
16828         to find "op_Implicit", not "implicit" ;-)
16829         (UserImplicitCast): New class to take care of user-defined implicit conversions.
16830         (ConvertImplicit, ForceConversion): Take TypeContainer argument
16831
16832         * everywhere : Correct calls to the above accordingly.
16833
16834         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
16835         (ConvertImplicit): Do user-defined conversion if it exists.
16836
16837 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
16838
16839         * assign.cs: track location.
16840         (Resolve): Use implicit conversions on assignment.
16841
16842         * literal.cs: Oops.  Not good, Emit of short access values should
16843         pass (Bytes) or the wrong argument will be selected.
16844
16845         * expression.cs (Unary::Emit): Emit code for -expr.
16846
16847         (Unary::ResolveOperator): Handle `Substract' for non-constants
16848         (substract from zero from the non-constants).
16849         Deal with Doubles as well. 
16850
16851         (Expression::ConvertImplicitRequired): New routine that reports an
16852         error if no implicit conversion exists. 
16853
16854         (Invocation::OverloadResolve): Store the converted implicit
16855         expressions if we make them
16856
16857 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16858
16859         * class.cs (ConstructorInitializer): Take a Location argument.
16860         (ConstructorBaseInitializer): Same here.
16861         (ConstructorThisInitializer): Same here.
16862
16863         * cs-parser.jay : Update all calls accordingly.
16864
16865         * expression.cs (Unary, Binary, New): Take location argument.
16866         Update accordingly everywhere.
16867
16868         * cs-parser.jay : Update all calls to the above to take a location
16869         argument.
16870
16871         * class.cs : Ditto.
16872
16873 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16874
16875         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
16876         (Invocation::BetterConversion): Same here
16877         (Invocation::ConversionExists): Ditto.
16878
16879         (Invocation::ConversionExists): Implement.
16880
16881 2001-09-22  Ravi Pratap  <ravi@ximian.com>
16882
16883         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
16884         Also take an additional TypeContainer argument.
16885
16886         * All over : Pass in TypeContainer as argument to OverloadResolve.
16887
16888         * typemanager.cs (CSharpName): Update to check for the string type and return
16889         that too.
16890
16891         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
16892         a given method.
16893
16894 2001-09-21  Ravi Pratap  <ravi@ximian.com>
16895
16896         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
16897         (Invocation::BetterFunction): Implement.
16898         (Invocation::BetterConversion): Implement.
16899         (Invocation::ConversionExists): Skeleton, no implementation yet.
16900
16901         Okay, things work fine !
16902
16903 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
16904
16905         * typemanager.cs: declare and load enum_type, delegate_type and
16906         void_type. 
16907
16908         * expression.cs (Expression::Emit): Now emit returns a value that
16909         tells whether a value is left on the stack or not.  This strategy
16910         might be reveted tomorrow with a mechanism that would address
16911         multiple assignments.
16912         (Expression::report118): Utility routine to report mismatches on
16913         the ExprClass.
16914
16915         (Unary::Report23): Report impossible type/operator combination
16916         utility function.
16917
16918         (Unary::IsIncrementableNumber): Whether the type can be
16919         incremented or decremented with add.
16920         (Unary::ResolveOperator): Also allow enumerations to be bitwise
16921         complemented. 
16922         (Unary::ResolveOperator): Implement ++, !, ~,
16923
16924         (Invocation::Emit): Deal with new Emit convetion.
16925
16926         * All Expression derivatives: Updated their Emit method to return
16927         whether they leave values on the stack or not.
16928
16929         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
16930         stack for expressions that are statements. 
16931
16932 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16933
16934         * expression.cs (LValue): New interface.  Must be implemented by
16935         LValue objects.
16936         (LocalVariableReference, ParameterReference, FieldExpr): Implement
16937         LValue interface.
16938
16939         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
16940         interface for generating code, simplifies the code.
16941
16942 2001-09-20  Ravi Pratap  <ravi@ximian.com>
16943
16944         * expression.cs (everywhere): Comment out return statements in ::Resolve
16945         methods to avoid the warnings.
16946
16947 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16948
16949         * driver.cs (parse): Report error 2001 if we can not open the
16950         source file.
16951
16952         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
16953         not resolve it.
16954
16955         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
16956         object. 
16957
16958         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
16959         otherwise nested blocks end up with the same index.
16960
16961         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
16962
16963         * expression.cs:  Instead of having FIXMEs in the Resolve
16964         functions, throw exceptions so it is obvious that we are facing a
16965         bug. 
16966
16967         * cs-parser.jay (invocation_expression): Pass Location information.
16968
16969         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
16970         Use a basename for those routines because .NET does not like paths
16971         on them. 
16972
16973         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
16974         already defined.
16975
16976 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
16977
16978         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
16979         are loading the correct data types (throws an exception if not).
16980         (TypeManager::InitCoreTypes): Use CoreLookupType
16981
16982         * expression.cs (Unary::ResolveOperator): return the child
16983         expression for expressions which are just +expr.
16984         (Unary::ResolveOperator): Return negative literals for -LITERAL
16985         expressions (otherwise they are Unary {Literal}).
16986         (Invocation::Badness): Take into account `Implicit constant
16987         expression conversions'.
16988
16989         * literal.cs (LongLiteral): Implement long literal class.
16990         (IntLiteral): export the `Value' of the intliteral. 
16991
16992 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16993
16994         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16995
16996         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16997         instead of 'Operator'
16998
16999         * expression.cs (Binary::ResolveOperator): Update accordingly.
17000         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
17001         and 'Minus'
17002
17003         * cs-parser.jay (unary_expression): Update to use the new names.
17004
17005         * gen-treedump.cs (GetUnary): Same here.
17006
17007         * expression.cs (Unary::Resolve): Implement.
17008         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
17009         operators are found instead of making noise ;-)
17010         (Unary::ResolveOperator): New method to do precisely the same thing which
17011         Binary::ResolveOperator does for Binary expressions.
17012         (Unary.method, .Arguments): Add.
17013         (Unary::OperName): Implement.   
17014         (Unary::ForceConversion): Copy and Paste !
17015
17016         * class.cs (Operator::Define): Fix a small bug for the case when we have 
17017         a unary operator.
17018
17019         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
17020         for the inbuilt operators. Only overloading works for now ;-)
17021
17022 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
17023
17024         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
17025         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
17026
17027         * expression.cs (This::Emit): Implement. 
17028         (This::Resolve): Implement.
17029         (TypeOf:Resolve): Implement.
17030         (Expression::ResolveSimpleName): Add an implicit this to instance
17031         field references. 
17032         (MemberAccess::Resolve): Deal with Parameters and Fields. 
17033         Bind instance variable to Field expressions.
17034         (FieldExpr::Instance): New field used to track the expression that
17035         represents the object instance.
17036         (FieldExpr::Resolve): Track potential errors from MemberLookup not
17037         binding 
17038         (FieldExpr::Emit): Implement.
17039
17040         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
17041         the last instruction contains a return opcode to avoid generating
17042         the last `ret' instruction (this generates correct code, and it is
17043         nice to pass the peverify output).
17044
17045         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
17046         initializer for static and instance variables.
17047         (Constructor::Emit): Allow initializer to be null in the case of
17048         static constructors.  Only emit initializer for instance
17049         constructors. 
17050
17051         (TypeContainer::FindMembers): Return a null array if there are no
17052         matches.
17053
17054         Also fix the code for the MemberTypes.Method branch, as it was not
17055         scanning that for operators (or tried to access null variables before).
17056
17057         * assign.cs (Assign::Emit): Handle instance and static fields. 
17058
17059         * TODO: Updated.
17060
17061         * driver.cs: Stop compilation if there are parse errors.
17062
17063         * cs-parser.jay (constructor_declaration): Provide default base
17064         initializer for non-static constructors.
17065         (constructor_declarator): Do not provide a default base
17066         initializers if none was specified.
17067         Catch the fact that constructors should not have parameters.
17068
17069         * class.cs: Do not emit parent class initializers for static
17070         constructors, that should be flagged as an error.
17071
17072 2001-09-18  Ravi Pratap  <ravi@ximian.com>
17073
17074         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
17075         Move back code into TypeContainer::Populate.
17076
17077 2001-09-18  Ravi Pratap  <ravi@ximian.com>
17078
17079         * class.cs (TypeContainer::AddConstructor): Fix the check to
17080         compare against Name, not Basename. 
17081         (Operator::OpType): Change Plus and Minus to Add and Subtract.
17082
17083         * cs-parser.jay : Update accordingly.
17084
17085         * class.cs (TypeContainer::FindMembers): For the case where we are searching
17086         for methods, don't forget to look into the operators too.
17087         (RegisterMethodBuilder): Helper method to take care of this for
17088         methods, constructors and operators.
17089         (Operator::Define): Completely revamp.
17090         (Operator.OperatorMethod, MethodName): New fields.
17091         (TypeContainer::Populate): Move the registering of builders into
17092         RegisterMethodBuilder.
17093         (Operator::Emit): Re-write.
17094
17095         * expression.cs (Binary::Emit): Comment out code path to emit method
17096         invocation stuff for the case when we have a user defined operator. I am
17097         just not able to get it right !
17098
17099 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
17100
17101         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
17102         argument. 
17103
17104         (Expression::MemberLookup): Provide a version that allows to
17105         specify the MemberTypes and BindingFlags. 
17106
17107         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
17108         so it was not fetching variable information from outer blocks.
17109
17110         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
17111         Beforefieldinit as it was buggy.
17112
17113         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
17114         that Ravi put here.  
17115
17116         * class.cs (Constructor::Emit): Only emit if block is not null.
17117         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
17118         deal with this by semantically definining it as if the user had
17119         done it.
17120
17121         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
17122         constructors as we now "emit" them at a higher level.
17123
17124         (TypeContainer::DefineDefaultConstructor): Used to define the
17125         default constructors if none was provided.
17126
17127         (ConstructorInitializer): Add methods Resolve and Emit. 
17128
17129         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
17130
17131 2001-09-17  Ravi Pratap  <ravi@ximian.com>
17132
17133         * class.cs (TypeContainer::EmitDefaultConstructor): Register
17134         the default constructor builder with our hashtable for methodbuilders
17135         to methodcores.
17136
17137         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
17138         and argument_count is 0 in which case we have a match.
17139         (Binary::ResolveOperator): More null checking and miscellaneous coding
17140         style cleanup.
17141
17142 2001-09-17  Ravi Pratap  <ravi@ximian.com>
17143
17144         * rootcontext.cs (IsNameSpace): Compare against null.
17145
17146         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
17147
17148         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
17149         and Unary::Operator.
17150
17151         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
17152         accordingly.
17153
17154         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
17155         we have overloaded operators.
17156         (Binary::ResolveOperator): Implement the part which does the operator overload
17157         resolution.
17158
17159         * class.cs (Operator::Emit): Implement.
17160         (TypeContainer::Emit): Emit the operators we have too.
17161
17162         * expression.cs (Binary::Emit): Update to emit the appropriate code for
17163         the case when we have a user-defined operator.
17164
17165 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
17166
17167         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
17168
17169 2001-09-16  Ravi Pratap  <ravi@ximian.com>
17170
17171         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
17172         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
17173         (Constructor::Emit): Implement.
17174         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
17175         if we have no work to do. 
17176         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
17177         Emit method.
17178
17179         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
17180         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
17181
17182         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
17183         of parent.parent.
17184
17185 2001-09-15  Ravi Pratap  <ravi@ximian.com>
17186
17187         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
17188         in the source.
17189         (Tree::RecordNamespace): Method to do what the name says ;-)
17190         (Tree::Namespaces): Property to get at the namespaces hashtable.
17191
17192         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
17193         keep track.
17194
17195         * rootcontext.cs (IsNamespace): Fixed it :-)
17196
17197 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
17198
17199         * class.cs (TypeContainer::FindMembers): Add support for
17200         constructors. 
17201         (MethodCore): New class that encapsulates both the shared aspects
17202         of a Constructor and a Method.  
17203         (Method, Constructor): Factored pieces into MethodCore.
17204
17205         * driver.cs: Added --fatal which makes errors throw exceptions.
17206         Load System assembly as well as part of the standard library.
17207
17208         * report.cs: Allow throwing exceptions on errors for debugging.
17209
17210         * modifiers.cs: Do not use `parent', instead use the real type
17211         container to evaluate permission settings.
17212
17213         * class.cs: Put Ravi's patch back in.  He is right, and we will
17214         have to cope with the
17215
17216 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17217
17218         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
17219         FamORAssem, not FamANDAssem.
17220
17221 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
17222
17223         * driver.cs: Added --parse option that only parses its input files
17224         and terminates.
17225
17226         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
17227         incorrect.  IsTopLevel is not used to tell whether an object is
17228         root_types or not (that can be achieved by testing this ==
17229         root_types).  But to see if this is a top-level *class* (not
17230         necessarly our "toplevel" container). 
17231
17232 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17233
17234         * enum.cs (Enum::Define): Modify to call the Lookup method on the
17235         parent instead of a direct call to GetType.
17236
17237 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17238
17239         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
17240         Modifiers.TypeAttr. This should just be a call to that method.
17241
17242         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
17243         object so that we can determine if we are top-level or not.
17244
17245         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
17246         TypeContainer too.
17247
17248         * enum.cs (Enum::Define): Ditto.
17249
17250         * modifiers.cs (FieldAttr): Re-write.
17251
17252         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
17253         (TypeContainer::HaveStaticConstructor): New property to provide access
17254         to precisely that info.
17255
17256         * modifiers.cs (MethodAttr): Re-write.
17257         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
17258
17259         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
17260         of top-level types as claimed.
17261
17262 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17263
17264         * expression.cs (MemberLookup): Fruitless attempt to lookup
17265         constructors.  Maybe I need to emit default constructors?  That
17266         might be it (currently .NET emits this for me automatically).
17267         (Invocation::OverloadResolve): Cope with Arguments == null.
17268         (Invocation::EmitArguments): new function, shared by the new
17269         constructor and us.
17270         (Invocation::Emit): Handle static and instance methods.  Emit
17271         proper call instruction for virtual or non-virtual invocations.
17272         (New::Emit): Implement.
17273         (New::Resolve): Implement.
17274         (MemberAccess:Resolve): Implement.
17275         (MethodGroupExpr::InstanceExpression): used conforming to the spec
17276         to track instances.
17277         (FieldExpr::Resolve): Set type.
17278
17279         * support.cs: Handle empty arguments.
17280                 
17281         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
17282         SimpleLookup): Auxiliary routines to help parse a qualifier
17283         identifier.  
17284
17285         Update qualifier_identifier rule.
17286
17287         * codegen.cs: Removed debugging messages.
17288
17289         * class.cs: Make this a global thing, this acts just as a "key" to
17290         objects that we might have around.
17291
17292         (Populate): Only initialize method_builders_to_methods once.
17293
17294         * expression.cs (PropertyExpr): Initialize type from the
17295         PropertyType. 
17296
17297         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
17298         Resolve pattern.  Attempt to implicitly convert value to boolean.
17299         Emit code.
17300
17301         * expression.cs: Set the type for the int32/int32 argument case.
17302         (Binary::ResolveOperator): Set the return type to boolean for
17303         comparission operators
17304
17305         * typemanager.cs: Remove debugging print code.
17306
17307         (Invocation::Resolve): resolve type.
17308
17309         * class.cs: Allocate a MemberInfo of the correct size, as the code
17310         elsewhere depends on the test to reflect the correct contents.
17311
17312         (Method::) Keep track of parameters, due to System.Reflection holes
17313
17314         (TypeContainer::Populate): Keep track of MethodBuilders to Method
17315         mapping here.
17316
17317         (TypeContainer::FindMembers): Use ArrayList and then copy an array
17318         of the exact size and return that.
17319
17320         (Class::LookupMethodByBuilder): New function that maps
17321         MethodBuilders to its methods.  Required to locate the information
17322         on methods because System.Reflection bit us again.
17323
17324         * support.cs: New file, contains an interface ParameterData and
17325         two implementations: ReflectionParameters and InternalParameters
17326         used to access Parameter information.  We will need to grow this
17327         as required.
17328
17329         * expression.cs (Invocation::GetParameterData): implement a cache
17330         and a wrapper around the ParameterData creation for methods. 
17331         (Invocation::OverloadResolve): Use new code.
17332
17333 2001-09-13  Ravi Pratap  <ravi@ximian.com>
17334
17335         * class.cs (TypeContainer::EmitField): Remove and move into 
17336         (Field::Define): here and modify accordingly.
17337         (Field.FieldBuilder): New member.
17338         (TypeContainer::Populate): Update accordingly.
17339         (TypeContainer::FindMembers): Implement.
17340
17341 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17342
17343         * statement.cs: (VariableInfo::VariableType): New field to be
17344         initialized with the full type once it is resolved. 
17345
17346 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
17347
17348         * parameter.cs (GetParameterInfo): Use a type cache to compute
17349         things only once, and to reuse this information
17350
17351         * expression.cs (LocalVariableReference::Emit): Implement.
17352         (OpcodeCast::Emit): fix.
17353
17354         (ParameterReference::Resolve): Implement.
17355         (ParameterReference::Emit): Implement.
17356
17357         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
17358         that are expressions need to stay as Expressions.
17359
17360         * typemanager.cs (CSharpName): Returns the C# name of a type if
17361         possible. 
17362
17363         * expression.cs (Expression::ConvertImplicit): New function that
17364         implements implicit type conversions.
17365
17366         (Expression::ImplicitReferenceConversion): Implements implicit
17367         reference conversions.
17368
17369         (EmptyCast): New type for transparent casts.
17370
17371         (OpcodeCast): New type for casts of types that are performed with
17372         a sequence of bytecodes.
17373
17374         (BoxedCast): New type used for casting value types into reference
17375         types.  Emits a box opcode.
17376
17377         (Binary::DoNumericPromotions): Implements numeric promotions of
17378         and computation of the Binary::Type.
17379
17380         (Binary::EmitBranchable): Optimization.
17381
17382         (Binary::Emit): Implement code emission for expressions.
17383
17384         * typemanager.cs (TypeManager): Added two new core types: sbyte
17385         and byte.
17386
17387 2001-09-12  Ravi Pratap  <ravi@ximian.com>
17388
17389         * class.cs (TypeContainer::FindMembers): Method which does exactly
17390         what Type.FindMembers does, only we don't have to use reflection. No
17391         implementation yet.
17392
17393         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
17394         typecontainer objects as we need to get at them.
17395         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
17396
17397         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
17398         typecontainer object.
17399
17400         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
17401         of just a Report object.
17402
17403 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17404
17405         * class.cs (Event::Define): Go back to using the prefixes "add_" and
17406         "remove_"
17407         (TypeContainer::Populate): Now define the delegates of the type too.
17408         (TypeContainer.Delegates): Property to access the list of delegates defined
17409         in the type.
17410
17411         * delegates.cs (Delegate::Define): Implement partially.
17412
17413         * modifiers.cs (TypeAttr): Handle more flags.
17414
17415 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17416
17417         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
17418         and not <=
17419         (Operator::Define): Re-write logic to get types by using the LookupType method
17420         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
17421         (Indexer::Define): Ditto.
17422         (Event::Define): Ditto.
17423         (Property::Define): Ditto.
17424
17425 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17426
17427         * class.cs (TypeContainer::Populate): Now define operators too. 
17428         (TypeContainer.Operators): New property to access the list of operators
17429         in a type.
17430         (Operator.OperatorMethodBuilder): New member to hold the method builder
17431         for the operator we are defining.
17432         (Operator::Define): Implement.
17433
17434 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17435
17436         * class.cs (Event::Define): Make the prefixes of the accessor methods
17437         addOn_ and removeOn_ 
17438
17439         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
17440         of the location being passed in too. Ideally, this should go later since all
17441         error reporting should be done through the Report object.
17442
17443         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
17444         (Populate): Iterate thru the indexers we have and define them too.
17445         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
17446         for the get and set accessors.
17447         (Indexer::Define): Implement.
17448
17449 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
17450
17451         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
17452         my previous implementation, did not work.
17453
17454         * typemanager.cs: Add a couple of missing types (the longs).
17455
17456         * literal.cs: Use TypeManager.bool_type instead of getting it.
17457
17458         * expression.cs (EventExpr): New kind of expressions.
17459         (Expressio::ExprClassFromMemberInfo): finish
17460
17461 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
17462
17463         * assign.cs: Emit stores to static fields differently.
17464
17465 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17466
17467         * Merge in changes and adjust code to tackle conflicts. Backed out my
17468         code in Assign::Resolve ;-) 
17469
17470 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17471
17472         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
17473         instead Report.Error and also pass in the location.
17474         (CSharpParser::Lexer): New readonly property to return the reference
17475         to the Tokenizer object.
17476         (declare_local_variables): Use Report.Error with location instead of plain 
17477         old error.
17478         (CheckDef): Ditto.
17479
17480         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
17481         (Operator.CheckBinaryOperator): Ditto.
17482
17483         * cs-parser.jay (operator_declarator): Update accordingly.
17484
17485         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
17486         (CheckBinaryOperator): Same here.
17487
17488         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
17489         on the name without any prefixes of namespace names etc. This is because we
17490         already might have something already fully qualified like 
17491         'System.Console.WriteLine'
17492
17493         * assign.cs (Resolve): Begin implementation. Stuck ;-)
17494
17495 2001-09-07  Ravi Pratap  <ravi@ximian.com>
17496
17497         * cs-tokenizer.cs (location): Return a string which also contains
17498         the file name.
17499
17500         * expression.cs (ElementAccess): New class for expressions of the
17501         type 'element access.'
17502         (BaseAccess): New class for expressions of the type 'base access.'
17503         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
17504         respectively.
17505
17506         * cs-parser.jay (element_access): Implement action.
17507         (base_access): Implement actions.
17508         (checked_expression, unchecked_expression): Implement.
17509
17510         * cs-parser.jay (local_variable_type): Correct and implement.
17511         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
17512
17513         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
17514
17515         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
17516         name and the specifiers.
17517
17518         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
17519
17520         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
17521         making them all public ;-)
17522
17523         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
17524         class anyways.
17525
17526 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
17527
17528         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
17529         PropertyExprs.
17530         (FieldExpr, PropertyExprs): New resolved expressions.
17531         (SimpleName::MemberStaticCheck): Perform static checks for access
17532         to non-static fields on static methods. Maybe this should be
17533         generalized for MemberAccesses. 
17534         (SimpleName::ResolveSimpleName): More work on simple name
17535         resolution. 
17536
17537         * cs-parser.jay (primary_expression/qualified_identifier): track
17538         the parameter index.
17539
17540         * codegen.cs (CodeGen::Save): Catch save exception, report error.
17541         (EmitContext::EmitBoolExpression): Chain to expression generation
17542         instead of temporary hack.
17543         (::EmitStatementExpression): Put generic expression code generation.
17544
17545         * assign.cs (Assign::Emit): Implement variable assignments to
17546         local variables, parameters and fields.
17547
17548 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
17549
17550         * statement.cs (Block::GetVariableInfo): New method, returns the
17551         VariableInfo for a variable name in a block.
17552         (Block::GetVariableType): Implement in terms of GetVariableInfo
17553
17554         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
17555         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
17556
17557 2001-09-06  Ravi Pratap  <ravi@ximian.com>
17558
17559         * cs-parser.jay (operator_declaration): Continue on my quest : update
17560         to take attributes argument.
17561         (event_declaration): Ditto.
17562         (enum_declaration): Ditto.
17563         (indexer_declaration): Ditto.
17564
17565         * class.cs (Operator::Operator): Update constructor accordingly.
17566         (Event::Event): Ditto.
17567
17568         * delegate.cs (Delegate::Delegate): Same here.
17569
17570         * enum.cs (Enum::Enum): Same here.
17571
17572 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17573
17574         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
17575
17576         * ../tests/cs0658.cs : New file to demonstrate error 0658.
17577
17578         * attribute.cs (Attributes): New class to encapsulate all attributes which were
17579         being passed around as an arraylist.
17580         (Attributes::AddAttribute): Method to add attribute sections.
17581
17582         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
17583         (struct_declaration): Update accordingly.
17584         (constant_declaration): Update.
17585         (field_declaration): Update.
17586         (method_header): Update.
17587         (fixed_parameter): Update.
17588         (parameter_array): Ditto.
17589         (property_declaration): Ditto.
17590         (destructor_declaration): Ditto.
17591
17592         * class.cs (Struct::Struct): Update constructors accordingly.
17593         (Class::Class): Ditto.
17594         (Field::Field): Ditto.
17595         (Method::Method): Ditto.
17596         (Property::Property): Ditto.
17597         (TypeContainer::OptAttribute): update property's return type.
17598
17599         * interface.cs (Interface.opt_attributes): New member.
17600         (Interface::Interface): Update to take the extra Attributes argument.
17601
17602         * parameter.cs (Parameter::Parameter): Ditto.
17603
17604         * constant.cs (Constant::Constant): Ditto.
17605
17606         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17607         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17608         the attributes as a parameter.
17609         (InterfaceProperty): Update constructor call.
17610         (InterfaceEvent): Ditto.
17611         (InterfaceMethod): Ditto.
17612         (InterfaceIndexer): Ditto.
17613
17614         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17615         pass the attributes too.
17616         (interface_event_declaration): Ditto.
17617         (interface_property_declaration): Ditto.
17618         (interface_method_declaration): Ditto.
17619         (interface_declaration): Ditto.
17620
17621 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17622
17623         * class.cs (Method::Define): Track the "static Main" definition to
17624         create an entry point. 
17625
17626         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17627         EntryPoint if we find it. 
17628
17629         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17630         (EmitContext::ig): Make this variable public.
17631
17632         * driver.cs: Make the default output file be the first file name
17633         with the .exe extension.  
17634
17635         Detect empty compilations
17636
17637         Handle various kinds of output targets.  Handle --target and
17638         rename -t to --dumper.
17639
17640         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17641         methods inherited from Expression return now an Expression.  This
17642         will is used during the tree rewriting as we resolve them during
17643         semantic analysis.
17644
17645         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17646         the spec.  Missing entirely is the information about
17647         accessability of elements of it.
17648
17649         (Expression::ExprClassFromMemberInfo): New constructor for
17650         Expressions that creates a fully initialized Expression based on
17651         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17652         a Type.
17653
17654         (Invocation::Resolve): Begin implementing resolution of invocations.
17655
17656         * literal.cs (StringLiteral):  Implement Emit.
17657
17658 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17659
17660         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17661         member.
17662
17663 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17664
17665         * cs-parser.jay (attribute_arguments): Implement actions.
17666         (attribute): Fix bug in production. Implement action.
17667         (attribute_list): Implement.
17668         (attribute_target): Implement.
17669         (attribute_target_specifier, opt_target_specifier): Implement
17670         (CheckAttributeTarget): New method to check if the attribute target
17671         is valid.
17672         (attribute_section): Implement.
17673         (opt_attributes): Implement.
17674
17675         * attribute.cs : New file to handle attributes.
17676         (Attribute): Class to hold attribute info.
17677
17678         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17679         (attribute_section): Modify production to use 2 different rules to 
17680         achieve the same thing. 1 s/r conflict down !
17681         Clean out commented, useless, non-reducing dimension_separator rules.
17682
17683         * class.cs (TypeContainer.attributes): New member to hold list
17684         of attributes for a type.
17685         (Struct::Struct): Modify to take one more argument, the attribute list.
17686         (Class::Class): Ditto.
17687         (Field::Field): Ditto.
17688         (Method::Method): Ditto.
17689         (Property::Property): Ditto.
17690
17691         * cs-parser.jay (struct_declaration): Update constructor call to
17692         pass in the attributes too.
17693         (class_declaration): Ditto.
17694         (constant_declaration): Ditto.
17695         (field_declaration): Ditto.
17696         (method_header): Ditto.
17697         (fixed_parameter): Ditto.
17698         (parameter_array): Ditto.
17699         (property_declaration): Ditto.
17700
17701         * constant.cs (Constant::Constant): Update constructor similarly.
17702         Use System.Collections.
17703
17704         * parameter.cs (Parameter::Parameter): Update as above.
17705
17706 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17707
17708         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17709         (TypeContainer.delegates): New member to hold list of delegates.
17710
17711         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17712         this time as I seem to be on crack ;-)
17713
17714 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17715
17716         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17717         tell whether an identifier represents a namespace.
17718
17719         * expression.cs (NamespaceExpr): A namespace expression, used only
17720         temporarly during expression resolution.
17721         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17722         utility functions to resolve names on expressions.
17723
17724 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17725
17726         * codegen.cs: Add hook for StatementExpressions. 
17727
17728         * class.cs: Fix inverted test for static flag in methods.
17729
17730 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17731
17732         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17733         to make it coincide with MS' number.
17734         (Operator::CheckBinaryOperator): Ditto.
17735
17736         * ../errors/errors.txt : Remove error numbers added earlier.
17737
17738         * ../errors/cs1019.cs : Test case for error # 1019
17739
17740         * ../errros/cs1020.cs : Test case for error # 1020
17741
17742         * cs-parser.jay : Clean out commented cruft.
17743         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17744         used anywhere - non-reducing rule.
17745         (namespace_declarations): Non-reducing rule - comment out.
17746
17747         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17748         with TypeContainer::AddEnum.
17749
17750         * delegate.cs : New file for delegate handling classes.
17751         (Delegate): Class for declaring delegates.
17752
17753         * makefile : Update.
17754
17755         * cs-parser.jay (delegate_declaration): Implement.
17756
17757 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17758
17759         * class.cs (Event::Define): Implement.
17760         (Event.EventBuilder): New member.
17761
17762         * class.cs (TypeContainer::Populate): Update to define all enums and events
17763         we have.
17764         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17765         readonly fields for all these cases ?
17766
17767 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17768
17769         * class.cs (Property): Revamp to use the convention of making fields readonly.
17770         Accordingly modify code elsewhere.
17771
17772         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17773         the Define method of the Property class.
17774
17775         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17776         trivial bug.
17777         (TypeContainer::Populate): Update to define all the properties we have. Also
17778         define all enumerations.
17779
17780         * enum.cs (Define): Implement.
17781
17782 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17783
17784         * cs-parser.jay (overloadable_operator): The semantic value is an
17785         enum of the Operator class.
17786         (operator_declarator): Implement actions.
17787         (operator_declaration): Implement.
17788
17789         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17790         validity of definitions.
17791         (Operator::CheckBinaryOperator): Static method to check for binary operators
17792         (TypeContainer::AddOperator): New method to add an operator to a type.
17793
17794         * cs-parser.jay (indexer_declaration): Added line to actually call the
17795         AddIndexer method so it gets added ;-)
17796
17797         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17798         already taken care of by the MS compiler ?  
17799
17800 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17801
17802         * class.cs (Operator): New class for operator declarations.
17803         (Operator::OpType): Enum for the various operators.
17804
17805 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17806
17807         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17808         ostensibly handle this in semantic analysis.
17809
17810         * cs-parser.jay (general_catch_clause): Comment out
17811         (specific_catch_clauses, specific_catch_clause): Ditto.
17812         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17813         (catch_args, opt_catch_args): New productions.
17814         (catch_clause): Rewrite to use the new productions above
17815         (catch_clauses): Modify accordingly.
17816         (opt_catch_clauses): New production to use in try_statement
17817         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17818         and re-write the code in the actions to extract the specific and
17819         general catch clauses by being a little smart ;-)
17820
17821         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17822         Hooray, try and catch statements parse fine !
17823
17824 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17825
17826         * statement.cs (Block::GetVariableType): Fix logic to extract the type
17827         string from the hashtable of variables.
17828
17829         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
17830         I end up making that mistake ;-)
17831         (catch_clauses): Fixed gross error which made Key and Value of the 
17832         DictionaryEntry the same : $1 !!
17833
17834 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17835
17836         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
17837
17838         * cs-parser.jay (event_declaration): Correct to remove the semicolon
17839         when the add and remove accessors are specified. 
17840
17841 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17842
17843         * cs-parser.jay (IndexerDeclaration): New helper class to hold
17844         information about indexer_declarator.
17845         (indexer_declarator): Implement actions.
17846         (parsing_indexer): New local boolean used to keep track of whether
17847         we are parsing indexers or properties. This is necessary because 
17848         implicit_parameters come into picture even for the get accessor in the 
17849         case of an indexer.
17850         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
17851
17852         * class.cs (Indexer): New class for indexer declarations.
17853         (TypeContainer::AddIndexer): New method to add an indexer to a type.
17854         (TypeContainer::indexers): New member to hold list of indexers for the
17855         type.
17856
17857 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17858
17859         * cs-parser.jay (add_accessor_declaration): Implement action.
17860         (remove_accessor_declaration): Implement action.
17861         (event_accessors_declaration): Implement
17862         (variable_declarators): swap statements for first rule - trivial.
17863
17864         * class.cs (Event): New class to hold information about event
17865         declarations.
17866         (TypeContainer::AddEvent): New method to add an event to a type
17867         (TypeContainer::events): New member to hold list of events.
17868
17869         * cs-parser.jay (event_declaration): Implement actions.
17870
17871 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17872
17873         * cs-parser.jay (dim_separators): Implement. Make it a string
17874         concatenating all the commas together, just as they appear.
17875         (opt_dim_separators): Modify accordingly
17876         (rank_specifiers): Update accordingly. Basically do the same
17877         thing - instead, collect the brackets here.
17878         (opt_rank_sepcifiers): Modify accordingly.
17879         (array_type): Modify to actually return the complete type string
17880         instead of ignoring the rank_specifiers.
17881         (expression_list): Implement to collect the expressions
17882         (variable_initializer): Implement. We make it a list of expressions
17883         essentially so that we can handle the array_initializer case neatly too.
17884         (variable_initializer_list): Implement.
17885         (array_initializer): Make it a list of variable_initializers
17886         (opt_array_initializer): Modify accordingly.
17887
17888         * expression.cs (New::NType): Add enumeration to help us
17889         keep track of whether we have an object/delegate creation
17890         or an array creation.
17891         (New:NewType, New::Rank, New::Indices, New::Initializers): New
17892         members to hold data about array creation.
17893         (New:New): Modify to update NewType
17894         (New:New): New Overloaded contructor for the array creation
17895         case.
17896
17897         * cs-parser.jay (array_creation_expression): Implement to call
17898         the overloaded New constructor.
17899
17900 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
17901
17902         * class.cs (TypeContainer::Constructors): Return member
17903         constructors instead of returning null.
17904
17905 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
17906
17907         * typemanager.cs (InitCoreTypes): Initialize the various core
17908         types after we have populated the type manager with the user
17909         defined types (this distinction will be important later while
17910         compiling corlib.dll)
17911
17912         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
17913         on Expression Classification.  Now all expressions have a method
17914         `Resolve' and a method `Emit'.
17915
17916         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
17917         generation from working.     Also add some temporary debugging
17918         code. 
17919
17920 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
17921
17922         * codegen.cs: Lots of code generation pieces.  This is only the
17923         beginning, will continue tomorrow with more touches of polish.  We
17924         handle the fundamentals of if, while, do, for, return.  Others are
17925         trickier and I need to start working on invocations soon.
17926
17927         * gen-treedump.cs: Bug fix, use s.Increment here instead of
17928         s.InitStatement. 
17929
17930         * codegen.cs (EmitContext): New struct, used during code
17931         emission to keep a context.   Most of the code generation will be
17932         here. 
17933
17934         * cs-parser.jay: Add embedded blocks to the list of statements of
17935         this block.  So code generation proceeds in a top down fashion.
17936
17937 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
17938
17939         * statement.cs: Add support for multiple child blocks.
17940
17941 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
17942
17943         * codegen.cs (EmitCode): New function, will emit the code for a
17944         Block of code given a TypeContainer and its ILGenerator. 
17945
17946         * statement.cs (Block): Standard public readonly optimization.
17947         (Block::Block constructors): Link children. 
17948         (Block::Child): Child Linker.
17949         (Block::EmitVariables): Emits IL variable declarations.
17950
17951         * class.cs: Drop support for MethodGroups here, delay until
17952         Semantic Analysis.
17953         (Method::): Applied the same simplification that I did before, and
17954         move from Properties to public readonly fields.
17955         (Method::ParameterTypes): Returns the parameter types for the
17956         function, and implements a cache that will be useful later when I
17957         do error checking and the semantic analysis on the methods is
17958         performed.
17959         (Constructor::GetCallingConvention): Renamed from CallingConvetion
17960         and made a method, optional argument tells whether this is a class
17961         or a structure to apply the `has-this' bit.
17962         (Method::GetCallingConvention): Implement, returns the calling
17963         convention. 
17964         (Method::Define): Defines the type, a second pass is performed
17965         later to populate the methods.
17966
17967         (Constructor::ParameterTypes): implement a cache similar to the
17968         one on Method::ParameterTypes, useful later when we do semantic
17969         analysis. 
17970
17971         (TypeContainer::EmitMethod):  New method.  Emits methods.
17972
17973         * expression.cs: Removed MethodGroup class from here.
17974
17975         * parameter.cs (Parameters::GetCallingConvention): new method.
17976
17977 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
17978
17979         * class.cs (TypeContainer::Populate): Drop RootContext from the
17980         argument. 
17981
17982         (Constructor::CallingConvention): Returns the calling convention.
17983         (Constructor::ParameterTypes): Returns the constructor parameter
17984         types. 
17985
17986         (TypeContainer::AddConstructor): Keep track of default constructor
17987         and the default static constructor.
17988
17989         (Constructor::) Another class that starts using `public readonly'
17990         instead of properties. 
17991
17992         (Constructor::IsDefault): Whether this is a default constructor. 
17993
17994         (Field::) use readonly public fields instead of properties also.
17995
17996         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17997         track of static constructors;  If none is used, turn on
17998         BeforeFieldInit in the TypeAttributes. 
17999
18000         * cs-parser.jay (opt_argument_list): now the return can be null
18001         for the cases where there are no arguments. 
18002
18003         (constructor_declarator): If there is no implicit `base' or
18004         `this', then invoke the default parent constructor. 
18005
18006         * modifiers.cs (MethodAttr): New static function maps a set of
18007         modifiers flags into a MethodAttributes enum
18008         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
18009         MethodAttr, TypeAttr to represent the various mappings where the
18010         modifiers are used.
18011         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
18012
18013 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
18014
18015         * parameter.cs (GetParameterInfo): Fix bug where there would be no
18016         method arguments.
18017
18018         * interface.cs (PopulateIndexer): Implemented the code generator
18019         for interface indexers.
18020
18021 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
18022
18023         * interface.cs (InterfaceMemberBase): Now we track the new status
18024         here.  
18025
18026         (PopulateProperty): Implement property population.  Woohoo!  Got
18027         Methods and Properties going today. 
18028
18029         Removed all the properties for interfaces, and replaced them with
18030         `public readonly' fields. 
18031
18032 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
18033
18034         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
18035         initialize their hashtables/arraylists only when they are needed
18036         instead of doing this always.
18037
18038         * parameter.cs: Handle refs and out parameters.
18039
18040         * cs-parser.jay: Use an ArrayList to construct the arguments
18041         instead of the ParameterCollection, and then cast that to a
18042         Parameter[] array.
18043
18044         * parameter.cs: Drop the use of ParameterCollection and use
18045         instead arrays of Parameters.
18046
18047         (GetParameterInfo): Use the Type, not the Name when resolving
18048         types. 
18049
18050 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
18051
18052         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
18053         and instead use public readonly fields.
18054
18055         * class.cs: Put back walking code for type containers.
18056
18057 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
18058
18059         * class.cs (MakeConstant): Code to define constants.
18060
18061         * rootcontext.cs (LookupType): New function.  Used to locate types 
18062
18063
18064 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
18065
18066         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
18067         this System.Reflection code is.  Kudos to Microsoft
18068
18069         * typemanager.cs: Implement a type cache and avoid loading all
18070         types at boot time.  Wrap in LookupType the internals.  This made
18071         the compiler so much faster.  Wow.  I rule!
18072
18073         * driver.cs: Make sure we always load mscorlib first (for
18074         debugging purposes, nothing really important).
18075
18076         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
18077         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
18078
18079         * rootcontext.cs: Lookup types on their namespace;  Lookup types
18080         on namespaces that have been imported using the `using' keyword.
18081
18082         * class.cs (TypeContainer::TypeAttr): Virtualize.
18083         (Class::TypeAttr): Return attributes suitable for this bad boy.
18084         (Struct::TypeAttr): ditto.
18085         Handle nested classes.
18086         (TypeContainer::) Remove all the type visiting code, it is now
18087         replaced with the rootcontext.cs code
18088
18089         * rootcontext.cs (GetClassBases): Added support for structs. 
18090
18091 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
18092
18093         * interface.cs, statement.cs, class.cs, parameter.cs,
18094         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
18095         Drop use of TypeRefs, and use strings instead.
18096
18097 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
18098
18099         * rootcontext.cs: 
18100
18101         * class.cs (Struct::Struct): set the SEALED flags after
18102         checking the modifiers.
18103         (TypeContainer::TypeAttr): new property, returns the
18104         TypeAttributes for a class.  
18105
18106         * cs-parser.jay (type_list): Oops, list production was creating a
18107         new list of base types.
18108
18109         * rootcontext.cs (StdLib): New property.
18110         (GetInterfaceTypeByName): returns an interface by type name, and
18111         encapsulates error handling here.
18112         (GetInterfaces): simplified.
18113         (ResolveTree): Encapsulated all the tree resolution here.
18114         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
18115         types. 
18116
18117         * driver.cs: Add support for --nostdlib, to avoid loading the
18118         default assemblies.
18119         (Main): Do not put tree resolution here. 
18120
18121         * rootcontext.cs: Beginning of the class resolution.
18122
18123 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
18124
18125         * rootcontext.cs: Provide better error reporting. 
18126
18127         * cs-parser.jay (interface_base): set our $$ to be interfaces.
18128
18129         * rootcontext.cs (CreateInterface): Handle the case where there
18130         are no parent interfaces.
18131
18132         (CloseTypes): Routine to flush types at the end.
18133         (CreateInterface): Track types.
18134         (GetInterfaces): Returns an array of Types from the list of
18135         defined interfaces.
18136
18137         * typemanager.c (AddUserType): Mechanism to track user types (puts
18138         the type on the global type hash, and allows us to close it at the
18139         end). 
18140
18141 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
18142
18143         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
18144         RecordInterface instead.
18145
18146         * cs-parser.jay: Updated to reflect changes above.
18147
18148         * decl.cs (Definition): Keep track of the TypeBuilder type that
18149         represents this type here.  Not sure we will use it in the long
18150         run, but wont hurt for now.
18151
18152         * driver.cs: Smaller changes to accomodate the new code.
18153
18154         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
18155         when done. 
18156
18157         * rootcontext.cs (CreateInterface):  New method, used to create
18158         the System.TypeBuilder type for interfaces.
18159         (ResolveInterfaces): new entry point to resolve the interface
18160         hierarchy. 
18161         (CodeGen): Property, used to keep track of the code generator.
18162
18163 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
18164
18165         * cs-parser.jay: Add a second production for delegate_declaration
18166         with `VOID'.
18167
18168         (enum_body): Put an opt_comma here instead of putting it on
18169         enum_body or enum_member_declarations so we can handle trailing
18170         commas on enumeration members.  Gets rid of a shift/reduce.
18171
18172         (type_list): Need a COMMA in the middle.
18173
18174         (indexer_declaration): Tell tokenizer to recognize get/set
18175
18176         * Remove old targets.
18177
18178         * Re-add the parser target.
18179
18180 2001-07-13  Simon Cozens <simon@simon-cozens.org>
18181
18182         * cs-parser.jay: Add precendence rules for a number of operators
18183         ot reduce the number of shift/reduce conflicts in the grammar.
18184
18185 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
18186
18187         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
18188         and put it here.
18189
18190         Get rid of old crufty code.
18191
18192         * rootcontext.cs: Use this to keep track of the parsed
18193         representation and the defined types available to the program. 
18194
18195         * gen-treedump.cs: adjust for new convention.
18196
18197         * type.cs: Split out the type manager, and the assembly builder
18198         from here. 
18199
18200         * typemanager.cs: the type manager will live here now.
18201
18202         * cil-codegen.cs: And the code generator here. 
18203
18204 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
18205
18206         * makefile: Fixed up for easy making.
18207
18208 2001-07-13  Simon Cozens <simon@simon-cozens.org>
18209
18210         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
18211         the 
18212
18213         (unary_expression): Expand pre_increment_expression and
18214         post_decrement_expression to reduce a shift/reduce.
18215
18216 2001-07-11  Simon Cozens
18217
18218         * cs-tokenizer.cs: Hex numbers should begin with a 0.
18219
18220         Improve allow_keyword_as_indent name.
18221
18222 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
18223
18224         * Adjustments for Beta2. 
18225
18226 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
18227
18228         * decl.cs: Added `Define' abstract method.
18229         (InTransit): new property, used to catch recursive definitions. 
18230
18231         * interface.cs: Implement `Define'. 
18232
18233         * modifiers.cs: Map Modifiers.constants to
18234         System.Reflection.TypeAttribute flags.
18235
18236         * class.cs: Keep track of types and user-defined types.
18237         (BuilderInit): New method for creating an assembly
18238         (ResolveType): New function to launch the resolution process, only
18239         used by interfaces for now.
18240
18241         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
18242         that are inserted into the name space. 
18243
18244 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
18245
18246         * ARGH.  I have screwed up my tree so many times due to the use of
18247         rsync rather than using CVS.  Going to fix this at once. 
18248
18249         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
18250         load types.
18251
18252 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
18253
18254         * Experiment successful: Use System.Type rather that our own
18255         version of Type.  
18256
18257 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
18258
18259         * cs-parser.jay: Removed nsAliases from here.
18260
18261         Use new namespaces, handle `using XXX;' 
18262
18263         * namespace.cs: Reimplemented namespace handling, use a recursive
18264         definition of the class.  Now we can keep track of using clauses
18265         and catch invalid using clauses.
18266
18267 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
18268
18269         * gen-treedump.cs: Adapted for all the renaming.
18270
18271         * expression.cs (Expression): this class now has a Type property
18272         which returns an expression Type.
18273
18274         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
18275         `Type', as this has a different meaning now in the base
18276
18277 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
18278
18279         * interface.cs, class.cs: Removed from all the sources the
18280         references to signature computation, as we can not do method
18281         signature computation during the parsing time, as we are not
18282         trying to solve at that point distinguishing:
18283
18284         class X {
18285                 void a (Blah x) {}
18286                 void a (NS.Blah x) {}
18287         }
18288
18289         Which depending on the context might be valid or not, as we do not
18290         know if Blah is the same thing as NS.Blah at that point.
18291
18292         * Redid everything so the code uses TypeRefs now instead of
18293         Types.  TypeRefs are just temporary type placeholders, that need
18294         to be resolved.  They initially have a pointer to a string and the
18295         current scope in which they are used.  This is used later by the
18296         compiler to resolve the reference to an actual Type. 
18297
18298         * DeclSpace is no longer a CIR.Type, and neither are
18299         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
18300         are all DeclSpaces, but no Types. 
18301
18302         * type.cs (TypeRefManager): This implements the TypeRef manager,
18303         which keeps track of all the types that need to be resolved after
18304         the parsing has finished. 
18305
18306 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
18307
18308         * ARGH.  We are going to have to store `foreach' as a class rather
18309         than resolving it, as we need to verify error 1579 after name
18310         resolution.   *OR* we could keep a flag that says `This request to
18311         IEnumerator comes from a foreach statement' which we can then use
18312         to generate the error.
18313
18314 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
18315
18316         * class.cs (TypeContainer.AddMethod): we now add methods to the
18317         MethodGroup instead of the method hashtable.  
18318
18319         * expression.cs: Add MethodGroup abstraction, which gets us one
18320         step closer to the specification in the way we handle method
18321         declarations.  
18322
18323         * cs-parser.jay (primary_expression): qualified_identifier now
18324         tried to match up an identifier to a local variable reference or
18325         to a parameter reference.
18326
18327         current_local_parameters is now a parser global variable that
18328         points to the current parameters for the block, used during name
18329         lookup.
18330
18331         (property_declaration): Now creates an implicit `value' argument to
18332         the set accessor.
18333
18334 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
18335
18336         * parameter.cs: Do not use `param' arguments as part of the
18337         signature, per the spec.
18338
18339 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
18340
18341         * decl.cs: Base class for classes, structs and interfaces.  This
18342         is the "Declaration Space" 
18343
18344         * cs-parser.jay: Use CheckDef for checking declaration errors
18345         instead of having one on each function.
18346
18347         * class.cs: Factor out some code for handling error handling in
18348         accordance to the "Declarations" section in the "Basic Concepts"
18349         chapter in the ECMA C# spec.
18350
18351         * interface.cs: Make all interface member classes derive from
18352         InterfaceMemberBase.
18353
18354 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
18355
18356         * Many things: all interfaces are parsed and generated in
18357         gen-treedump.  Support for member variables, constructors,
18358         destructors, properties, constants is there.
18359
18360         Beginning of the IL backend, but very little done, just there for
18361         testing purposes. 
18362
18363 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
18364
18365         * cs-parser.jay: Fix labeled statement.
18366
18367         * cs-tokenizer.cs (escape): Escape " and ' always.
18368         ref_line, ref_name: keep track of the line/filename as instructed
18369         by #line by the compiler.
18370         Parse #line.
18371
18372 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
18373
18374         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
18375         to match the values in System.CodeDOM.
18376
18377         Divid renamed to Divide.
18378
18379         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
18380         statements. 
18381         (Statements.set): remove.
18382
18383         * System.CodeDOM/CodeCatchClause.cs: always have a valid
18384         statements. 
18385
18386         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
18387         falseStatements always have valid values. 
18388
18389         * cs-parser.jay: Use System.CodeDOM now.
18390