Remove debugging comment
[mono.git] / mcs / mcs / ChangeLog
1 2005-02-11  Miguel de Icaza  <miguel@novell.com>
2
3         * codegen.cs (EmitContext): Introduce the `MethodIsStatic'
4         variable.  This one is represents the actual low-level declaration
5         of the method, as opposed to the semantic level `IsStatic'.   
6
7         An anonymous method which is hosted into a static method might be
8         actually an instance method.  IsStatic would reflect the
9         container, while MethodIsStatic represents the actual code
10         generated.
11
12         * expression.cs (ParameterReference): Use the new MethodIsStatic
13         instead of IsStatic.
14
15         * anonymous.cs (AnonymousMethod.Compatible): Pass the
16         Modifiers.STATIC to the Anonymous' Method EmitContext if static is
17         set on the current EmitContext. 
18
19         * expression.cs (Cast): Overload DoResolveLValue so we can pass
20         resolve our casted expression as an LValue.  This triggers the
21         proper LValue processing that is later required by Assign.
22
23         This fixes 72347.
24
25         * cs-tokenizer.cs (pp_and): recurse on pp_and, fixes #61903.
26
27 2005-02-11  Marek Safar  <marek.safar@seznam.cz>
28
29         C# 2.0 Fixed buffer implementation
30
31         * anonymous.cs: Update after RegisterHelperClass renaming.
32
33         * attribute.cs (AttributeTester.fixed_buffer_cache):
34         Cache of external fixed buffers.
35         (AttributeTester.GetFixedBuffer): Returns IFixedBuffer
36         implementation if field is fixed buffer else null.
37
38         * class.cs
39         (TypeContainer.AddField): Accept FieldMember instead of Field.
40         (FieldBase.IsFieldClsCompliant): Extracted code from
41         VerifyClsCompliance descendant customization.
42         (FixedField): New class handles fixed buffer fields.
43         (FixedFieldExternal): Keeps information about imported fixed
44         buffer.
45         (IFixedField): Make access to internal or external fixed buffer
46         same.
47
48         * cs-parser.jay: Add fixed buffer parsing.
49
50         * ecore.cs (FieldExpr.Emit): Add special emit case for fixed
51         buffer.
52
53         * expression.cs (Indirection): Extended implementation to accept
54         fixed buffer field.
55         (PointerArithmetic.Emit): Get element from fixed buffer as well.
56         (ElementAccess.MakePointerAccess): Get type as parameter.
57         (DoResolve): Add fixed buffer field expression conversion.
58         (DoResolveLValue): Ditto.
59         (FixedBufferPtr): New class. Moved most of original ArrayPtr.
60         (ArrayPtr): Derives from FixedBufferPtr.
61         (ArrayPtr.Emit): Add extra emit for array elements.
62
63         * flowanalysis.cs.cs (StructInfo): Use FieldMember.
64
65         * rootcontext.cs (CloseTypes): Emit CompilerGenerated attribute
66         for compiler generated types.
67         (RegisterCompilerGeneratedType): Renamed from RegisterHelperClass.
68
69         * statement.cs (Fixed): Refactored to be easier add fixed buffer
70         and consume less memory.
71         (Fixed.Resolve): Add fixed buffer case.
72
73         * typemanager.cs (compiler_generated_attr_ctor,
74         fixed_buffer_attr_ctor): Add new 2.0 compiler attributes.
75         (HasElementType): Add our own implementation to work on every
76         runtime.
77
78 2005-02-11  Miguel de Icaza  <miguel@novell.com>
79
80         * anonymous.cs (CaptureContext): Track whether `this' has been
81         referenced.   
82
83         * expression.cs (This.ResolveBase): Call CaptureThis.  Before we
84         only captured `this' if it was implicitly done (instance
85         methods/variables were used). 
86
87         * codegen.cs (EmitContext.CaptureThis): New method to flag that
88         `this' must be captured.
89
90 2005-01-30  Miguel de Icaza  <miguel@novell.com>
91  
92         * anonymous.cs (CreateMethodHost): If there Scope.ScopeTypeBuilder
93         is null it means that there has been no need to capture anything,
94         so we just create a sibling.
95
96         Renamed `EmitHelperClasses' to `EmitAnonymousHelperClasses'
97
98         Just a partial fix.  The other half is fairly elusive.
99         
100 2005-02-10  Raja R Harinath  <rharinath@novell.com>
101
102         Fix #52586, cs0121-4.cs.
103         * decl.cs (MemberCache.DeepCopy): Rename from SetupCache.  Take
104         and return a hashtable.
105         (MemberCache.ClearDeclaredOnly): New.
106         (MemberCache.MemberCache): Update to change.  Make a deep copy of
107         the method_hash of a base type too.
108         (MemberCache.AddMethods): Adapt to having a deep copy of the base
109         type methods.  Overwrite entries with the same MethodHandle so
110         that the ReflectedType is correct.  The process leaves in base
111         virtual functions and their overrides as distinct entries.
112         (CacheEntry): Now a class instead of a struct.  It shouldn't alter
113         matters since it was boxed in a ArrayList before.
114         (CacheEntry.Member, CacheEntry.EntryType): Remove 'readonly'
115         modifier.
116         * expression.cs (Invocation.BetterFunction): Simplify.  Handle the
117         case of a virtual function and its override (choose the overload
118         as better).
119         (Invocation.OverloadResolve): Avoid 'override' members during
120         'applicable_type' calculation.
121
122 2005-02-09  Raja R Harinath  <rharinath@novell.com>
123
124         Combine two near-redundant caches.
125         * typemanager.cs (method_params): Rename from method_internal_params.
126         (TypeManager.GetParameterData): New.  Replace
127         Invocation.GetParameterData.
128         (TypeManager.LookupParametersByBuilder): Remove.
129         * expression.cs (Invocation.method_parameter_cache): Remove.
130         (Invocation.GetParameterData): Remove.
131         Update to changes.
132         * anonymous.cs, attribute.cs, convert.cs, delegate.cs:
133         Update to changes.
134
135 2005-02-08  Raja R Harinath  <rharinath@novell.com>
136
137         Fix #72015.
138         * delegate.cs (Delegate.DefineType): When bootstrapping corlib, if
139         TypeManager.multicast_delegate_type is null, resolve it by looking
140         up "System.MulticastDelegate".
141         * rootcontext.cs (RootContext.ResolveCore): Simplify.
142
143 2005-02-07  Abin Thomas (NOSIP)  <projectmonokochi@rediffmail.com>
144             Anoob V.E (NOSIP)  <projectmonokochi@rediffmail.com>
145             Harilal P.R (NOSIP)  <projectmonokochi@rediffmail.com>
146
147         Fix cs0164.cs.
148         * statement.cs (LabeledStatement.Resolve): Don't set 'referenced'.
149         (LabeledStatement.AddReference): New.  Set 'referenced'.
150         (Goto.Resolve): Use it.
151
152 2005-02-05  John Luke  <john.luke@gmail.com>
153
154         * driver.cs: remove duplicate -doc line in Usage ()
155
156 2005-02-04  Raja R Harinath  <rharinath@novell.com>
157
158         * location.cs (Location.AddFile): Fix CS2002 error report.
159
160 2005-02-02  Martin Baulig  <martin@ximian.com>
161
162         * delegate.cs (Delegate.DefineType): Report an internal error if
163         TypeManager.multicast_delegate_type is null.  See bug #72015 for
164         details.        
165
166 2005-02-02  Raja R Harinath  <rharinath@novell.com>
167
168         Fix a crasher in a variant of #31984.
169         * const.cs (Constant.CheckBase): New override that defers the
170         new-or-override check in case the base type hasn't been populated
171         yet.
172         (Constant.Define): Ensure the new-or-override check is performed.
173
174 2005-02-01  Duncan Mak  <duncan@ximian.com>
175
176         * const.cs (LookupConstantValue): Check that `ce' is not null
177         before calling GetValue ().
178
179 2005-02-01  Raja R Harinath  <rharinath@novell.com>
180
181         Fix test-334.cs (#69519).
182         * cs-parser.jay (using_alias_directive): Pass in an expression to
183         NamespaceEntry.UsingAlias.
184         (using_namespace_directive): Pass in an expression to
185         NamespaceEntry.Using.
186         (namespace_name): Don't flatten to a string.
187         * namespace.cs (NamespaceEntry.AliasEntry): Store an expression.
188         (NamespaceEntry.AliasEntry.Resolve): Lookup using
189         ResolveAsTypeStep.
190         (NamespaceEntry.UsingEntry): Likewise.
191         (NamespaceEntry.Using,NamespaceEntry.UsingAlias): Update to
192         changes.
193         (NamespaceEntry.LookupForUsing): Remove.
194         (NamespaceEntry.LookupNamespaceOrType): Add support for dotted
195         names.
196         (NamespaceEntry.Lookup): Remove support for dotted names.
197
198 2005-02-01  Raja R Harinath  <rharinath@novell.com>
199
200         * namespace.cs (NamespaceEntry.NamespaceEntry): Simplify, and
201         split into two.
202         (NamespaceEntry.ImplicitParent): Compute on demand.
203         (NamespaceEntry.Doppelganger): New implicit namespace-entry that
204         parallels the current.
205         (NamespaceEntry.LookupForUsing): Use it.
206         (NamespaceEntry.Lookup): If the current namespace-entry is
207         implicit, don't search aliases and using tables.
208
209 2005-02-01  Raja R Harinath  <rharinath@novell.com>
210
211         Fix #31984.
212         * class.cs (TypeContainer.DoDefineMembers): Don't initialize
213         BaseCache here.
214         (TypeContainer.BaseCache): Compute on demand.
215         (TypeContainer.FindMembers): Define constants and types if they're
216         not already created.
217         (FieldMember.Define): Move resetting of ec.InUnsafe before error
218         check.
219         * const.cs (Constant.Define): Make idempotent.
220
221 2005-01-29  Miguel de Icaza  <miguel@novell.com>
222
223         * pending.cs: Produce better code (no nops produced by using Ldarg
224         + value).
225         
226         * pending.cs (PendingImplementation.DefineProxy): It was not `arg
227         i - 1' it should be arg + 1.
228
229         Fixes bug #71819.
230
231 2005-01-28  Raja R Harinath  <rharinath@novell.com>
232
233         * attribute.cs (Attribute.CheckAttributeType): Make private
234         non-virtual.
235         (Attribute.ResolveType): Make virtual.
236         (GlobalAttribute.ResolveType,GlobalAttribute.Resolve): Simplify
237         handling of RootContext.Tree.Types.
238
239 2005-01-27  Raja R Harinath  <rharinath@novell.com>
240
241         Update attribute-handling to use the SimpleName/MemberAccess
242         mechanisms.
243         * cs-parser.jay (attribute): Pass in an expression to the
244         constructors of Attribute and GlobalAttribute.
245         * attribute.cs (Attribute): Take an expression for the name.
246         (Attribute.ResolvePossibleAttributeTypes): New.  Resolves the
247         passed in attribute name expression.
248         (Attribute.CheckAttributeType): Use it.
249         * ecore.cs (FullNamedExpression.ResolveAsTypeStep): New.
250         * expression.cs (MemberAccess.ResolveAsTypeStep): Move body to ...
251         (MemberAccess.ResolveNamespaceOrType): ... here.  Add 'silent'
252         argument to prevent error messages if the lookup fails.
253
254 2005-01-27  Marek Safar  <marek.safar@seznam.cz>
255
256         * expression.cs (Indirection): Implemented IVariable interface
257         to support indirection in AddressOf operator.
258         (PointerArithmetic.Emit): Add optimalization for case where
259         result can be precomputed.
260
261 2005-01-26  Martin Baulig  <martin@ximian.com>
262
263         * class.cs (TypeContainer.AttributeTargets): Return the correct
264         AttributeTargets depending on our `Kind' instead of throwing an
265         exception; fixes #71632.
266
267 2005-01-26  Marek Safar  <marek.safar@seznam.cz>
268
269         Fix #71257
270         * expression.cs (MemberAccess.ResolveMemberAccess): Add CS0176 test for
271         constant members.
272
273 2005-01-25  Raja R Harinath  <rharinath@novell.com>
274
275         Fix #71602.
276         * expression.cs (MemberAccess.DoResolve): Don't complain with
277         cs0572 when the LHS of a member access has identical name and type
278         name.
279
280 2005-01-25  Marek Safar  <marek.safar@seznam.cz>
281
282         Fix #71651, #71675
283         * attribute.cs (ExtractSecurityPermissionSet): Catch exceptions from
284         CreatePermission.
285         Create custom PermissionSet only for PermissionSetAttribute.
286
287 2005-01-24  Marek Safar  <marek.safar@seznam.cz>
288
289         Fix #71649
290         * class.cs (StaticClass.DefineContainerMembers): Enable enums and
291         delegates in static class.
292
293 2005-01-24  Martin Baulig  <martin@ximian.com>
294
295         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
296         merging an implicit block, just use its reachability.
297
298         * statement.cs (Block.Resolve): Make the unreachable code check
299         work wrt. implicit blocks; see test-337 from #63842.
300
301 2005-01-21  Alp Toker  <alp@atoker.com>
302  
303         * cs-parser.jay: destructor_declaration's container is PartialContainer
304         not Class when partial types are used, so use Kind prop instead of
305         'is'.
306         
307 2005-01-22  Miguel de Icaza  <miguel@ximian.com>
308
309         * cs-parser.jay: Improve error reporting when an interface
310         declares new types.
311
312 2005-01-20  Dick Porter  <dick@ximian.com>
313
314         * support.cs: SeekableStreamReader fix from Sandor Dobos
315         (dobos_s@ibcnet.hu) to cope with Position setting when multibyte
316         chars are read.  Fixes bug 70369.
317
318 2005-01-20  Raja R Harinath  <rharinath@novell.com>
319
320         * cs-parser.jay (catch_clause): Simplify current_block handling
321         somewhat.
322
323 2005-01-17  Miguel de Icaza  <miguel@ximian.com>
324
325         * convert.cs (ImplicitStandardConversionExists): Synchronize the
326         code with ImplicitStandardConversion to handle the implicit
327         conversion of method groups into valid delegate invocations. 
328
329         The problem is that in parameter handling we were using this code
330         path.  Fixes bug #64698
331
332 2005-01-19  Raja R Harinath  <rharinath@novell.com>
333
334         * cs-parser.jay: Fix several infelicities.
335         - Avoid assigning to the parser value stack.  Code like 
336           '$3 = null' is unclean.  Synthesize a value for the code block
337           instead. 
338         - Avoid using oob_stack for storing location information.  Use ...
339         (_mark_): ... this.  New (empty) rule.  Saves the current location
340         in $$.
341         (foreach_statement): Avoid using oob_stack for current_block
342         handling.  Use technique used in for_statement and
343         using_statement.  Synthesize a value for the code block to store
344         additional intermediate information.
345
346 2005-01-13  Miguel de Icaza  <miguel@ximian.com>
347
348         * ecore.cs (IsAccessorAccessible): Accessibility to private fields
349         of a different type is only allowed to private fields of a
350         containing type, not on fields of a base class.
351
352         See test-174.cs and error cs0122-9.cs
353
354 2005-01-13  Raja R Harinath  <rharinath@novell.com>
355
356         Fix test-335.cs (bug #58126).
357         * cs-parser.jay (argument): Split out non-expression parts of the
358         rule into 'non_simple_argument'.
359         (invocation_expression): Support parenthesized invocations with
360         multiple arguments, and with single non-simple arguments.
361
362 2005-01-13  Raja R Harinath  <rharinath@novell.com>
363
364         * cs-tokenizer.cs (xtoken): Reset 'comments_seen' in a couple more
365         places.
366
367 2005-01-12  Raja R Harinath  <rharinath@novell.com>
368
369         Fix cs0038-1.cs, cs1640-6.cs.
370         * ecore.cs (Expression.Resolve): Remove special-case for
371         SimpleName in error-handling.
372         (Expression.almostMatchedMembers): Relax access permission to
373         protected.
374         (Expression.MemberLookupFailed): Handle duplicates in
375         almostMatchedMembers list.
376         (SimpleName.DoSimpleNameResolve): Catch CS0038 errors earlier.
377         * expression.cs (New.DoResolve): Report CS1540 for more cases.
378         * typemanager.cs (GetFullNameSignature): Use the MethodBase
379         overload if the passed in MemberInfo is a MethodBase.
380
381 2005-01-12  Marek Safar  <marek.safar@seznam.cz>
382
383         Fix #70749
384         * attribute.cs (ExtractSecurityPermissionSet): Don't report error
385         for non-CAS & merge permission sets properly.
386
387 2005-01-11  Raja R Harinath  <rharinath@novell.com>
388
389         Improve standard-compliance of simple name and member access 
390         resolution.  Fixes bugs #52697, #57200, #67520, #69519.
391         * ecore.cs (FullNamedExpression): New abstract base class 
392         for Namespaces and TypeExpressions.
393         (ResolveFlags.SimpleName): Remove.
394         (SimpleName): Remove support for dotted names.
395         (SimpleName.ResolveAsTypeStep): Simplify.  Now just a wrapper to 
396         DeclSpace.FindType and DeclSpace.LookupType.
397         (SimpleName.DoSimpleNameResolve): Remove support for dotted names.
398         (Expression.ExprClassName): Make member function.
399         * expression.cs (MemberAccess.ResolveAsTypeStep): Support LHS being
400         a namespace.  Remove creation of dotted "SimpleName"s.
401         (MemberAccess.DoResolve): Likewise.
402         * decl.cs (DeclSpace.Cache): Make private.
403         (DeclSpace.LookupInterfaceOrClass): Return a FullNamedExpression.
404         (DeclSpace.FindType): Update.
405         (DeclSpace.LookupType): Move here from RootContext.  Return a 
406         FullNamedExpression.
407         * namespace.cs (Namespace): Derive from FullNamedExpression
408         so that it can be part of expression resolution.
409         (Namespace.Lookup): Return an FullNamedExpression.
410         (NamespaceEntry.LookupAlias): Lookup aliases only in current
411         namespace.
412         * rootcontext.cs (NamespaceLookup): Remove.
413         (LookupType): Move to DeclSpace.
414         * attribute.cs (CheckAttributeType): Update.
415         * doc.cs (FindDocumentedType): Remove allowAlias argument.
416         (FindDocumentedTypeNonArray): Likewise.
417
418 2005-01-11  Raja R Harinath  <rharinath@novell.com>
419
420         Fix cs0509.cs, cs1632.cs.
421         * class.cs (TypeContainer.GetNormalBases): Don't assume !IsClass
422         is the same as IsInterface.
423         (TypeContainer.GetClassBases): Likewise.
424         * statement.cs (LabeledStatement.ig): New field.
425         (LabeledStatement.LabelTarget): Save ILGenerator which created the
426         label.
427         (LabeledStatement.DoEmit): Check that the label was created with
428         the same ILGenerator.
429
430 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
431
432         Fix #71058
433         * attribute.cs (GetMethodObsoleteAttribute): Need to transform
434         accessors to its properties.
435
436         * ecore.cs (PropertyExpr): Add AccessorTable to help track back
437         from accessors to property.
438         
439 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
440
441         Fix #70722
442         * class.cs (MethodCore.CheckBase): Test base method obsoleteness
443         only for overrides.
444         
445 2005-01-08  Miguel de Icaza  <miguel@ximian.com>
446
447         * attribute.cs: Check for null and empty strings.  
448
449         I have lost another battle to Paolo.
450
451 2005-01-07  Marek Safar  <marek.safar@seznam.cz>
452
453         Fix #70942
454         * class.cs (PropertyMethod): Set Parent field in ctors.
455         (SetMethod.InternalParameters): Add unsafe switch hack.
456         Override MarkForDuplicationCheck where it is appropriate.
457
458         * decl.cs (MemberCore.MarkForDuplicationCheck): New method.
459         It says whether container allows members with the same name.
460         Base default is no.
461         (DeclSpace.AddToContainer): Use MarkForDuplicationCheck.
462         Removed is_method parameter.
463
464 2005-01-06  Duncan Mak  <duncan@ximian.com>
465
466         * cs-tokenizer.cs (xtoken): Redo the work for signaling CS1040
467         because the previous change led to incorrect reporting of CS1032
468         ("Cannot define/undefine preprocessor symbols after first token in
469         file"). Instead of using `tokens_seen' as the only flag that
470         triggers CS1040, introduce `comments_seen'. This new flag is used
471         to signify having seen comments on the current line, so it is
472         unset after a newline.
473
474 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
475
476         * doc.cs : When searching for a type, find nested type too.
477           This fixes bug #71040.
478
479 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
480
481         * doc.cs :
482           - Warn missing member comment on those classes which also does not
483             have doc comments. Fixed bug #71041.
484           - Don't warn missing doc comment on default constructor.
485             Fixed bug #71042.
486
487 2005-01-06  Duncan Mak  <duncan@ximian.com>
488
489         * cs-tokenizer.cs (xtoken): After handling traditional C-style
490         comments, set `tokens_seen' to true. This allows us to detect
491         misplaced preprocessor directives (i.e. not at the beginning of
492         the a line, nor after whitespaces). In that case, report error
493         CS1040. This fixes bug #56460.
494
495         * cs-parser.jay (interface_member_declaration): Add checks for
496         IsExplicitImpl, and report CS0541 error if an interface member is
497         defined as an explicit interface declaration.
498
499 2005-01-06  Marek Safar  <marek.safar@seznam.cz>
500
501         Fix #70817
502         * class.cs (PropertyMethod): Set Parent field in ctors.
503         (SetMethod.InternalParameters): Add unsafe switch hack.
504         
505         * decl.cs (MemberCore.Parent): Cannot be readonly.
506
507 2005-01-06  Raja R Harinath  <rharinath@novell.com>
508
509         * decl.cs (DeclSpace.ResolveType): Remove.
510         (DeclSpace.ResolveBaseTypeExpr): Rename from ResolveTypeExpr.
511         Merge in code from ...
512         (DeclSpace.GetTypeResolvingEmitContext): ... here.  Remove.
513         * class.cs, enum.cs: Update to changes.
514
515 2005-01-06  Miguel de Icaza  <miguel@ximian.com>
516
517         * anonymous.cs: Ensure that we init the scope of our parent if it
518         has not been initialized yet.
519
520 2004-12-30  Duncan Mak  <duncan@ximian.com>
521
522         * typemanager.cs (TypeManager.CheckStructCycles): Don't crash here
523         if field.FieldBuilder is null. Fixes #70758.
524
525         * convert.cs: Fixed some typos and updated some of the comments.
526         (ImplicitStandardConversionExists):
527         (TryImplicitIntConversion): If `target_type' is an interface and
528         the type of `ic' implements this interface, return true or a new
529         BoxedCast instead of null. This fixes #70468.
530
531 2004-12-29  Duncan Mak  <duncan@ximian.com>
532
533         * expression.cs (Argument.Emit): Check that Expr is
534         IMemoryLocation before casting to it, and report CS1510 otherwise.
535
536         This fixes #70402.
537
538 2004-12-21  Ben Maurer  <bmaurer@ximian.com>
539
540         * statement.cs (Block.ThisVariable): remove the recursion here, to
541         make the --profile more sane.
542
543 2004-12-17  Carlos Cortez <calberto.cortez@gmail.com>
544
545         * driver.cs: Patch to handle a xsp bug that prevents to reference an .exe
546         assembly, by JB Evain.
547
548 2004-12-17  Raja R Harinath  <rharinath@novell.com>
549
550         * class.cs, decl.cs, ecore.cs, iterators.cs, pending.cs, 
551           rootcontext.cs, typemanager.cs: Make nomenclature consistent.
552         "parent" refers to enclosing type/class.  "base" refers to superclass.
553
554 2004-12-17  Raja R Harinath  <rharinath@novell.com>
555
556         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
557         Ensure that we only have GlobalAttributes.
558         * attribute.cs (Attribute.Emit): Make non-virtual.
559         (GlobalAttribute.Emit): Remove.
560         (Attribute.Resolve): Make virtual.
561         (GlobalAttribute.Resolve): New.  Set Rootcontext.Tree.Types.NamespaceEntry.
562         (Attribute.GetConditionalAttributeValue): Take an EmitContext as
563         the argument. Don't create one.
564         (Attribute.GetObsoleteAttribute): Likewise.
565         (Attribute.GetClsCompliantAttributeValue): Likewise.
566         * class.cs, decl.cs: Update to changes.
567
568 2004-12-17  Marek Safar  <marek.safar@seznam.cz>
569
570         * delegate.cs (NewDelegate.DoResolve): Add error 149 report.
571         
572         * ecore.cs (Expression.MemberLookupFailed): Fixed error 143.
573         
574         * statement.cs (Foreach.Resolve): Add error 186 report.
575
576 2004-12-16  Marek Safar  <marek.safar@seznam.cz>
577
578         * expression.cs (Conditional.DoResolve): Add warning 429.
579         
580         * statement.cs (If.Resolve): Add warning 665.
581
582 2004-12-16  Raja R Harinath  <rharinath@novell.com>
583
584         New invariant: RootContext.Tree.Types.NamespaceEntry == null
585         except when in the parser, and in GlobalAttribute.
586         * driver.cs (MainDriver): Reset RootContext.Tree.Types.NamespaceEntry.
587         * attribute.cs (GlobalAttribute.CheckAttributeType): Reset
588         RootContext.Tree.Types.NamespaceEntry once work is done.
589         (GlobalAttribute.Emit): New.  Wrapper for Attribute.Emit, but sets
590         and resets RootContext.Tree.Types.NamespaceEntry.
591
592 2004-12-15  Marek Safar  <marek.safar@seznam.cz>
593
594         * cs-parser.jay: Don't create a block for every variable.
595
596 2004-12-14  Miguel de Icaza  <miguel@ximian.com>
597
598         * location.cs: Provide extra information.
599
600         * statement.cs: The instance is not `ldarg_0.THIS' when accessing
601         variables from the captured environment, it is the ldarg_0.
602
603 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
604
605         * cs-parser.jay: Changed warning level for 642 to 4 until Miguel
606         find a conclusion.
607         
608         * class.cs: Changed warning level for 169 to avoid developer
609         displeasure from warning flooding. It will be changed back when they
610         fix most of current BCL warnings.
611         
612         * RootContext.cs: Pushed default WarningLevel to 3.
613         
614         * statement.cs: Removed unused variable.
615
616 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
617
618         * class.cs (TypeContainer.GetClassBases): Add error 1521 report.
619         (TypeContainer.MethodModifiersValid): Refactored to use MemberCore.
620         Add error 502 report.
621         (StaticClass.DefineType): Add error 441 report.
622         (Class.AllowedModifiersProp): New virtual property as temporary
623         extension to AllowedModifiers.
624         (Class.DefineType): Add error 418 report. Moved ModFlags check here
625         to share implementation with StaticClass and don't call virtual
626         methods from ctor.
627         
628         * driver.cs (MainDriver): Add error 1558 test.
629
630         * parameter.cs (Parameter.ApplyAttributeBuilder): Add error 662
631         report. Moved error 36 test here.
632
633         * statement.cs (Throw.Resolve): Add error 724 report.
634
635         * typemanager.cs: Add out_attribute_type core type.
636         
637 2004-12-13  Marek Safar  <marek.safar@seznam.cz>
638
639         * class.cs (TypeContainer.VerifyClsCompliance): Add error
640         3018 report.
641         (PropertyBase.VerifyClsCompliance): Add errror 3025 report.
642
643         * codegen.cs (ModuleClass.ApplyAttributeBuilder): Add error
644         3017 report.
645         
646         * decl.cs (MemberCore.VerifyClsCompliance): Add warning 3021.
647
648         * parameter.cs (ReturnParameter.ApplyAttributeBuilder): 
649         Add error 3023 report.
650         (Parameter.ApplyAttributeBuilder): Add error 3022 report.
651
652         * tree.cs (RootTypes.IsClsCompliaceRequired): Add fake
653         implementation.
654
655 2004-12-12  John Luke  <john.luke@gmail.com>
656
657         * driver.cs (AddArgs): take -- into account when
658         adding arguments, fixes bug 65710 
659
660 2004-12-12  Martin Baulig  <martin@ximian.com>
661
662         * expression.cs (Unary.TryReduceNegative): Added support for
663         SByteConstant and ByteConstant.
664         (Unary.Reduce): Check error values from TryReduceNegative().
665
666 2004-12-10  Marek Safar  <marek.safar@seznam.cz>
667
668         * attributes.cs (Attribute.Resolve): Avoid multiple error report
669         and report exception as error 182.
670
671 2004-12-10  Raja R Harinath  <rharinath@novell.com>
672
673         * driver.cs (Main): Fix message when there are warnings.
674
675 2004-12-09  Miguel de Icaza  <miguel@ximian.com>
676
677         * delegate.cs: Fixed my fix from yesterday, sorry about that.
678
679 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
680
681         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
682         Reduced number of warnings.
683         
684         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
685
686 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
687
688         * driver.cs: Removed message.
689
690         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
691
692 2004-12-08    <vargaz@freemail.hu>
693
694         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
695
696 2004-12-08  Martin Baulig  <martin@ximian.com>
697
698         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
699         instead of a CS3002 for properties and indexer.
700
701 2004-12-08  Martin Baulig  <martin@ximian.com>
702
703         * decl.cs (MemberName.ToString): Make this work again.
704
705 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
706
707         * attribute.cs (Resolve): Add error 591 detection.
708
709         * class.cs (FieldMember.Define): Add error 1547 detection.
710         (Indexer.Define): Add error 620 detection.
711         (Operator.Define): Add error 590 detection.
712
713         * ecore.cs: Missing argument for error 79.
714
715         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
716         detection.
717
718 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
719
720         Fix #70106
721         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
722         only.
723
724 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
725
726         * cs-parser.jay : handle doc comments on implicit/explicit operators.
727           Some operator comments were suppressed.
728         * doc.cs : Implicit/explicit operator name in doc comments are like
729           "op_Explicit(type)~returnType", so added suffix handling.
730
731 2004-12-07  Martin Baulig  <martin@ximian.com>
732
733         * decl.cs
734         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
735         (MemberCore.GetClsCompliantAttributeValue): Likewise.
736         (DeclSpace.ec): New protected field; store the EmitContext here.
737         (DeclSpace.EmitContext): New public property; moved here from
738         `TypeContainer'.
739         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
740         EmitContext.
741
742         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
743         (Enum.Emit): Don't create a new EmitContext.
744
745         * delegate.cs (Delegate.DefineType): Always create the
746         EmitContext.
747
748         * iterators.cs (Iterators.DefineIterator): Create a new
749         EmitContext and store it in `ec'.
750
751 2004-08-24  Martin Baulig  <martin@ximian.com>
752
753         * typemanager.cs
754         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
755         this for accessibility checks.
756         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
757         IsNestedFamilyAccessible.
758         (TypeManager.IsSubclassOf): New method, do what the name actually
759         says.   
760
761 2004-12-06  Raja R Harinath  <rharinath@novell.com>
762
763         Fix crash on cs0657-17.cs.
764         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
765         Use RootContext.Tree.Types, not 'new RootTypes ()'.
766         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
767         the case where the NamespaceEntry gets overwritten.
768
769 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
770
771         Fixed #69195, #56821
772         * ecore.cs (ResolveBoolean): Tiny refactoring.
773
774         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
775         of right expression resolving when left is false constant and
776         operator is LogicalAnd OR true constant and operator is LogicalOr.
777
778         * statement.cs (ResolveUnreachable): Always reports warning.
779
780 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
781
782         * class.cs: Distinguish between 1721 and 1722 (just a little help
783         for the programmer).
784
785 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
786
787         * delegate.cs: Only allow this on new versions of the language. 
788
789 2004-12-02  Duncan Mak  <duncan@ximian.com>
790
791         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
792         Expression class.
793         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
794         here as a static method. Take an additional bool out parameter
795         `must_do_cs1540_check' for signaling to InstanceResolve.
796         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
797         member field from PropertyExpr class and made it an argument of
798         the method instead.
799         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
800         check for MarshalByRefObject, and report CS0122 instead of CS1540.
801         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
802         and `remove_accessor' as well as InstanceResolve: report CS0122
803         where applicable.
804
805         Fixes #70129.
806
807 2004-12-03  Raja R Harinath  <rharinath@novell.com>
808
809         Fix test-327.cs, test-328.cs, and put in early infrastructure
810         for eventually fixing #52697.
811         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
812         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
813         from other methods.
814         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
815         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
816         (VerifyUsing, error246): Update.
817         * rootcontext.cs (RootContext.NamespaceLookup): Just use
818         'NamespaceEntry.LookupNamespaceOrType'.
819
820 2004-12-03  Martin Baulig  <martin@ximian.com>
821
822         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
823         method as our child, call AnonymousMethod.Compatible() on it.
824
825 2004-12-03  Raja R Harinath  <rharinath@novell.com>
826
827         Disable XML documentation support in 'basic' profile.
828         * decl.cs, class.cs [BOOTSTRAP_WITH_OLDLIB]: Don't import System.Xml.
829         Redirect XmlElement to System.Object.
830         * driver.cs, enum.cs, rootcontext.cs: Don't reference System.Xml.
831         * doc.cs [BOOTSTRAP_WITH_OLDLIB]: Disable compile.
832         * mcs.exe.sources: Add doc-bootstrap.cs.
833         * doc-bootstrap.cs: New file.  Contains empty stub implementation
834         of doc.cs.
835
836 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
837
838         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
839           comments are allowed.
840
841 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
842
843         * delegate.cs: Add checks for subtypes in paramaters and return values
844         in VerifyMethod () to add support for Covariance/Contravariance
845         in delegates.
846         
847 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
848
849         * report.cs: Remove extra closing parenthesis.
850
851         * convert.cs (Error_CannotImplicitConversion): If the name of the
852         types are the same, provide some extra information.
853
854         * class.cs (FieldBase): Use an unused bit field from the field to
855         encode the `has_offset' property from the FieldMember.  This saves
856         a couple of Ks on bootstrap compilation.
857
858         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
859         method as our child, return the AnonymousMethod resolved
860         expression.
861
862         * expression.cs (New.DoResolve): Allow return values from
863         NewDelegate to also include AnonymousMethods.
864
865         Fixes #70150.
866
867 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
868
869         Fix bug #70102
870         * attribute.cs (Resolve): Improved implementation of params
871         attribute arguments.
872
873         * support.cs (ParameterData): Add HasParams to be faster.
874
875 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
876
877         all things are for /doc support:
878
879         * doc.cs: new file that supports XML documentation generation.
880         * mcs.exe.sources: added doc.cs.
881         * driver.cs:
882           Handle /doc command line option.
883           Report error 2006 instead of 5 for missing file name for /doc.
884           Generate XML documentation when required, after type resolution.
885         * cs-tokenizer.cs:
886           Added support for picking up documentation (/// and /** ... */),
887           including a new XmlCommentState enumeration.
888         * cs-parser.jay:
889           Added lines to fill Documentation element for field, constant,
890           property, indexer, method, constructor, destructor, operator, event
891           and class, struct, interface, delegate, enum.
892           Added lines to warn incorrect comment.
893         * rootcontext.cs :
894           Added Documentation field (passed only when /doc was specified).
895         * decl.cs:
896           Added DocComment, DocCommentHeader, GenerateDocComment() and
897           OnGenerateDocComment() and some supporting private members for
898           /doc feature to MemberCore.
899         * class.cs:
900           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
901         * delegate.cs:
902           Added overriden DocCommentHeader.
903         * enum.cs:
904           Added overriden DocCommentHeader and GenerateDocComment().
905
906 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
907
908         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
909         unwrapping the enumeration values, chain to
910         DoConstantNumericPromotions again, so we can promote things to the
911         fundamental types (takes care of enums that are bytes, sbytes).
912
913         Fixes bug #62054.
914
915 2004-12-01  Raja R Harinath  <rharinath@novell.com>
916
917         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
918         Fix long-standing bug in type-lookup.  Use FindType instead of
919         LookupType when ec.ResolvingTypeTree.
920         (Attribute.ResolveType, Attribute.Resolve)
921         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
922         Update to changes.
923         (Attributes.Search): Remove internal version.  Update.
924         (Attributes.SearchMulti): Update.
925         (Attributes.GetClsCompliantAttribute): Remove.
926         (Attributes.GetIndexerNameAttribute): Remove.
927         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
928         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
929         * class.cs (Indexer.Define): Likewise.
930
931 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
932
933         Fix bug #68790
934         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
935         MarshallByReference members access.
936
937         * expression.cs: Use CheckMarshallByRefAccess;
938         Better error CS0197 message.
939
940         * report.cs: Print whole related error message.
941
942 2004-11-30  Raja R Harinath  <rharinath@novell.com>
943
944         * Makefile (mcs.exe) [PROFILE=default]: Keep a copy of mcs.exe in
945         the current directory to help debugging.
946
947 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
948
949         * class (GetClassBases): Better error 60 report.
950         (EventProperty): Disabled warning 67 detection.
951
952 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
953
954         Fix bug #60324
955         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
956
957         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
958         precise values.
959
960 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
961
962         Fix bug #49488
963         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
964
965         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
966
967 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
968
969         * attribute.cs (Attribute.Resolve): Refine error reporting and
970         report a cs0117 if the identifier does not exist, to distinguish
971         from 0617 which is a miss-use of the actual identifier.
972
973         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
974         between cs0070 and cs0079.
975
976         * class.cs (MemberBase.DoDefine): When reporting a wrong
977         accessibility level, we use MethodCore to compare instead of
978         Method (this was a regression in some refactoring effort).
979
980         So now we correctly report cs0056 again.
981
982         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
983         testing the target_type (which was known to be object_type) and
984         not the source type (which is anonymous_method).
985
986         Fixed reporting of error cs1660.
987
988         * expression.cs (UserCast.Source): Expose the underlying cast.
989
990         * statement.cs (Switch.SwitchGoverningType): Sort the list of
991         allowed types to find a match to int32 first (most common).
992
993         In addition, it ignores any ImplicitUserConversions that did an
994         internal implicit conversion (as the switch statement allows only
995         one integral conversion to exist).
996
997         * class.cs (PartialContainer.Create): rename `name' to
998         `member_name' for clarity.  Then replace the string calls with a
999         call to MemberName.GetPartialName, as now using
1000         MemberName.ToString is an error (this is due to the side effects
1001         it had, that were fixed in the past).
1002
1003         This will restore the error reporting on a number of partial class
1004         errors that were missusing this (and getting an exception as a
1005         results, which is now just a plain textual warning, because
1006         yyparse debug output would crash otherwise).
1007
1008 2004-11-26  Raja R Harinath  <rharinath@novell.com>
1009
1010         * Makefile (PROGRAM_INSTALL_DIR): Remove.
1011
1012 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
1013
1014         * rootcontext.cs (LookupType): Make sure to cache lookups that
1015         don't give us a negative result. This saves about 5% of corlib
1016         compilation time.
1017
1018 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
1019
1020         * report.cs (AbstractMessage.Print): messages are sent to stderr
1021
1022         * class.cs (TypeContainer.GetClassBases): It is an error to have a
1023         non-interface in the list of interfaces (at this point, either
1024         parent was properly set, or a base class is being listed in the
1025         interfaces section).
1026
1027         This flags error 1722, and resolves the crash from bug 69259.
1028
1029 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
1030
1031         * statement.cs (Using.EmitExpressionFinally): make this work right
1032         for valuetypes. Fixes 69926.
1033
1034 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
1035
1036         * const.cs (Const.ChangeType): Cope with the "0 literal can be
1037         converted to an enum" here, before we try to change the underlying
1038         type.  This code exists, but it is a different code path than the
1039         one used while encoding constants.
1040
1041         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
1042         old bug: when converting from the null literal to a pointer,
1043         return an EmptyCast, not the NullLiteral.
1044
1045         This fixes #69921, the recent null_type changes probably made this
1046         bug more prominent.
1047
1048         (ImplicitReferenceConversionExists): In addition, resynchronized
1049         the code here, so it matches the same code in
1050         ImplicitReferenceConversionExists for the `from any class-type S
1051         to any interface-type T'.
1052         
1053
1054 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
1055
1056         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
1057
1058 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
1059
1060         * cs-parser.jay: Use verbosity accordingly. 
1061
1062 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
1063
1064         * expression.cs (Unary.ResolveOperator): Do not report warning;
1065         AddressOf reads from variable.
1066         
1067         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
1068
1069 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
1070
1071         Fix bug #69462
1072
1073         * attribute.cs (Attributable): Removed CheckTargets.
1074         (Attributes.Emit): Explicit attribute targets are tested here.
1075
1076         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
1077         not enabled for interfaces.
1078
1079         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
1080         (GetAssemblyName): Ouch next bug there.
1081
1082 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
1083
1084         * expression.cs: Error 275 added.
1085         
1086 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
1087
1088         Fix bug #69177 (Implemented decimal constant support)
1089
1090         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
1091         (BinaryFold): Add DecimalConstant.
1092
1093         * const.cs (Define): Decimal constant 
1094         (is not constant.
1095         (ChangeType): Add decimal type handling.
1096         (LookupConstantValue): Don't set value for decimal type but
1097         emit DecimalConstantAttribute. Needed for constant optimization.
1098
1099         * constant.cs (ToDecimal): New method.
1100         (ConvertToDecimal): New method.
1101         (IntConstant): Implemented ConvertToDecimal.
1102         (DecimalConstant.Emit): Emit optimized version for decimals in
1103         int range.
1104
1105         * expression.cs (ResolveOperator): Changed order of constant
1106         reduction to work correctly with native types which have
1107         overloaded operators.
1108         (ResolveMemberAccess): Extract constant value from attribute
1109         for decimal type.
1110
1111         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
1112
1113         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
1114         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
1115         (ChangeType): Decimal is special.
1116         (TypeToCoreType): Add decimal type.
1117
1118 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
1119
1120         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
1121         decimal types.
1122
1123 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
1124
1125         * class.cs (EventField.ApplyAttributeBuilder): Fix error
1126         test cs1667-5.cs.
1127
1128 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
1129
1130         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
1131
1132         * pending.cs (PendingImplementation): Grab only interfaces.
1133
1134 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
1135
1136         * statement.cs (ForeachHelperMethods): Add location member and
1137         error 202 detection.
1138
1139 2004-11-19  Raja R Harinath  <rharinath@novell.com>
1140
1141         * Makefile (EXTRA_DISTFILES): Remove mcs.exe.config.  It's
1142         automatically handled by executable.make.
1143         (PROGRAM): Make profile-specific.
1144
1145 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
1146
1147         * expression.cs (DoResolveBase): Fixed wrong warning for out
1148         variables.
1149
1150 2004-11-18  Martin Baulig  <martin@ximian.com>
1151
1152         Merged latest changes into gmcs.  Please keep this comment in
1153         here, it makes it easier for me to see what changed in MCS since
1154         the last time I merged.
1155
1156 2004-11-17  Raja R Harinath  <rharinath@novell.com>
1157
1158         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
1159         (TypeHandle.GetMemberCache): New.
1160         (TypeHandle.TypeHandle): Update.
1161         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
1162         (TypeManager.LookupParentInterfacesCache):
1163         Rename from LookupInterfaceCache.  Optimize slightly.
1164         (TypeManager.MemberLookup_FindMembers): Update.
1165         * decl.cs (MemberCache.MemberCache): Set Container to null in the
1166         multi-type variant.
1167         (AddCacheContents): Rename from AddHashtable.
1168         * class.cs (TypeContainer.parent_container): Remove.
1169         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
1170         (TypeContainer.DoDefineMembers): Don't initialize it.
1171         Update to name changes.
1172         
1173 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
1174
1175         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
1176         that factors the code to check access modifiers on override.  
1177
1178         (PropertyBase): Use the code here.
1179
1180         Patch from Lluis S'anchez, fixes bug #69361.
1181
1182 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
1183
1184         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
1185         routine that is used to report the use of a captured variable
1186         whose address has been taken.
1187
1188         There are two checks: one when variables are being captured and
1189         the other check is when the address of a variable is taken. 
1190         
1191         (because an anonymous methods might be resolved before *or* after
1192         the address has been taken) and 
1193
1194         * expression.cs (Conditional.DoResolve): Remove the special
1195         casing that Martin added to trueExpr and falseExpr being both
1196         NullLiteral.  We get the right behavior now just by introducing
1197         the null_type into the compiler. 
1198
1199         * convert.cs (ExplicitConversion): Change the code to use
1200         null_type instead of testing `expr is NullLiteral'.
1201         (ImplicitConversionStandard): use null_type too.
1202         (ImplicitReferenceConversionExists): use null_type too.
1203         (ImplicitReferenceConversion): use null_type too.
1204
1205         * literal.cs: The type of `NullLiteral' is now null_type instead
1206         of object_type. 
1207         (Resolve): Set the type here.
1208
1209         * typemanager.cs: Introduce null_type.
1210
1211 2004-11-17  Martin Baulig  <martin@ximian.com>
1212
1213         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
1214         direction, like FindMembers() does.  Fixes #69546, testcase is in
1215         test-315.cs.    
1216
1217 2004-11-16  Martin Baulig  <martin@ximian.com>
1218
1219         This is based on a patch from Marek Safar, see bug #69082.
1220         Fixes bugs #63705 and #67130.
1221
1222         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
1223         method; create a MemberCache for an interface type and cache the
1224         result.
1225
1226         * decl.cs (IMemberContainer.ParentContainer): Removed.
1227         (IMemberContainer.ParentCache): New property.
1228         (MemberCache.SetupCacheForInterface): Removed.
1229         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
1230         to create a cache for an interface's "parent".
1231
1232         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
1233         interfaces too.
1234
1235 2004-11-16  Martin Baulig  <martin@ximian.com>
1236
1237         Merged back from gmcs; these changes already went into gmcs a
1238         couple of weeks ago.
1239
1240         * typemanager.cs
1241         (TypeManager.AddUserType): Removed the `ifaces' argument.
1242         (TypeManager.RegisterBuilder): Take a `Type []' instead of a
1243         `TypeExpr []'.
1244         (TypeManager.AddUserInterface): Removed.
1245         (TypeManager.ExpandInterfaces): Return a `Type []' instead of a
1246         `TypeExpr []'.
1247         (TypeManager.GetInterfaces): Likewise.
1248         (TypeManager.GetExplicitInterfaces): Likewise.
1249
1250         * ecore.cs (TypeExpr.GetInterfaces): Removed.
1251
1252         * class.cs (TypeContainer.base_class_type): Replaced with `ptype'.
1253         (TypeContainer.base_inteface_types): Replaced with `ifaces'.
1254
1255 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
1256
1257         * statement.cs: Avoid adding bools to a hashtable.
1258
1259 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
1260
1261         * expression.cs (Invocation.OverloadResolve): Flag error if we are
1262         calling an unsafe method from a safe location.
1263
1264 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
1265
1266         Fix #69167
1267         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
1268
1269 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
1270
1271         * namespace.cs (VerifyUsing): use GetPartialName instead of
1272         ToString. 
1273
1274 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
1275
1276         * statement.cs (Return.Resolve): Fix regression in typo: if
1277         `in_exc', we have to request a NeedReturnLabel, this was a typo
1278         introduced in the anonymous method check-in.  Fixes #69131.
1279
1280         * Indexers were using the ShortName when defining themselves,
1281         causing a regression in the compiler bootstrap when applying the
1282         patch from 2004-11-02 (first part), now they use their full name
1283         and the bug is gone.
1284
1285 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
1286
1287         * driver.cs: Strip the path from the names of embedded resources. Fixes
1288         #68519.
1289
1290 2004-11-04  Raja R Harinath  <rharinath@novell.com>
1291
1292         Fix error message regression: cs0104-2.cs.
1293         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
1294         (AliasEntry.Resolve): Update.
1295         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
1296         'silent' flag.
1297         (RootContext.LookupType): Update.
1298
1299 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
1300
1301         * cs-parser.jay: Add support for handling accessor modifiers
1302         * class: Add support port accessor modifiers and error checking,
1303         define PropertyMethod.Define as virtual (not abstract anymore)
1304         * ecore.cs: Add checking for proeprties access with access modifiers
1305         * iterators.cs: Modify Accessor constructor call based in the modified
1306         constructor
1307 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
1308
1309         * expression.cs (StringConcat): Handle being called twice,
1310         as when we have a concat in a field init with more than two
1311         ctors in the class
1312
1313 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
1314
1315         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
1316         special case explicit implementations, we should always produce
1317         the .property or .event declaration.
1318         
1319         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
1320         since it will not return correct data if people use this
1321         unresolved in the presence of using statements (see test-313).
1322
1323         * class.cs (MethodData.Define): If we are an explicit interface
1324         implementation, set the method name to the full name of the
1325         interface plus the name of the method.  
1326
1327         Notice that using the method.MethodName.GetFullName() does not
1328         work, as it will only contain the name as declared on the source
1329         file (it can be a shorthand in the presence of using statements)
1330         and not the fully qualifed type name, for example:
1331
1332         using System;
1333
1334         class D : ICloneable {
1335                 object ICloneable.Clone ()  {
1336                 }
1337         }
1338
1339         Would produce a method called `ICloneable.Clone' instead of
1340         `System.ICloneable.Clone'.
1341
1342         * namespace.cs (Alias.Resolve): Use GetPartialName.
1343         
1344 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
1345
1346         * cs-parser.jay: Add error 1055 report.
1347
1348 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
1349
1350         * assign.cs (Assign.DoResolve): Only do the transform of
1351         assignment into a New if the types are compatible, if not, fall
1352         through and let the implicit code deal with the errors and with
1353         the necessary conversions. 
1354
1355 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
1356
1357         * cs-parser.jay: Add error 1031 report.
1358
1359         * cs-tokenizer.cs: Add location for error 1038.
1360
1361 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1362
1363         * cs-parser.jay: Add error 1016 report.
1364
1365 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1366
1367         * cs-parser.jay: Add errors 1575,1611 report.
1368
1369 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1370
1371         * cs-parser.jay: Add error 1001 report.
1372
1373 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1374
1375         Fix #68850
1376         * attribute.cs (GetMarshal): Add method argument for
1377         caller identification.
1378
1379         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
1380         agument for GetMarshal and RuntimeMissingSupport.
1381
1382 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1383
1384         * attribute.cs (ExtractSecurityPermissionSet): Removed
1385         TypeManager.code_access_permission_type.
1386
1387         * typemanager.cs: Removed TypeManager.code_access_permission_type.
1388
1389 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
1390
1391         * expression.cs (LocalVariableReference.DoResolveLValue): Check
1392         for obsolete use of a variable here.   Fixes regression on errors
1393         cs0619-25 and cs0619-26.
1394
1395 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
1396
1397         Fix #62358, implemented security attribute encoding.
1398
1399         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
1400         Tests permitted SecurityAction for assembly or other types.
1401         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
1402         data from SecurityPermissionAttribute to PermisionSet class.
1403
1404         * class.cs (ApplyAttributeBuilder): Added special handling
1405         for System.Security.Permissions.SecurityAttribute based types.
1406
1407         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
1408         special handling for System.Security.Permissions.SecurityAttribute
1409         based types.
1410
1411         * enum.cs (ApplyAttributeBuilder): Added special handling
1412         for System.Security.Permissions.SecurityAttribute based types.
1413
1414         * parameter.cs (ApplyAttributeBuilder): Added special handling
1415         for System.Security.Permissions.SecurityAttribute based types.
1416
1417         * rootcontext.cs: Next 2 core types.
1418
1419         * typemanager.cs (TypeManager.security_permission_attr_type):
1420         Built in type for the SecurityPermission Attribute.
1421         (code_access_permission_type): Build in type.
1422
1423 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
1424
1425         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
1426         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
1427         all of this information into
1428         EmitContext.EmitCapturedVariableInstance.
1429         
1430         * codegen.cs (EmitCapturedVariableInstance): move here the
1431         funcionality of emitting an ldarg.0 in the presence of a
1432         remapping.   This centralizes the instance emit code.
1433
1434         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
1435         then emit a load of this: it means that we have reached the
1436         topmost ScopeInfo: the one that contains the pointer to the
1437         instance of the class hosting the anonymous method.
1438
1439         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
1440         captures to the topmost CaptureContext.
1441
1442 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
1443
1444         * expression.cs (LocalVariableReference): Move the knowledge about
1445         the iterators into codegen's EmitCapturedVariableInstance.
1446
1447 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
1448
1449         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
1450         all code paths return a value from an anonymous method (it is the
1451         same as the 161 error, but for anonymous methods).
1452
1453 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
1454
1455         The introduction of anonymous methods in the compiler changed
1456         various ways of doing things in the compiler.  The most
1457         significant one is the hard split between the resolution phase
1458         and the emission phases of the compiler.
1459
1460         For instance, routines that referenced local variables no
1461         longer can safely create temporary variables during the
1462         resolution phase: they must do so from the emission phase,
1463         since the variable might have been "captured", hence access to
1464         it can not be done with the local-variable operations from the runtime.
1465         
1466         * statement.cs 
1467
1468         (Block.Flags): New flag `IsTopLevel' to indicate that this block
1469         is a toplevel block.
1470
1471         (ToplevelBlock): A new kind of Block, these are the blocks that
1472         are created by the parser for all toplevel method bodies.  These
1473         include methods, accessors and anonymous methods.
1474
1475         These contain some extra information not found in regular blocks:
1476         A pointer to an optional CaptureContext (for tracking captured
1477         local variables and parameters).  A pointer to the parent
1478         ToplevelBlock.
1479         
1480         (Return.Resolve): Catch missmatches when returning a value from an
1481         anonymous method (error 1662).
1482         Invoke NeedReturnLabel from the Resolve phase instead of the emit
1483         phase.
1484
1485         (Break.Resolve): ditto.
1486
1487         (SwitchLabel): instead of defining the labels during the
1488         resolution phase, we now turned the public ILLabel and ILLabelCode
1489         labels into methods called GetILLabelCode() and GetILLabel() that
1490         only define the label during the Emit phase.
1491
1492         (GotoCase): Track the SwitchLabel instead of the computed label
1493         (its contained therein).  Emit the code by using
1494         SwitchLabel.GetILLabelCode ().
1495
1496         (LocalInfo.Flags.Captured): A new flag has been introduce to track
1497         whether the Local has been captured or not.
1498
1499         (LocalInfo.IsCaptured): New property, used to tell whether the
1500         local has been captured.
1501         
1502         * anonymous.cs: Vastly updated to contain the anonymous method
1503         support.
1504
1505         The main classes here are: CaptureContext which tracks any
1506         captured information for a toplevel block and ScopeInfo used to
1507         track the activation frames for various local variables.   
1508
1509         Each toplevel block has an optional capture context associated
1510         with it.  When a method contains an anonymous method both the
1511         toplevel method and the anonymous method will create a capture
1512         context.   When variables or parameters are captured, they are
1513         recorded on the CaptureContext that owns them, for example:
1514
1515         void Demo () {
1516              int a;
1517              MyDelegate d = delegate {
1518                  a = 1;
1519              }
1520         }
1521
1522         Here `a' will be recorded as captured on the toplevel
1523         CapturedContext, the inner captured context will not have anything
1524         (it will only have data if local variables or parameters from it
1525         are captured in a nested anonymous method.
1526
1527         The ScopeInfo is used to track the activation frames for local
1528         variables, for example:
1529
1530         for (int i = 0; i < 10; i++)
1531                 for (int j = 0; j < 10; j++){
1532                    MyDelegate d = delegate {
1533                         call (i, j);
1534                    }
1535                 }
1536
1537         At runtime this captures a single captured variable `i', but it
1538         captures 10 different versions of the variable `j'.  The variable
1539         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
1540         recorded on a child.  
1541
1542         The toplevel ScopeInfo will also track information like the `this'
1543         pointer if instance variables were referenced (this is necessary
1544         as the anonymous method lives inside a nested class in the host
1545         type of the method). 
1546
1547         (AnonymousMethod): Expanded to track the Toplevel, implement
1548         `AnonymousMethod.Compatible' to tell whether an anonymous method
1549         can be converted to a target delegate type. 
1550
1551         The routine now also produces the anonymous method content
1552
1553         (AnonymousDelegate): A helper class that derives from
1554         DelegateCreation, this is used to generate the code necessary to
1555         produce the delegate for the anonymous method that was created. 
1556
1557         * assign.cs: API adjustments for new changes in
1558         Convert.ImplicitStandardConversionExists.
1559
1560         * class.cs: Adjustments to cope with the fact that now toplevel
1561         blocks are of type `ToplevelBlock'. 
1562
1563         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
1564         insteda of standard blocks.
1565
1566         Flag errors if params arguments are passed to anonymous methods.
1567
1568         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
1569         `CurrentAnonymousMethod' which points to the current Anonymous
1570         Method.  The variable points to the AnonymousMethod class that
1571         holds the code being compiled.  It is set in the new EmitContext
1572         created for the anonymous method.
1573
1574         (EmitContext.Phase): Introduce a variable and an enumeration to
1575         assist in enforcing some rules about when and where we are allowed
1576         to invoke certain methods (EmitContext.NeedsReturnLabel is the
1577         only one that enfonces this right now).
1578
1579         (EmitContext.HaveCaptureInfo): new helper method that returns
1580         whether we have a CapturedContext initialized.
1581
1582         (EmitContext.CaptureVariable): New method used to register that a
1583         LocalInfo must be flagged for capturing. 
1584
1585         (EmitContext.CapturedParameter): New method used to register that a
1586         parameters must be flagged for capturing. 
1587         
1588         (EmitContext.CapturedField): New method used to register that a
1589         field must be flagged for capturing. 
1590
1591         (EmitContext.HaveCapturedVariables,
1592         EmitContext.HaveCapturedFields): Return whether there are captured
1593         variables or fields. 
1594
1595         (EmitContext.EmitMethodHostInstance): This is used to emit the
1596         instance for the anonymous method.  The instance might be null
1597         (static methods), this (for anonymous methods that capture nothing
1598         and happen to live side-by-side with the current method body) or a
1599         more complicated expression if the method has a CaptureContext.
1600
1601         (EmitContext.EmitTopBlock): Routine that drives the emission of
1602         code: it will first resolve the top block, then emit any metadata
1603         and then emit the code.  The split is done so that we can extract
1604         any anonymous methods and flag any captured variables/parameters.
1605         
1606         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
1607         during this phase, the ILGenerator should not be used as labels
1608         and local variables declared here might not be accessible to any
1609         code that is part of an anonymous method.  
1610
1611         Exceptions to this include the temporary variables that are
1612         created by some statements internally for holding temporary
1613         variables. 
1614         
1615         (EmitContext.EmitMeta): New routine, in charge of emitting all the
1616         metadata for a cb
1617
1618         (EmitContext.TemporaryReturn): This method is typically called
1619         from the Emit phase, and its the only place where we allow the
1620         ReturnLabel to be defined other than the EmitMeta.  The reason is
1621         that otherwise we would have to duplicate a lot of logic in the
1622         Resolve phases of various methods that today is on the Emit
1623         phase. 
1624
1625         (EmitContext.NeedReturnLabel): This no longer creates the label,
1626         as the ILGenerator is not valid during the resolve phase.
1627
1628         (EmitContext.EmitThis): Extended the knowledge in this class to
1629         work in anonymous methods in addition to iterators. 
1630
1631         (EmitContext.EmitCapturedVariableInstance): This emits whatever
1632         code is necessary on the stack to access the instance to a local
1633         variable (the variable will be accessed as a field).
1634
1635         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
1636         EmitContext.EmitAddressOfParameter): Routines to support
1637         parameters (not completed at this point). 
1638         
1639         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
1640         will also remove the parameters.
1641
1642         * convert.cs (Convert): Define a `ConstantEC' which points to a
1643         null.  This is just to prefity some code that uses
1644         ImplicitStandardConversion code and do not have an EmitContext
1645         handy.
1646
1647         The idea is to flag explicitly that at that point in time, it is
1648         known that the conversion will not trigger the delegate checking
1649         code in implicit conversions (which requires a valid
1650         EmitContext). 
1651
1652         Everywhere: pass new EmitContext parameter since
1653         ImplicitStandardConversionExists now requires it to check for
1654         anonymous method conversions. 
1655
1656         (Convert.ImplicitStandardConversionExists): If the type of an
1657         expression is the anonymous_method_type, and the type is a
1658         delegate, we invoke the AnonymousMethod.Compatible method to check
1659         whether an implicit conversion is possible. 
1660
1661         (Convert.ImplicitConversionStandard): Only do implicit method
1662         group conversions if the language level is not ISO_1.
1663
1664         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
1665         MethodInfo for the Invoke method.  used by Delegate and
1666         AnonymousDelegate.
1667
1668         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
1669         method conversions if the target type is a delegate.
1670
1671         Removed extra debugging nops.
1672
1673         (LocalVariableReference): Turn the `local_info' into a public
1674         field. 
1675
1676         Add `prepared' field, the same hack used for FieldExprs to cope
1677         with composed assignments, as Local variables do not necessarily
1678         operate purely on the stack as they used to: they can be captured
1679         fields. 
1680
1681         Add `temp' for a temporary result, like fields.
1682
1683         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1684
1685         It now copes with Local variables that are captured and emits the
1686         proper instance variable to load it from a field in the captured
1687         case. 
1688
1689         (ParameterReference.DoResolveBase): During the resolve phase,
1690         capture parameters if we are in an anonymous method.
1691
1692         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1693         anonymous method, use the EmitContext helper routines to emit the
1694         parameter reference.
1695
1696         * iterators.cs: Set RemapToProxy to true/false during the
1697         EmitDispose class.
1698
1699         * parameters.cs (GetParameterByName): New helper method. 
1700
1701         * typemanager.cs (anonymous_method_type) a new type that
1702         represents an anonyous method.  This is always an internal type,
1703         used as a fencepost to test against the anonymous-methodness of an
1704         expression. 
1705         
1706 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
1707
1708         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
1709         561 report.
1710         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
1711
1712 2004-10-18  Martin Baulig  <martin@ximian.com>
1713
1714         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
1715         `Type' directly, but call ResolveType() on it.
1716         (Catch.Resolve): Likewise.
1717         (Foreach.Resolve): Likewise.
1718
1719 2004-10-18  Martin Baulig  <martin@ximian.com>
1720
1721         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
1722         `Type' directly, but call ResolveType() on it.
1723         (Probe.DoResolve): Likewise.
1724         (ArrayCreation.LookupType): Likewise.
1725         (TypeOf.DoResolve): Likewise.
1726         (SizeOf.DoResolve): Likewise.
1727
1728 2004-10-18  Martin Baulig  <martin@ximian.com>
1729
1730         * expression.cs (Invocation.BetterFunction): Put back
1731         TypeManager.TypeToCoreType().
1732
1733 2004-10-18  Raja R Harinath  <rharinath@novell.com>
1734
1735         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
1736         the ResolveType.
1737
1738 2004-10-18  Martin Baulig  <martin@ximian.com>
1739
1740         * parameter.cs (Parameter.Resolve):  Don't access the TypeExpr's
1741         `Type' directly, but call ResolveType() on it.
1742
1743 2004-10-18  Martin Baulig  <martin@ximian.com>
1744
1745         * class.cs (FieldMember.Define): Don't access the TypeExpr's
1746         `Type' directly, but call ResolveType() on it.
1747         (MemberBase.DoDefine): Likewise.
1748
1749         * expression.cs (New.DoResolve): Don't access the TypeExpr's
1750         `Type' directly, but call ResolveType() on it.
1751         (ComposedCast.DoResolveAsTypeStep): Likewise.
1752
1753         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
1754         `Type' directly, but call ResolveType() on it.
1755
1756 2004-10-17  John Luke  <john.luke@gmail.com>
1757
1758         * class.cs (Operator.GetSignatureForError): use CSharpName
1759
1760         * parameter.cs (Parameter.GetSignatureForError): Returns
1761         correct name even if was not defined.
1762
1763 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1764
1765         Fix #65816.
1766         * class.cs (TypeContainer.EmitContext): New property.
1767         (DefineNestedTypes): Create an emitcontext for each part.
1768         (MethodCore.DoDefineParameters): Use container's emitcontext.
1769         Pass type array to InternalParameters.
1770         (MemberBase.DoDefine): Use container's emitcontext.
1771         (FieldMember.Define): Likewise.
1772         (Event.Define): Likewise.
1773         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1774         Pass type array to InternalParameters.
1775         (SetIndexerMethod.GetParameterInfo): Likewise.
1776         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1777         * delegate.cs (Define): Pass emitcontext to
1778         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1779         array to InternalParameters.
1780         * expression.cs (ParameterReference.DoResolveBase): Pass
1781         emitcontext to GetParameterInfo.
1782         (ComposedCast.DoResolveAsTypeStep): Remove check on
1783         ec.ResolvingTypeTree.
1784         * parameter.cs (Parameter.Resolve): Change argument to
1785         EmitContext.  Use ResolveAsTypeTerminal.
1786         (Parameter.GetSignature): Change argument to EmitContext.
1787         (Parameters.ComputeSignature): Likewise.
1788         (Parameters.ComputeParameterTypes): Likewise.
1789         (Parameters.GetParameterInfo): Likewise.
1790         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1791         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1792         * support.cs (InternalParameters..ctor): Remove variant that takes
1793         a DeclSpace.
1794         * typemanager.cs (system_intptr_expr): New.
1795         (InitExpressionTypes): Initialize it.
1796
1797 2004-10-12  Chris Toshok  <toshok@ximian.com>
1798
1799         * cs-parser.jay: fix location for try_statement and catch_clause.
1800
1801 2004-10-11  Martin Baulig  <martin@ximian.com>
1802
1803         * report.cs: Don't make --fatal abort on warnings, we have
1804         -warnaserror for that.
1805
1806 2004-10-07  Raja R Harinath  <rharinath@novell.com>
1807
1808         More DeclSpace.ResolveType avoidance.
1809         * decl.cs (MemberCore.InUnsafe): New property.
1810         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
1811         with newly created EmitContext.
1812         (FieldMember.Define): Likewise.
1813         * delegate.cs (Delegate.Define): Likewise.
1814         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
1815         only if normal name-lookup fails.
1816         (TypeExpr.DoResolve): Enable error-checking.
1817         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
1818         (SizeOf.DoResolve): Likewise.
1819         (ComposedCast.DoResolveAsTypeStep): Likewise.
1820         (StackAlloc.DoResolve): Likewise.
1821         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
1822         (Block.Unsafe): New property.
1823         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
1824         (Unsafe): Set 'unsafe' flag of contained block.
1825         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
1826         (Fixed.Resolve): Likewise.
1827         (Catch.Resolve): Likewise.
1828         (Using.ResolveLocalVariableDecls): Likewise.
1829         (Foreach.Resolve): Likewise.
1830
1831 2004-10-05  John Luke <john.luke@gmail.com>
1832
1833         * cs-parser.jay: add location to error CS0175
1834
1835 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
1836
1837         * ecore.cs (Expression.Constantity): Add support for turning null
1838         into a constant.
1839
1840         * const.cs (Const.Define): Allow constants to be reference types
1841         as long as the value is Null.
1842
1843 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
1844
1845         * namespace.cs (NamespaceEntry.Using): No matter which warning
1846         level is set, check if this namespace name has already been added.
1847
1848 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
1849
1850         * expression.cs: reftype [!=]= null should always use br[true,false].
1851         # 67410
1852
1853 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
1854
1855         Fix #67108
1856         * attribute.cs: Enum conversion moved to 
1857         GetAttributeArgumentExpression to be applied to the all
1858         expressions.
1859
1860 2004-10-01  Raja R Harinath  <rharinath@novell.com>
1861
1862         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
1863         * class.c (TypeContainer.DefineType): Flag error if
1864         base types aren't accessible due to access permissions.
1865         * decl.cs (DeclSpace.ResolveType): Move logic to
1866         Expression.ResolveAsTypeTerminal.
1867         (DeclSpace.ResolveTypeExpr): Thin layer over
1868         Expression.ResolveAsTypeTerminal.
1869         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
1870         Refactor code into NestedAccess.  Use it.
1871         (DeclSpace.NestedAccess): New.
1872         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
1873         argument to silence errors.  Check access permissions.
1874         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
1875         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
1876         (Cast.DoResolve): Likewise.
1877         (New.DoResolve): Likewise.
1878         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
1879         (TypeOf.DoResolve): Likewise.
1880
1881         * expression.cs (Invocation.BetterConversion): Return the Type of
1882         the better conversion.  Implement section 14.4.2.3 more faithfully.
1883         (Invocation.BetterFunction): Make boolean.  Make correspondence to
1884         section 14.4.2.2 explicit.
1885         (Invocation.OverloadResolve): Update.
1886         (Invocation): Remove is_base field.
1887         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
1888         (Invocation.Emit): Likewise.
1889
1890 2004-09-27  Raja R Harinath  <rharinath@novell.com>
1891
1892         * README: Update to changes.
1893
1894 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
1895
1896         * cs-parser.jay: Reverted 642 warning fix.
1897
1898 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1899
1900         Fix bug #66615
1901         * decl.cs (FindMemberWithSameName): Indexer can have more than
1902         1 argument.
1903
1904 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1905
1906         * expression.cs (LocalVariableReference.DoResolveLValue):
1907         Do not report warning 219 for out values.
1908         (EmptyExpression.Null): New member to avoid extra allocations.
1909
1910 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1911
1912         * cs-parser.jay: Fix wrong warning 642 report.
1913
1914         * cs-tokenizer.cs (CheckNextToken): New helper;
1915         Inspect next character if is same as expected.
1916
1917 2004-09-23  Martin Baulig  <martin@ximian.com>
1918
1919         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1920         (Convert.ImplicitReferenceConversionExists): Likewise.
1921
1922 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1923
1924         * class.cs (Operator.Define): Add error 448 and 559 report.
1925
1926 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1927
1928         * class.cs (MemberBase.IsTypePermitted): New protected
1929         method for checking error CS0610.
1930
1931 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1932
1933         * class.cs (TypeContainer.HasExplicitLayout): New property
1934         Returns whether container has StructLayout attribute set Explicit.
1935         (FieldMember): New abstract class for consts and fields.
1936         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
1937         (Field): Reuse FieldMember.
1938
1939         * const.cs (Const): Reuse FieldMember.
1940
1941         * rootcontext.cs: EmitConstants call moved to class.
1942
1943 2004-09-22  Martin Baulig  <martin@ximian.com>
1944
1945         Thanks to Peter Sestoft for this bug report.
1946
1947         * expression.cs (Conditional): If both the `trueExpr' and the
1948         `falseExpr' is a NullLiteral, return a NullLiteral.
1949
1950 2004-09-22  Martin Baulig  <martin@ximian.com>
1951
1952         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
1953         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
1954         for the "get_Current" call.
1955
1956 2004-09-22  Martin Baulig  <martin@ximian.com>
1957
1958         Marek and me just fixed one of our oldest bugs: #28562 :-)
1959
1960         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
1961
1962         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
1963         we're an EnumConstant, just return that.
1964         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
1965         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
1966         to get the value which'll actually be written into the attribute.
1967         However, we have to use GetValue() to access the attribute's value
1968         in the compiler.        
1969
1970 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1971
1972         * constant.cs (Constant.IsNegative): New abstract property
1973         IsNegative.
1974
1975         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
1976         (StackAlloc.DoResolve): Reused IsNegative.
1977
1978 2004-09-21  Martin Baulig  <martin@ximian.com>
1979
1980         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
1981         if we're used in an iterator, we may be called from different
1982         methods.
1983
1984         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
1985         we actually have an exception block.
1986
1987 2004-09-20  John Luke <jluke@cfl.rr.com>
1988
1989         * class.cs, cs-parser.jay: Improve the error report for 1520:
1990         report the actual line where the error happens, not where the
1991         class was declared.
1992
1993         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
1994         Pass location information that was available elsewhere.
1995
1996 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
1997
1998         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
1999         runtime to delay sign assemblies.
2000
2001 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
2002
2003         * cs-parser.jay: Do not report the stack trace, this is barely
2004         used nowadays.
2005
2006 2004-08-22  John Luke  <john.luke@gmail.com>
2007  
2008         * driver.cs : check that a resource id is not already used
2009         before adding it, report CS1508 if it is, bug #63637
2010
2011 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
2012
2013         * ecore.cs: Removed dead code.
2014
2015 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
2016
2017         * class.cs: Do not report warning CS0067 on the interfaces.
2018
2019 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
2020
2021         * cs-parser.jay: Add error 504 report.
2022
2023 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
2024
2025         * rootcontext.cs: WarningLevel is 4 by default now.
2026
2027         * statement.cs (Fixed.Resolve): Do not null
2028         VariableInfo.
2029
2030 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
2031
2032         Fixed bug #55780
2033         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
2034         deep search when property is not virtual.
2035         (PropertyExpr.ResolveAccessors): Make one call for both
2036         accessors.
2037
2038 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
2039
2040         Fixed bug #65766
2041         * statement.cs: Error 152 report constains also location.
2042
2043 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
2044
2045         Fixed bug #65766
2046         * const.cs: Explicitly set constant as static.
2047
2048 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
2049
2050         Fixed bug #64226
2051         * cs-parser.jay: Add error 1017 report.
2052
2053 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
2054
2055         Fixed bug #59980, #64224
2056         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
2057
2058         * typemanager.cs (IsSpecialMethod): Simplified
2059
2060 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
2061
2062         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
2063         condition with better params.
2064
2065 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
2066
2067         Fixed bug #65238
2068         * attribute.cs (Resolve): Property has to have both
2069         accessors.
2070
2071 2004-09-14  Martin Baulig  <martin@ximian.com>
2072
2073         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
2074
2075 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
2076
2077         Fixed bug #61902
2078         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
2079         called and is obsolete then this member suppress message
2080         when call is inside next [Obsolete] method or type.
2081
2082         * expression.cs: Use TestObsoleteMethodUsage member.
2083
2084 2004-09-14  Martin Baulig  <martin@ximian.com>
2085
2086         * cs-parser.jay: Sync a bit with the GMCS version.
2087
2088 2004-09-14  Martin Baulig  <martin@ximian.com>
2089
2090         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
2091         (CSharpParser.yacc_verbose_flag): New public field.
2092
2093         * genericparser.cs: Removed.
2094
2095 2004-09-14  Raja R Harinath  <rharinath@novell.com>
2096
2097         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
2098
2099 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
2100
2101         * class.cs (MethodCore.CheckBase): Fix bug #65757.
2102
2103 2004-09-10  Martin Baulig  <martin@ximian.com>
2104
2105         Backported my MemberName changes from GMCS into MCS.
2106
2107         - we are now using a special `MemberName' class instead of using
2108         strings; in GMCS, the `MemberName' also contains the type
2109         arguments.
2110
2111         - changed the grammar rules a bit:
2112           * the old `member_name' is now a `namespace_or_type_name':
2113             The rule is that we use `namespace_or_type_name' everywhere
2114             where we expect either a "member name" (GetEnumerator) or a
2115             "member name" with an explicit interface name
2116             (IEnumerable.GetEnumerator).
2117             In GMCS, the explicit interface name may include type arguments
2118             (IEnumerable<T>.GetEnumerator).
2119           * we use `member_name' instead of just `IDENTIFIER' for
2120             "member names":
2121             The rule is that we use `member_name' wherever a member may
2122             have type parameters in GMCS.       
2123
2124         * decl.cs (MemberName): New public class.
2125         (MemberCore.MemberName): New public readonly field.
2126         (MemberCore.ctor): Take a `MemberName' argument, not a string.
2127         (DeclSpace): Likewise.
2128
2129         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
2130         * enum.cs (Enum.ctor): Likewise.
2131
2132         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
2133         MemberName.     
2134         (AliasEntry.ctor): Take a MemberName, not an Expression.
2135         (AliasEntry.UsingAlias): Likewise.
2136
2137         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
2138         (IMethodData.MemberName): Changed type from string to MemberName.
2139         (MemberBase.ExplicitInterfaceName): Likewise.
2140         (AbstractPropertyEventMethod.SetupName): Make this private.
2141         (AbstractPropertyEventMethod.ctor): Added `string prefix'
2142         argument; compute the member name here.
2143         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
2144         on the `member.MemberName' and the `prefix'.
2145
2146         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
2147         not `type_name'.
2148         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
2149         thus, we get a `MemberName' instead of a `string'.  These
2150         declarations may have type parameters in GMCS.
2151         (interface_method_declaration, delegate_declaration): Likewise.
2152         (class_declaration, interface_declaration): Likewise.
2153         (method_header): Use `namespace_or_type_name' instead of
2154         `member_name'.  We may be an explicit interface implementation.
2155         (property_declaration, event_declaration): Likewise.
2156         (member_name): This is now just an `IDENTIFIER', not a
2157         `namespace_or_type_name'.
2158         (type_name, interface_type): Removed.
2159         (namespace_or_type_name): Return a MemberName, not an Expression.
2160         (primary_expression): Use `member_name' instead of `IDENTIFIER';
2161         call GetTypeExpression() on the MemberName to get an expression.
2162         (IndexerDeclaration.interface_type): Changed type from string to
2163         MemberName.
2164         (MakeName): Operate on MemberName's instead of string's.
2165
2166 2004-09-13  Raja R Harinath  <rharinath@novell.com>
2167
2168         Fix bug #55770.
2169         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
2170         (NamespaceEntry.Lookup): Add new argument to flag if we want the
2171         lookup to avoid symbols introduced by 'using'.
2172         * rootcontext.cs (NamespaceLookup): Update.
2173
2174 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
2175
2176         * class.cs (TypeContainer.DoDefineMembers): Do not call
2177         DefineDefaultConstructor for static classes.
2178
2179 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
2180
2181         * attribute.cs (Attribute.Resolve): Add error 653 report.
2182
2183         * class.cs (Class.ApplyAttributeBuilder): Add error 641
2184         report.
2185         (Method.ApplyAttributeBuilder): Add error 685 report.
2186         (Operator.Define): Add error 564 report.
2187
2188         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
2189
2190         * expression.cs (Invocation.DoResolve): Add error
2191         245 and 250 report.
2192
2193         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
2194         error 674 report.
2195
2196 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2197
2198         * class.cs (ConstructorInitializer.Resolve):
2199         Wrong error number (515->516).
2200
2201 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2202
2203         * class.cs (Indexer.Define): Add error 631 report.
2204
2205 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2206
2207         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
2208
2209 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2210
2211         * expression.cs (Probe.DoResolve): Add error CS0241 report.
2212
2213 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
2214
2215         * cs-parser.jay: Added error CS0241 report.
2216
2217 2004-09-10  Raja R Harinath  <rharinath@novell.com>
2218
2219         * cs-parser.jay (fixed_statement): Introduce a scope for the
2220         declaration in the 'fixed' statement.
2221
2222 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2223
2224         * cs-parser.jay: Added CS0230 error report.
2225
2226 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2227
2228         * cs-parser.jay: Added errors CS0231 and CS0257 report.
2229
2230 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2231
2232         * expression.cs (Argument.Resolve): Added error CS0192 and
2233         CS0199 report.
2234
2235 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2236
2237         C# 2.0 #pragma warning feature
2238
2239         * cs-tokenizer.cs (PreProcessPragma): New method; 
2240         Handles #pragma directive.
2241
2242         * report.cs (WarningRegions): New class; Support
2243         class for #pragma warning directive. It tests whether
2244         warning is enabled for a given line.
2245
2246 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
2247
2248         * const.cs: Add more descriptive error report, tahnks to
2249         Sebastien. 
2250
2251 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
2252
2253         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
2254
2255 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
2256
2257         * expression.cs: Apply patch from Ben: Remove dead code from
2258         ArrayCreation, and remove the TurnintoConstant call in const.cs,
2259         as that code just threw an exception anwyays.
2260
2261         * const.cs: Remove the call to the turnintoconstant, for details
2262         see bug: #63144
2263         
2264         * literal.cs: The type of the null-literal is the null type;  So
2265         we use a placeholder type (literal.cs:System.Null, defined here)
2266         for it.
2267
2268         * expression.cs (Conditional.DoResolve): Remove some old code that
2269         is no longer needed, conversions have been fixed.
2270
2271         (ArrayCreationExpression.DoResolve): Return false if we fail to
2272         resolve the inner expression.
2273
2274 2004-09-07  Raja R Harinath  <rharinath@novell.com>
2275
2276         Fix test-290.cs.
2277         * cs-parser.jay (delegate_declaration): Record a delegate
2278         declaration as a type declaration.
2279         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
2280
2281 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
2282
2283         * parameter.cs: Do not crash if the type can not be resolved. 
2284
2285         * expression.cs: Report errors with unsafe pointers, fixes #64896
2286
2287 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2288
2289         * expression.cs: Pointer arith always needs to do a conv.i
2290         if the operand is a long. fix 65320
2291
2292 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
2293
2294         Fixed cs0619-37.cs, cs0619-38.cs
2295
2296         * enum.cs (GetObsoleteAttribute): Removed.
2297
2298         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
2299         on Enum member is double staged. The first is tested member
2300         and then enum.
2301
2302 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
2303
2304         Fixed #56986, #63631, #65231
2305
2306         * class.cs: (TypeContainer.AddToMemberContainer): New method,
2307         adds member to name container.
2308         (TypeContainer.AddToTypeContainer): New method, adds type to
2309         name container.
2310         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
2311         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
2312         AddOperator): Simplified by reusing AddToMemberContainer.
2313         (TypeContainer.UserDefinedStaticConstructor): Changed to property
2314         instead of field.
2315         (Method.CheckForDuplications): Fixed implementation to test all
2316         possibilities.
2317         (MemberBase): Detection whether member is explicit interface
2318         implementation is now in constructor.
2319         (MemberBase.UpdateMemberName): Handles IndexerName.
2320         (Accessor): Changed to keep also location information.
2321         (AbstractPropertyEventMethod): Is derived from MemberCore.
2322         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
2323         will be emited or not.
2324         (PropertyBase.AreAccessorsDuplicateImplementation):
2325         Tests whether accessors are not in collision with some method.
2326         (Operator): Is derived from MethodCore to simplify common
2327         operations.
2328
2329         * decl.cs (Flags.TestMethodDuplication): Test for duplication
2330         must be performed.
2331         (DeclSpace.AddToContainer): Adds the member to defined_names
2332         table. It tests for duplications and enclosing name conflicts.
2333
2334         * enum.cs (EnumMember): Clean up to reuse the base structures
2335
2336 2004-09-03  Martin Baulig  <martin@ximian.com>
2337
2338         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
2339         into TypeContainer, to make partial classes work again.
2340
2341 2004-09-03  Martin Baulig  <martin@ximian.com>
2342
2343         * rootcontext.cs (RootContext.V2): Removed.
2344
2345 2004-03-23  Martin Baulig  <martin@ximian.com>
2346
2347         * expression.cs (Invocation.OverloadResolve): Added `bool
2348         may_fail' argument and use it instead of the Location.IsNull() hack.
2349
2350 2004-09-03  Martin Baulig  <martin@ximian.com>
2351
2352         Merged latest changes into gmcs.  Please keep this comment in
2353         here, it makes it easier for me to see what changed in MCS since
2354         the last time I merged.
2355
2356 2004-09-03  Raja R Harinath  <rharinath@novell.com>
2357
2358         Fix #61128.
2359         * expression.cs (BetterConversion): Don't allow either conversion 
2360         to be null.  Remove redundant implicit conversion test when 'q ==
2361         null' -- when this function is invoked, we already know that the
2362         implicit conversion exists.
2363         (BetterFunction): Assume that 'best' is non-null.  Remove
2364         redundant reimplementation of IsApplicable when 'best' is null.
2365         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
2366         number of arguments.
2367         (IsAncestralType): Extract from OverloadResolve.
2368         (OverloadResolve): Make robust to the MethodGroupExpr being
2369         unsorted.  Implement all the logic of Section 14.5.5.1, and
2370         support overloading of methods from multiple applicable types.
2371         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
2372
2373         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
2374         (RealError, Warning): Append type of report to related symbol.
2375
2376 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
2377
2378         * enum.cs: Fixed CLS-Compliance checks for enum members.
2379         Error tests cs3008-8.cs, cs3014-8.cs
2380
2381 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
2382
2383         Fixed bug #62342, #63102
2384         * class.cs: ImplementIndexer uses member.IsExplicitImpl
2385         like ImplementMethod.
2386
2387 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
2388
2389         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2390         Fixed bug #65170.
2391
2392 2004-09-02  Martin Baulig  <martin@ximian.com>
2393
2394         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
2395         TypeManager.GetArgumentTypes() rather than calling GetParameters()
2396         on the MethodBase.
2397
2398 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
2399
2400         C# 2.0 Static classes implemented
2401
2402         * class.cs (TypeContainer): instance_constructors,
2403         initialized_fields, initialized_static_fields,
2404         default_constructor, base_inteface_types are protected to be
2405         accessible from StaticClass.
2406         (TypeContainer.DefineDefaultConstructor): New virtual method
2407         for custom default constructor generating
2408         (StaticClass): New class to handle "Static classes" feature.
2409
2410         * cs-parser.jay: Handle static keyword on class like instance
2411         of StaticClass.
2412
2413         * driver.cs: Added "/langversion" command line switch with two
2414         options (iso-1, default).
2415
2416 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
2417
2418         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
2419
2420 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
2421
2422         * delegate.cs: Style.
2423
2424 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2425
2426         * delegate.cs: Add seperate instance expr field for miguel.
2427
2428 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2429
2430         * PointerArithmetic (Resolve): make sure we are not doing
2431         pointer arith on void*. Also, make sure we are resolved
2432         by not setting eclass until resolve.
2433
2434         All callers: Make sure that PointerArithmetic gets resolved.
2435
2436 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2437
2438         * ArrayCreation (LookupType): If the type does not resolve 
2439         to an array, give an error.
2440
2441 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
2442
2443         * statement.cs (Try.Resolve): Fixed bug #64222
2444
2445 2004-08-27  Martin Baulig  <martin@ximian.com>
2446
2447         * class.cs
2448         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
2449         crash here.     
2450
2451 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2452
2453         * ecore.cs (Constantify): Get underlying type via
2454         System.Enum.GetUnderlyingType to avoid StackOverflow on the
2455         Windows in special cases.
2456
2457 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2458
2459         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
2460         for obtaining also private methods.
2461         (GetRemoveMethod): Used GetRemoveMethod (true)
2462         for obtaining also private methods.
2463
2464 2004-08-24  Martin Baulig  <martin@ximian.com>
2465
2466         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
2467         MethodAttributes.HideBySig for operators.
2468
2469 2004-08-23  Martin Baulig  <martin@ximian.com>
2470
2471         Back to the old error reporting system :-)
2472
2473         * report.cs (Message): Removed.
2474         (Report.MessageData, ErrorData, WarningData): Removed.
2475         (Report.Error, Warning): Back to the old system.
2476
2477 2004-08-23  Martin Baulig  <martin@ximian.com>
2478
2479         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
2480
2481         * class.cs (TypeContainer.ParentContainer): New public virtual
2482         method; replaces the explicit interface implementation.
2483         (ClassPart.ParentContainer): Override.
2484
2485 2004-08-23  Martin Baulig  <martin@ximian.com>
2486
2487         * statement.cs (Switch): Added support for constant switches; see
2488         #59428 or test-285.cs.
2489
2490 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2491
2492         Fixed bug #62740.
2493         * statement.cs (GetEnumeratorFilter): Removed useless
2494         logic because C# specs is strict. GetEnumerator must be
2495         public.
2496
2497 2004-08-22  Martin Baulig  <martin@ximian.com>
2498
2499         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2500         a switch and may break, reset the barrier.  Fixes #59867.
2501
2502 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2503
2504         CLS-Compliance speed up (~5% for corlib)
2505
2506         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
2507         New method. Tests container for CLS-Compliant names
2508
2509         * class.cs (TypeContainer.VerifyClsName): New method.
2510         Checks whether container name is CLS Compliant.
2511         (Constructor): Implements IMethodData.
2512
2513         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
2514         low-case table for CLS Compliance test.
2515         (MemberCache.VerifyClsParameterConflict): New method.
2516         Checks method parameters for CS3006 error.
2517
2518         * enum.cs (EnumMember): Is derived from MemberCore.
2519         (Enum.VerifyClsName): Optimized for better performance.
2520
2521 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2522
2523         * report.cs: Renamed Error_T to Error and changed all
2524         references.
2525
2526 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2527
2528         * class.cs (TypeContainer.IndexerArrayList): New inner class
2529         container for indexers.
2530         (TypeContainer.DefaultIndexerName): New constant for default
2531         indexer name. Replaced all "Item" with this constant.
2532         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
2533
2534         * typemanager.cs (TypeManager.default_member_ctor): Cache here
2535         DefaultMemberAttribute constructor.
2536
2537 2004-08-05  Martin Baulig  <martin@ximian.com>
2538
2539         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
2540         Fix bug #59429.
2541
2542 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
2543
2544         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
2545         multi platforms problem.
2546
2547         * compiler.csproj: Included shared files.
2548
2549 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2550
2551         Fix bug 60333, 55971 in the more general way
2552         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2553         Added arg_type argument for constant conversion.
2554         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
2555
2556 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2557
2558         Fix bug #59760
2559         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
2560         OperatorArrayList, MethodCoreArrayList for typecontainer
2561         containers. Changed class member types to these new types.
2562         (MethodArrayList.DefineMembers): Added test for CS0659.
2563
2564 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
2565
2566         * cfold.cs: Synchronize the folding with the code in expression.cs
2567         Binary.DoNumericPromotions for uint operands.
2568
2569         * attribute.cs: Revert patch from Raja, it introduced a regression
2570         while building Blam-1.2.1 (hard to isolate a test case).
2571
2572 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2573
2574         Fix for #55382
2575         * class.cs:
2576         (TypeContainer.Define): Renamed to DefineContainerMembers because of
2577         name collision.
2578         (MethodCore.parent_method): New member. The method we're overriding
2579         if this is an override method.
2580         (MethodCore.CheckBase): Moved from Method class and made common.
2581         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
2582         private.
2583         (MethodCore.CheckForDuplications): New abstract method. For custom
2584         member duplication search in a container
2585         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
2586         method and its return type.
2587         (Event.conflict_symbol): New member. Symbol with same name in the
2588         parent class.
2589
2590         * decl.cs:
2591         (MemberCache.FindMemberWithSameName): New method. The method
2592         is looking for conflict with inherited symbols.
2593
2594 2004-08-04  Martin Baulig  <martin@ximian.com>
2595
2596         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
2597
2598         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
2599
2600 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2601
2602         * report.cs (Message): New enum for better error, warning reference in
2603         the code.
2604         (MessageData): New inner abstract class. It generally handles printing of
2605         error and warning messages.
2606         Removed unused Error, Warning, Message methods.
2607
2608 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2609
2610         Fix for cs0592-8.cs test
2611         * attribute.cs
2612         (Attributable.ValidAttributeTargets): Made public.
2613         (Attribute.ExplicitTarget): New member for explicit target value.
2614         (Attribute.CheckTargets): Now we translate explicit attribute
2615         target to Target here.
2616
2617 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
2618
2619         * ecore.cs (MethodGroupExpr): new IsBase property.
2620
2621         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
2622
2623         * delegate.cs (DelegateCreation): store a MethodGroupExpr
2624         rather than an instance expr.
2625
2626         (DelegateCreation.Emit): Use the method group rather than
2627         the instance expression. Also, if you have base.Foo as the
2628         method for a delegate, make sure to emit ldftn, not ldftnvirt.
2629
2630         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
2631
2632         (NewDelegate.DoResolve): Only check for the existance of Invoke
2633         if the method is going to be needed. Use MethodGroupExpr.
2634
2635         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
2636
2637         * expression.cs: For pointer arith., make sure to use
2638         the size of the type, not the size of the pointer to
2639         the type.
2640
2641 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2642
2643         Fix for #60722
2644         * class.cs (Class): Added error CS0502 test.
2645
2646 2004-08-03  John Luke  <jluke@cfl.rr.com>
2647             Raja R Harinath  <rharinath@novell.com>
2648
2649         Fix for #60997.
2650         * attribute.cs (Attribute.complained_before): New flag.
2651         (Attribute.ResolveType, Attribute.Resolve),
2652         (Attribute.DefinePInvokeMethod): Set it.
2653         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
2654         
2655 2004-08-03  Martin Baulig  <martin@ximian.com>
2656
2657         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
2658         use a user-defined operator; we still need to do numeric
2659         promotions in case one argument is a builtin type and the other
2660         one has an implicit conversion to that type.  Fixes #62322.
2661
2662 2004-08-02  Martin Baulig  <martin@ximian.com>
2663
2664         * statement.cs (LocalInfo.Flags): Added `IsThis'.
2665         (LocalInfo.IsThis): New public property.
2666         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
2667
2668 2004-08-01  Martin Baulig  <martin@ximian.com>
2669
2670         * class.cs (TypeContainer.GetClassBases): Don't set the default
2671         here since we may get called from GetPartialBases().
2672         (TypeContainer.DefineType): If GetClassBases() didn't return a
2673         parent, use the default one.
2674
2675 2004-07-30  Duncan Mak  <duncan@ximian.com>
2676
2677         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
2678
2679 2004-07-30  Martin Baulig  <martin@ximian.com>
2680
2681         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
2682
2683         * class.cs (SourceMethod): New public class, derive from the
2684         symbol writer's ISourceMethod.
2685         (Method): Use the new symbol writer API.
2686
2687         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
2688         as argument and use the new symbol writer.
2689
2690         * location.cs
2691         (SourceFile): Implement the symbol writer's ISourceFile.
2692         (Location.SymbolDocument): Removed.
2693         (Location.SourceFile): New public property.
2694
2695         * symbolwriter.cs: Use the new symbol writer API.
2696
2697 2004-07-30  Raja R Harinath  <rharinath@novell.com>
2698
2699         * Makefile (install-local): Remove.  Functionality moved to
2700         executable.make.
2701
2702 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
2703
2704         * Makefile: Install mcs.exe.config file together with mcs.exe.
2705         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
2706         correct runtime version.
2707         
2708 2004-07-25  Martin Baulig  <martin@ximian.com>
2709
2710         * class.cs
2711         (TypeContainer.RegisterOrder): Removed, this was unused.
2712         (TypeContainer, interface_order): Removed.
2713         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
2714         TypeContainer as argument since we can also be called with a
2715         `PartialContainer' for a partial class/struct/interface.
2716         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
2717         of checking whether we're an `Interface' - we could be a
2718         `PartialContainer'.
2719         (PartialContainer.Register): Override; call
2720         AddClass()/AddStruct()/AddInterface() on our parent.
2721
2722         * cs-parser.jay (interface_member_declaration): Add things to the
2723         `current_container', not the `current_class'.
2724
2725         * rootcontext.cs (RegisterOrder): The overloaded version which
2726         takes an `Interface' was unused, removed.
2727
2728         * typemanager.cs (TypeManager.LookupInterface): Return a
2729         `TypeContainer', not an `Interface'.
2730         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
2731         contain a `PartialContainer' for an interface, so check it's
2732         `Kind' to figure out what it is.
2733
2734 2004-07-25  Martin Baulig  <martin@ximian.com>
2735
2736         * class.cs (Class.DefaultTypeAttributes): New public constant.
2737         (Struct.DefaultTypeAttributes): Likewise.
2738         (Interface.DefaultTypeAttributes): Likewise.
2739         (PartialContainer.TypeAttr): Override this and add the
2740         DefaultTypeAttributes.
2741
2742 2004-07-25  Martin Baulig  <martin@ximian.com>
2743
2744         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
2745         we can just use the `Parent' field instead.
2746
2747 2004-07-25  Martin Baulig  <martin@ximian.com>
2748
2749         * class.cs (TypeContainer.Emit): Renamed to EmitType().
2750
2751 2004-07-25  Martin Baulig  <martin@ximian.com>
2752
2753         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
2754         our parts before defining any methods.
2755         (TypeContainer.VerifyImplements): Make this virtual.
2756         (ClassPart.VerifyImplements): Override and call VerifyImplements()
2757         on our PartialContainer.
2758
2759 2004-07-25  Martin Baulig  <martin@ximian.com>
2760
2761         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
2762
2763         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
2764         argument, we can just use the `Parent' field instead.
2765
2766         * class.cs
2767         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
2768         (MemberBase.DoDefine): Likewise.
2769
2770 2004-07-24  Martin Baulig  <martin@ximian.com>
2771
2772         * decl.cs (MemberCore.Parent): New public field.
2773         (DeclSpace.Parent): Moved to MemberCore.
2774
2775         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
2776         (MemberBase.ctor): Added TypeContainer argument, pass it to our
2777         parent's .ctor.
2778         (FieldBase, Field, Operator): Likewise.
2779         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
2780         (EventField, Event): Likewise.
2781
2782 2004-07-23  Martin Baulig  <martin@ximian.com>
2783
2784         * class.cs (PartialContainer): New public class.
2785         (ClassPart): New public class.
2786         (TypeContainer): Added support for partial classes.
2787         (TypeContainer.GetClassBases): Splitted some of the functionality
2788         out into GetNormalBases() and GetPartialBases().
2789
2790         * cs-tokenizer.cs (Token.PARTIAL): New token.
2791         (Tokenizer.consume_identifier): Added some hacks to recognize
2792         `partial', but only if it's immediately followed by `class',
2793         `struct' or `interface'.
2794
2795         * cs-parser.jay: Added support for partial clases.
2796
2797 2004-07-23  Martin Baulig  <martin@ximian.com>
2798
2799         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
2800         a `DeclSpace' and also made it readonly.
2801         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
2802         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
2803         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
2804
2805         * cs-parser.jay: Pass the `current_class', not the
2806         `current_container' (at the moment, this is still the same thing)
2807         to a new Method, Property, Event, Indexer or Constructor.
2808
2809 2004-07-23  Martin Baulig  <martin@ximian.com>
2810
2811         * cs-parser.jay (CSharpParser): Added a new `current_class' field
2812         and removed the `current_interface' one.
2813         (struct_declaration, class_declaration, interface_declaration):
2814         Set `current_class' to the newly created class/struct/interface;
2815         set their `Bases' and call Register() before parsing their body.
2816
2817 2004-07-23  Martin Baulig  <martin@ximian.com>
2818
2819         * class.cs (Kind): New public enum.
2820         (TypeContainer): Made this class abstract.
2821         (TypeContainer.Kind): New public readonly field.
2822         (TypeContainer.CheckDef): New public method; moved here from
2823         cs-parser.jay.
2824         (TypeContainer.Register): New public abstract method.
2825         (TypeContainer.GetPendingImplementations): New public abstract
2826         method.
2827         (TypeContainer.GetClassBases): Removed the `is_class' and
2828         `is_iface' parameters.
2829         (TypeContainer.DefineNestedTypes): Formerly known as
2830         DoDefineType().
2831         (ClassOrStruct): Made this class abstract.
2832
2833         * tree.cs (RootTypes): New public type. 
2834
2835 2004-07-20  Martin Baulig  <martin@ximian.com>
2836
2837         * tree.cs (Tree.RecordNamespace): Removed.
2838         (Tree.Namespaces): Removed.
2839
2840         * rootcontext.cs (RootContext.IsNamespace): Removed.
2841
2842         * cs-parser.jay (namespace_declaration): Just create a new
2843         NamespaceEntry here.
2844
2845 2004-07-20  Martin Baulig  <martin@ximian.com>
2846
2847         * statement.cs (ExceptionStatement): New abstract class.  This is
2848         now used as a base class for everyone who's using `finally'.
2849         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
2850         our local variables before using them.
2851
2852         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
2853         virtual method.  This is used by Yield.Resolve() to "steal" an
2854         outer block's `finally' clauses.
2855         (FlowBranchingException): The .ctor now takes an ExceptionStatement
2856         argument.
2857
2858         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
2859         version which takes an ExceptionStatement.  This version must be
2860         used to create exception branchings.
2861
2862         * iterator.cs
2863         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
2864         (Iterator.EmitMoveNext): Added exception support; protect the
2865         block with a `fault' clause, properly handle 'finally' clauses.
2866         (Iterator.EmitDispose): Run all the `finally' clauses here.
2867
2868 2004-07-20  Martin Baulig  <martin@ximian.com>
2869
2870         * iterator.cs: This is the first of a set of changes in the
2871         iterator code.  Match the spec more closely: if we're an
2872         IEnumerable, then GetEnumerator() must be called.  The first time
2873         GetEnumerator() is called, it returns the current instance; all
2874         subsequent invocations (if any) must create a copy.
2875
2876 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
2877
2878         * expression.cs: Resolve the constant expression before returning
2879         it. 
2880
2881 2004-07-19  Martin Baulig  <martin@ximian.com>
2882
2883         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
2884         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
2885         the return type of the new EmitContext.
2886
2887 2004-07-18  Martin Baulig  <martin@ximian.com>
2888
2889         * class.cs (Property.Define): Fix iterators.
2890
2891         * iterators.cs (Iterator.Define): Moved the
2892         `container.AddInterator (this)' call here from the .ctor; only do
2893         it if we resolved successfully.
2894
2895 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
2896
2897         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
2898         `true' for preprocessing directives that we parse.  The return
2899         value indicates whether we should return to regular tokenizing or
2900         not, not whether it was parsed successfully.
2901
2902         In the past if we were in: #if false ... #line #endif, we would
2903         resume parsing after `#line'.  See bug 61604.
2904
2905         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
2906         building: IsEnumType should return true only for enums, not for
2907         enums or System.Enum itself.  This fixes #61593.
2908
2909         Likely what happened is that corlib was wrong: mcs depended on
2910         this bug in some places.  The bug got fixed, we had to add the
2911         hack, which caused bug 61593.
2912
2913         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
2914         that was a workaround for the older conditions.
2915
2916 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
2917
2918         * assign.cs: IAssignMethod has a new interface, as documented
2919         inline. All assignment code now uses this new api.
2920
2921         * ecore.cs, expression.cs: All classes which implement
2922         IAssignMethod now use the new interface.
2923
2924         * expression.cs (Invocation): add a hack to EmitCall so that
2925         IndexerAccess can be the target of a compound assignment without
2926         evaluating its arguments twice.
2927
2928         * statement.cs: Handle changes in Invocation api.
2929
2930 2004-07-16  Martin Baulig  <martin@ximian.com>
2931
2932         * iterators.cs: Rewrote this.  We're now using one single Proxy
2933         class for both the IEnumerable and the IEnumerator interface and
2934         `Iterator' derives from Class so we can use the high-level API.
2935
2936         * class.cs (TypeContainer.AddIterator): New method.
2937         (TypeContainer.DoDefineType): New protected virtual method, which
2938         is called from DefineType().
2939         (TypeContainer.DoDefineMembers): Call DefineType() and
2940         DefineMembers() on all our iterators.
2941         (TypeContainer.Emit): Call Emit() on all our iterators.
2942         (TypeContainer.CloseType): Call CloseType() on all our iterators.
2943
2944         * codegen.cs (EmitContext.CurrentIterator): New public field.
2945
2946 2004-07-15  Martin Baulig  <martin@ximian.com>
2947
2948         * typemanager.cs
2949         (TypeManager.not_supported_exception_type): New type.   
2950
2951 2004-07-14  Martin Baulig  <martin@ximian.com>
2952
2953         * iterators.cs: Use real error numbers.
2954
2955 2004-07-14  Martin Baulig  <martin@ximian.com>
2956
2957         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
2958         requires this to be a System.Collection.IEnumerable and not a
2959         class implementing that interface.
2960         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
2961
2962 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
2963
2964         * class.cs: Fixed previous fix, it broke some error tests.
2965
2966 2004-07-12  Martin Baulig  <martin@ximian.com>
2967
2968         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
2969         Fixes #61293.
2970
2971 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
2972
2973         * assign.cs (LocalTemporary): Add new argument: is_address,If
2974         `is_address' is true, then the value that we store is the address
2975         to the real value, and not the value itself.
2976         
2977         * ecore.cs (PropertyExpr): use the new local temporary
2978         stuff to allow us to handle X.Y += z (where X is a struct)
2979
2980 2004-07-08  Martin Baulig  <martin@ximian.com>
2981
2982         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
2983         not always return, just like we're doing in Using.Resolve().
2984
2985 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
2986
2987         * cs-parser.jay (fixed_statement): flag this as Pinned.
2988
2989 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
2990
2991         * typemanager.cs (TypeManager): Removed MakePinned method, this
2992         mechanism is replaced with the .NET 2.x compatible mechanism of
2993         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
2994
2995         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
2996         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
2997         `IsFixed' property which has a different meaning.
2998
2999 2004-07-02  Raja R Harinath  <rharinath@novell.com>
3000
3001         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
3002         visible from inside a nested class, not just the names of the
3003         immediately enclosing class.
3004         Fix for bug #60730.
3005
3006 2004-06-24  Raja R Harinath  <rharinath@novell.com>
3007
3008         * expression.cs (BetterConversion): Remove buggy special-case
3009         handling of "implicit constant expression conversions".  At this
3010         point, we already know that the conversion is possible -- we're
3011         only checking to see which is better.
3012
3013 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3014
3015         * cs-parser.jay: Added error CS0210 test.
3016
3017 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3018
3019         * cs-parser.jay: Added error CS0134 test.
3020
3021 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3022
3023         Fix bug #52507
3024         * cs-parser.jay: Added error CS0145 test.
3025
3026 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3027
3028         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
3029
3030 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
3031         
3032         * expression.cs (StackAlloc.Resolve): The argument may not
3033         be a constant; deal with this case.
3034         
3035 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
3036
3037         * attribute.cs (IndexerName_GetIndexerName): Renamed to
3038         GetIndexerAttributeValue.
3039         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
3040
3041         * class.cs (Indexer.Define): Added error tests for CS0415,
3042         CS0609.
3043
3044 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
3045
3046         * attribute.cs (Attribute.Resolve): Keep field code in sync with
3047         property code.
3048
3049 2004-06-23  Martin Baulig  <martin@ximian.com>
3050
3051         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
3052         neither return nor throw, reset the barrier as well.  Fixes #60457.
3053
3054 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
3055
3056         * class.cs : EventAttributes is now set to None by default.
3057           This fixes bug #60459.
3058
3059 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
3060
3061         Fix bug #60219
3062         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
3063         Don't throw exception but return null (it's sufficient now).
3064
3065 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
3066
3067         * typemanager.cs (GetArgumentTypes): Faster implementation.
3068
3069 2004-06-18  Martin Baulig  <martin@ximian.com>
3070
3071         * attribute.cs (Attribute.Resolve): Check whether we're an
3072         EmptyCast which a Constant child.  Fixes #60333.
3073
3074 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
3075
3076         * statement.cs (EmitCollectionForeach): Account for the fact that
3077         not all valuetypes are in areas which we can take the address of.
3078         For these variables, we store to a temporary variable. Also, make
3079         sure that we dont emit a `callvirt' on a valuetype method.
3080
3081 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3082
3083         * expression.cs (StackAlloc.DoReSolve): Added test for
3084         negative parameter (CS0247).
3085
3086 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3087
3088         Fix bug #59792
3089         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
3090
3091 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3092
3093         Fix bug #59781
3094         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
3095         ulong.
3096
3097 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
3098
3099         Fix bug #58254 & cs1555.cs, cs1556.cs
3100         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
3101
3102 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
3103
3104         * cs-parser.jay: Added error CS1669 test for indexers.
3105
3106 2004-06-11  Martin Baulig  <martin@ximian.com>
3107
3108         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
3109         call this twice: for params and varargs methods.
3110
3111 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
3112
3113         * class.cs:
3114         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
3115
3116 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
3117
3118         * attribute.cs (Attribute.GetValidTargets): Made public.
3119
3120         * class.cs: 
3121         (AbstractPropertyEventMethod): New class for better code sharing.
3122         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
3123         CS1667 report.
3124         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
3125
3126 2004-06-11  Raja R Harinath  <rharinath@novell.com>
3127
3128         Fix bug #59477.
3129         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
3130         that the call to Resolve is part of a MemberAccess.
3131         (Expression.Resolve): Use it for SimpleName resolution.
3132         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
3133         Add 'intermediate' boolean argument.
3134         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
3135         error message when the SimpleName can be resolved ambiguously
3136         between an expression and a type.
3137         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
3138         public.
3139         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
3140         call on the left-side.
3141
3142 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
3143
3144         * class.cs:
3145         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
3146
3147 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
3148
3149         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
3150
3151 2004-06-11  Martin Baulig  <martin@ximian.com>
3152
3153         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
3154         varargs methods if applicable.
3155
3156 2004-06-11  Martin Baulig  <martin@ximian.com>
3157
3158         * expression.cs (Invocation.EmitCall): Don't use
3159         `method.CallingConvention == CallingConventions.VarArgs' since the
3160         method could also have `CallingConventions.HasThis'.
3161
3162 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
3163
3164         * class.cs (Event.GetSignatureForError): Implemented.
3165         Fixed crash in error test cs3010.cs
3166
3167 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
3168
3169         * cs-tokenizer.cs: Change the way we track __arglist to be
3170         consistent with the other keywords.
3171
3172 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
3173
3174         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
3175         tomorrow.
3176
3177 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
3178
3179         * codegen.cs: Check that all referenced assemblies have a strongname
3180         before strongnaming the compiled assembly. If not report error CS1577.
3181         Fix bug #56563. Patch by Jackson Harper.
3182         * typemanager.cs: Added a method to return all referenced assemblies.
3183         Fix bug #56563. Patch by Jackson Harper.
3184
3185 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
3186
3187         * class.cs:
3188         (Method.ApplyAttributeBuilder): Moved and added conditional
3189         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
3190
3191         * delegate.cs:
3192         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
3193
3194 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
3195
3196         Fixed #59640
3197         * class.cs: (EventField.attribute_targets): Changed default target.
3198
3199 2004-06-08  Martin Baulig  <martin@ximian.com>
3200
3201         * expression.cs (Invocation.EmitCall): Enable varargs methods.
3202
3203 2004-06-08  Martin Baulig  <martin@ximian.com>
3204
3205         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
3206
3207 2004-06-07  Martin Baulig  <martin@ximian.com>
3208
3209         Added support for varargs methods.
3210
3211         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
3212         keyword.
3213
3214         * cs-parser.jay: Added support for `__arglist'.
3215
3216         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
3217
3218         * expression.cs (Argument.AType): Added `ArgList'.
3219         (Invocation): Added support for varargs methods.
3220         (ArglistAccess): New public class.
3221         (Arglist): New public class.
3222
3223         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
3224
3225         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
3226         a method's top-level block if the method has varargs.
3227
3228         * support.cs (ReflectionParameters, InternalParameters): Added
3229         support for varargs methods.    
3230
3231 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
3232
3233         * class.cs: Provide location in indexer error report.
3234
3235         * driver.cs: Use standard names.
3236
3237         * namespace.cs: Catch the use of using after a namespace has been
3238         declared also on using aliases.
3239
3240 2004-06-03  Raja R Harinath  <rharinath@novell.com>
3241
3242         Bug #50820.
3243         * typemanager.cs (closure_private_ok, closure_invocation_type)
3244         (closure_qualifier_type, closure_invocation_assembly)
3245         (FilterWithClosure): Move to ...
3246         (Closure): New internal nested class.
3247         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
3248         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
3249         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
3250         (MemberLookup, MemberLookupFailed): Use it.
3251         * expression.cs (New.DoResolve): Treat the lookup for the
3252         constructor as being qualified by the 'new'ed type.
3253         (Indexers.GetIndexersForTypeOrInterface): Update.
3254
3255 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
3256
3257         * attribute.cs
3258         (GetConditionalAttributeValue): New method. Returns
3259         condition of ConditionalAttribute.
3260         (SearchMulti): New method.  Returns all attributes of type 't'.
3261         Use it when attribute is AllowMultiple = true.
3262         (IsConditionalMethodExcluded): New method.
3263
3264         * class.cs
3265         (Method.IsExcluded): Implemented. Returns true if method has conditional
3266         attribute and the conditions is not defined (method is excluded).
3267         (IMethodData): Extended interface for ConditionalAttribute support.
3268         (PropertyMethod.IsExcluded): Implemented.
3269
3270         * decl.cs
3271         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
3272
3273         * expression.cs
3274         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
3275         on the method.
3276
3277 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
3278
3279         * expression.cs (ArrayCreationExpression): Make this just an
3280         `expression'. It can't be a statement, so the code here was
3281         dead.
3282
3283 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
3284
3285         Fixed #59072
3286         * typemanager.cs (GetFullNameSignature): New method for
3287         MethodBase types.
3288
3289 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
3290
3291         Fixed #56452
3292         * class.cs (MemberBase.GetSignatureForError): New virtual method.
3293         Use this method when MethodBuilder is null.
3294         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
3295         Added test for error CS0626 (MONO reports error for this situation).
3296         (IMethodData.GetSignatureForError): Extended interface.
3297
3298 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
3299
3300         * attribute.cs
3301         (AttributeTester.GetObsoleteAttribute): Returns instance of
3302         ObsoleteAttribute when type is obsolete.
3303
3304         * class.cs
3305         (TypeContainer.VerifyObsoleteAttribute): Override.
3306         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
3307         (MethodCode.VerifyObsoleteAttribute): Override.
3308         (MemberBase.VerifyObsoleteAttribute): Override.
3309
3310         * decl.cs
3311         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
3312         and report proper error.
3313
3314         *delegate.cs
3315         Delegate.VerifyObsoleteAttribute): Override.
3316
3317         * ecore.cs
3318         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
3319         and report proper error.
3320         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
3321
3322         * enum.cs
3323         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
3324         and enum member.
3325
3326         * expression.cs
3327         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
3328         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
3329         Added test for ObsoleteAttribute.
3330
3331         * statement.cs
3332         (Catch): Derived from Statement.
3333
3334 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
3335  
3336         Fixed bug #59071 & cs0160.cs
3337  
3338         * statement.cs (Try.Resolve): Check here whether order of catch
3339         clauses matches their dependencies.
3340
3341 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
3342
3343         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
3344         caused a regression: #59343.  Referencing nested classes from an
3345         assembly stopped working.
3346
3347 2004-05-31  Martin Baulig  <martin@ximian.com>
3348
3349         MCS is now frozen for beta 2.
3350
3351 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3352
3353         * convert.cs: add a trivial cache for overload operator resolution.
3354
3355 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3356
3357         * decl.cs: If possible, use lookuptypedirect here. We can only do
3358         this if there is no `.' after the namespace. Avoids using
3359         LookupType, which does lots of slow processing.
3360         (FindNestedType) New method, does what it says :-).
3361         * namespace.cs: use LookupTypeDirect.
3362         * rootcontext.cs: use membercache, if possible.
3363         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
3364
3365 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3366
3367         * expression.cs:
3368         According to the spec, 
3369
3370         In a member access of the form E.I, if E is a single identifier,
3371         and if the meaning of E as a simple-name (§7.5.2) is a constant,
3372         field, property, localvariable, or parameter with the same type as
3373         the meaning of E as a type-name (§3.8), then both possible
3374         meanings of E are permitted.
3375
3376         We did not check that E as a simple-name had the same type as E as
3377         a type name.
3378
3379         This trivial check gives us 5-7% on bootstrap time.
3380
3381 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3382
3383         * expression.cs (Invocation.OverloadResolve): Avoid the
3384         use of hashtables and boxing here by allocating on demand.
3385
3386 2004-05-30  Martin Baulig  <martin@ximian.com>
3387
3388         * rootcontext.cs (RootContext.LookupType): Don't cache things if
3389         we're doing a silent lookup.  Don't try to lookup nested types in
3390         TypeManager.object_type (thanks to Ben Maurer).
3391
3392 2004-05-30  Martin Baulig  <martin@ximian.com>
3393
3394         Committing a patch from Ben Maurer.
3395
3396         * rootcontext.cs (RootContext.LookupType): Cache negative results.
3397
3398 2004-05-29  Martin Baulig  <martin@ximian.com>
3399
3400         * class.cs (IMethodData.ShouldIgnore): New method.
3401
3402         * typemanager.cs (TypeManager.MethodFlags): Don't take a
3403         `Location' argument, we don't need it anywhere.  Use
3404         `IMethodData.ShouldIgnore ()' instead of
3405         `MethodData.GetMethodFlags ()'.
3406         (TypeManager.AddMethod): Removed.
3407         (TypeManager.AddMethod2): Renamed to AddMethod.
3408
3409 2004-05-29  Martin Baulig  <martin@ximian.com>
3410
3411         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
3412
3413         * convert.cs (Convert.ImplicitReferenceConversion): If we're
3414         converting from a class type S to an interface type and we already
3415         have an object on the stack, don't box it again.  Fixes #52578.
3416
3417 2004-05-29  Martin Baulig  <martin@ximian.com>
3418
3419         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
3420         Added support for `params' parameters.  Fixes #59267.
3421
3422 2004-05-29  Martin Baulig  <martin@ximian.com>
3423
3424         * literal.cs (NullPointer): Provide a private .ctor which sets
3425         `type' to TypeManager.object_type.  Fixes #59048.
3426
3427 2004-05-29  Martin Baulig  <martin@ximian.com>
3428
3429         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
3430         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
3431
3432         * ecore.cs (EventExpr.instance_expr): Make the field private.
3433
3434 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
3435
3436         Fixed bug #50080 & cs0214-2.cs
3437         * expression.cs (Cast.DoResolve): Check unsafe context here.
3438         
3439         * statement.cs (Resolve.DoResolve): Likewise.
3440
3441 2004-05-26  Martin Baulig  <martin@ximian.com>
3442
3443         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
3444
3445         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
3446         (RootContext.LookupType): Pass down the `silent' flag.
3447
3448 2004-05-25  Martin Baulig  <martin@ximian.com>
3449
3450         * expression.cs
3451         (MethodGroupExpr.IdenticalTypeName): New public property.
3452         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
3453         expression actually refers to a type.
3454
3455 2004-05-25  Martin Baulig  <martin@ximian.com>
3456
3457         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
3458         for #56176 and made it actually work.
3459
3460 2004-05-25  Martin Baulig  <martin@ximian.com>
3461
3462         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
3463         (FieldExpr, PropertyExpr): Override and implement
3464         CacheTemporaries.  Fixes #52279.
3465
3466 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
3467
3468         * location.cs: In the new compiler listing a file twice is a
3469         warning, not an error.
3470
3471 2004-05-24  Martin Baulig  <martin@ximian.com>
3472
3473         * enum.cs (Enum.DefineType): For the `BaseType' to be a
3474         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
3475
3476 2004-05-24  Martin Baulig  <martin@ximian.com>
3477
3478         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
3479         walking the `using' list.  Fixes #53921.
3480
3481 2004-05-24  Martin Baulig  <martin@ximian.com>
3482
3483         * const.cs (Const.LookupConstantValue): Added support for
3484         EmptyCast's; fixes #55251.
3485
3486 2004-05-24  Martin Baulig  <martin@ximian.com>
3487
3488         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
3489         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
3490         which does the CS0135 check.  The reason is that we first need to
3491         check whether the variable actually exists.
3492
3493 2004-05-24  Martin Baulig  <martin@ximian.com>
3494
3495         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
3496         than RootContext.LookupType() to find the explicit interface
3497         type.  Fixes #58584.
3498
3499 2004-05-24  Raja R Harinath  <rharinath@novell.com>
3500
3501         * Makefile: Simplify.  Use executable.make.
3502         * mcs.exe.sources: New file.  List of sources of mcs.exe.
3503
3504 2004-05-24  Anders Carlsson  <andersca@gnome.org>
3505
3506         * decl.cs:
3507         * enum.cs:
3508         Use the invariant culture when doing String.Compare for CLS case
3509         sensitivity.
3510         
3511 2004-05-23  Martin Baulig  <martin@ximian.com>
3512
3513         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
3514         don't have any dots.  Fixes #52622, added cs0246-8.cs.
3515
3516         * namespace.cs (NamespaceEntry.Lookup): Likewise.
3517         
3518 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3519
3520         * class.cs (MemberBase.Define): Reuse MemberType member for 
3521         resolved type. Other methods can use it too.
3522
3523 2004-05-23  Martin Baulig  <martin@ximian.com>
3524
3525         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
3526         the variable also exists in the current block (otherwise, we need
3527         to report a CS0103).  Fixes #58670.
3528
3529 2004-05-23  Martin Baulig  <martin@ximian.com>
3530
3531         * flowanalysis.cs (Reachability.Reachable): Compute this
3532         on-the-fly rather than storing it as a field.
3533
3534 2004-05-23  Martin Baulig  <martin@ximian.com>
3535
3536         * flowanalysis.cs (Reachability.And): Manually compute the
3537         resulting `barrier' from the reachability.      
3538        
3539 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3540
3541         Fix bug #57835
3542         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
3543         instance of ObsoleteAttribute when symbol is obsolete.
3544
3545         * class.cs
3546         (IMethodData): Extended interface for ObsoleteAttribute support.
3547
3548 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3549
3550         * attribute.cs: Fix bug #55970
3551
3552 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3553
3554         Fix bug #52705
3555         * attribute.cs
3556         (GetObsoleteAttribute): New method. Creates the instance of
3557         ObsoleteAttribute.
3558         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
3559         ObsoleteAttribute when member is obsolete.
3560         (AttributeTester.Report_ObsoleteMessage): Common method for
3561         Obsolete error/warning reporting.
3562
3563         * class.cs
3564         (TypeContainer.base_classs_type): New member for storing parent type.
3565
3566         * decl.cs
3567         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
3568         for this MemberCore.
3569
3570 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3571
3572         * attribute.cs, const.cs: Fix bug #58590
3573
3574 2004-05-21  Martin Baulig  <martin@ximian.com>
3575
3576         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
3577         out parameters if the end of the method is unreachable.  Fixes
3578         #58098. 
3579
3580 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3581
3582         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
3583         Hari was right, why extra method.
3584
3585 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3586
3587         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
3588
3589 2004-05-20  Martin Baulig  <martin@ximian.com>
3590
3591         Merged this back from gmcs to keep the differences to a minumum.
3592
3593         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
3594         instead of a Declspace.
3595         (Attribute.ResolveType): Likewise.
3596         (Attributes.Search): Likewise.
3597         (Attributes.Contains): Likewise.
3598         (Attributes.GetClsCompliantAttribute): Likewise.
3599
3600         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
3601         argument.
3602         (MethodData.ApplyAttributes): Take an EmitContext instead of a
3603         DeclSpace.
3604
3605 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
3606
3607         Fix bug #58688 (MCS does not report error when the same attribute
3608         is assigned twice)
3609
3610         * attribute.cs (Attribute.Emit): Distinction between null and default.
3611
3612 2004-05-19  Raja R Harinath  <rharinath@novell.com>
3613
3614         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
3615         of a top-level attribute without an attribute target.
3616         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
3617         Make non-static.
3618         (Attribute.Conditional_GetConditionName), 
3619         (Attribute.Obsolete_GetObsoleteMessage): Update.
3620         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
3621         part of ScanForIndexerName.
3622         (Attribute.CanIgnoreInvalidAttribute): New function.
3623         (Attribute.ScanForIndexerName): Move to ...
3624         (Attributes.ScanForIndexerName): ... here.
3625         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
3626         (Attributes.Search): New internal variant that can choose not to
3627         complain if types aren't resolved.  The original signature now
3628         complains.
3629         (Attributes.GetClsCompliantAttribute): Use internal variant, with
3630         complaints suppressed.
3631         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
3632         only if it not useful.
3633         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
3634         top-level for attributes that are shared between the assembly
3635         and a top-level class.
3636         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
3637         * class.cs: Update to reflect changes.
3638         (DefineIndexers): Fuse loops.
3639         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
3640         a couple more variants of attribute names.
3641
3642 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
3643
3644         Fix bug #52585 (Implemented explicit attribute declaration)
3645
3646         * attribute.cs:
3647         (Attributable.ValidAttributeTargets): New abstract method. It gets
3648         list of valid attribute targets for explicit target declaration.
3649         (Attribute.Target): It holds target itself.
3650         (AttributeSection): Removed.
3651         (Attribute.CheckTargets): New method. It checks whether attribute
3652         target is valid for the current element.
3653
3654         * class.cs:
3655         (EventProperty): New class. For events that are declared like
3656         property (with add and remove accessors).
3657         (EventField): New class. For events that are declared like field.
3658         class.cs
3659
3660         * cs-parser.jay: Implemented explicit attribute target declaration.
3661
3662         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
3663         Override ValidAttributeTargets.
3664
3665         * parameter.cs:
3666         (ReturnParameter): Class for applying custom attributes on 
3667         the return type.
3668         (ParameterAtribute): New class. Class for applying custom
3669         attributes on the parameter type.
3670
3671 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
3672
3673         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
3674         definitions. 
3675
3676         (Method): Allow UNSAFE here.
3677
3678         * modifiers.cs: Support unsafe reporting.
3679
3680 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
3681
3682         * decl.cs: Fix bug #58478.
3683
3684 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3685
3686         * statement.cs: When checking for unreachable code on an EmptyStatement,
3687         set the location. Fixes bug #58488.
3688
3689 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
3690
3691         * driver.cs: Add -pkg handling.
3692
3693         From Gonzalo: UseShelLExecute=false
3694
3695 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
3696
3697         * attribute.cs:
3698         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
3699         for attribute.
3700         (Attribute.IsClsCompliaceRequired): Moved to base for better
3701         accesibility.
3702         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
3703         when attribute is AttributeUsageAttribute.
3704         (Attribute.GetValidTargets): Simplified.
3705         (Attribute.GetAttributeUsage): New method returns AttributeUsage
3706         attribute for this type.
3707         (Attribute.ApplyAttributes): Method renamed to Emit and make
3708         non-static.
3709         (GlobalAttributeSection): New class for special handling of global
3710         attributes (assembly, module).
3711         (AttributeSection.Emit): New method.
3712
3713         * class.cs: Implemented Attributable abstract methods.
3714         (MethodCore.LabelParameters): Moved to Parameter class.
3715         (Accessor): Is back simple class.
3716         (PropertyMethod): Implemented Attributable abstract class.
3717         (DelegateMethod): Implemented Attributable abstract class.
3718         (Event): New constructor for disctintion between normal Event
3719         and Event with accessors.
3720
3721         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
3722
3723         * codegen.cs, const.cs, decl.cs, delegate.cs:
3724         (CommonAssemblyModulClass): Implemented Attributable abstract class
3725         and simplified.
3726
3727         * enum.cs: Implement IAttributeSupport interface.
3728         (EnumMember): New class for emum members. Implemented Attributable
3729         abstract class
3730
3731         * parameter.cs:
3732         (ParameterBase): Is abstract.
3733         (ReturnParameter): New class for easier [return:] attribute handling.
3734
3735         * typemanager.cs: Removed builder_to_attr.
3736
3737 2004-05-11  Raja R Harinath  <rharinath@novell.com>
3738
3739         Fix bug #57151.
3740         * attribute.cs (Attribute.GetPositionalValue): New function.
3741         * class.cs (TypeContainer.VerifyMembers): New function.
3742         (TypeContainer.Emit): Use it.
3743         (ClassOrStruct): New base class for Class and Struct.
3744         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
3745         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
3746         class.
3747         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
3748         then each non-static field should have a FieldOffset attribute.
3749         Otherwise, none of the fields should have a FieldOffset attribute.
3750         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
3751         and FieldOffset attributes.
3752         * typemanager.cs (TypeManager.struct_layout_attribute_type)
3753         (TypeManager.field_offset_attribute_type): New core types.
3754         (TypeManager.InitCoreTypes): Initialize them.
3755
3756 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
3757
3758         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
3759         Return correct type.
3760         From bug #58270.
3761
3762 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
3763
3764         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
3765         be implicitly converted to ulong.
3766         
3767         * expression.cs: The logic for allowing operator &, | and ^ worked
3768         was wrong, it worked before because we did not report an error in
3769         an else branch.  Fixes 57895.
3770
3771         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
3772         allow volatile fields to be reference types.
3773
3774 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
3775
3776         * driver.cs: Add support for /debug-
3777
3778 2004-05-07  Raja R Harinath  <rharinath@novell.com>
3779
3780         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
3781         Add a 'complain' parameter to silence errors.
3782         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
3783         silently overlooked type-resolutions.
3784         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
3785         to reflect changes.
3786         (Attributes.Search): New function.
3787         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
3788         (Attributes.GetAttributeFullName): Remove hack.
3789         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
3790         Update to reflect changes.
3791         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
3792         Use Attributes.Search instead of nested loops.
3793
3794 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
3795
3796         * decl.cs:
3797         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
3798         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
3799         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
3800
3801         * report.cs: (Report.Warning): Renamed to Warning_T because of
3802         parameter collision.
3803
3804 2004-05-05  Raja R Harinath  <rharinath@novell.com>
3805
3806         * expression.cs (MemberAccess.ResolveMemberAccess):
3807         Exit with non-zero status after Report.Error.
3808         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
3809         Likewise.
3810         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
3811
3812 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3813
3814         * support.cs: Don't hang when the file is empty.
3815
3816 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3817
3818         * support.cs: In SeekableStreamReader, compute the preamble size of the
3819           underlying stream. Position changes should take into account that initial
3820           count of bytes.
3821
3822 2004-05-03  Todd Berman  <tberman@sevenl.net>
3823
3824         * driver.cs: remove unused GetSysVersion function.
3825
3826 2004-05-03  Todd Berman  <tberman@sevenl.net>
3827
3828         * driver.cs: Remove the hack from saturday, as well as the hack
3829         from jackson (LoadAssemblyFromGac), also adds the CWD to the
3830         link_paths to get that bit proper.
3831
3832 2004-05-01  Todd Berman  <tberman@sevenl.net>
3833
3834         * driver.cs: Try a LoadFrom before a Load, this checks the current
3835         path. This is currently a bug in mono that is be fixed, however, this
3836         provides a workaround for now. This will be removed when the bug
3837         is fixed.
3838
3839 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
3840
3841         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3842         incomplete key pairs (#57941).
3843
3844 2004-05-01  Todd Berman  <tberman@sevenl.net>
3845
3846         * driver.cs: Remove '.' from path_chars, now System.* loads properly
3847         from the GAC
3848
3849 2004-04-30  Jackson Harper  <jackson@ximian.com>
3850
3851         * codegen.cs: Open keys readonly.
3852         
3853 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3854
3855         * typemanager.cs: don't report cyclic struct layout when a struct
3856         contains 2 or more fields of the same type. Failed for Pango.AttrShape
3857         which has 2 Pango.Rectangle fields.
3858
3859 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3860
3861         * expression.cs: Handle IntPtr comparisons with IL code
3862         rather than a method call.
3863
3864 2004-04-29  Martin Baulig  <martin@ximian.com>
3865
3866         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
3867         the list of PropertyInfo's in class hierarchy and find the
3868         accessor.  Fixes #56013.
3869
3870 2004-04-29  Martin Baulig  <martin@ximian.com>
3871
3872         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
3873
3874 2004-04-29  Martin Baulig  <martin@ximian.com>
3875
3876         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3877
3878         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
3879
3880 2004-04-29  Martin Baulig  <martin@ximian.com>
3881
3882         * class.cs (ConstructorInitializer.Resolve): Check whether the
3883         parent .ctor is accessible.  Fixes #52146.
3884
3885 2004-04-29  Martin Baulig  <martin@ximian.com>
3886
3887         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3888
3889         * statement.cs (Using.EmitLocalVariableDecls): Use
3890         TypeManager.idisposable_type, not typeof (IDisposable).
3891         (Foreach.EmitCollectionForeach): Added support for valuetypes.
3892
3893 2004-04-29  Martin Baulig  <martin@ximian.com>
3894
3895         * class.cs (Event.Define): Don't emit the field and don't set
3896         RTSpecialName and SpecialName for events on interfaces.  Fixes
3897         #57703. 
3898
3899 2004-04-29  Raja R Harinath  <rharinath@novell.com>
3900
3901         Refactor Attribute.ApplyAttributes.
3902         * attribute.cs (Attributable): New base class for objects that can
3903         have Attributes applied on them.
3904         (Attribute): Make AttributeUsage fields public.
3905         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
3906         (Attribute.IsInternalCall): New property.
3907         (Attribute.UsageAttr): Convert to a public read-only property.
3908         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
3909         (Attribute.ResolveType, Attribute.Resolve)
3910         (Attribute.ScanForIndexerName): Update to reflect changes.
3911         (Attribute.CheckAttributeTarget): Re-format.
3912         (Attribute.ApplyAttributes): Refactor, to various
3913         Attributable.ApplyAttributeBuilder methods.
3914         * decl.cs (MemberCore): Make Attributable.
3915         * class.cs (Accessor): Make Attributable.
3916         (MethodData.ApplyAttributes): Use proper attribute types, not
3917         attribute names.
3918         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
3919         (TypeContainer.ApplyAttributeBuilder)
3920         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
3921         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
3922         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
3923         (Operator.ApplyAttributeBuilder): New factored-out methods.
3924         * const.cs (Const.ApplyAttributeBuilder): Likewise.
3925         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
3926         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
3927         * parameter.cs (ParameterBase): New Attributable base class
3928         that can also represent Return types.
3929         (Parameter): Update to the changes.
3930
3931 2004-04-29  Jackson Harper  <jackson@ximian.com>
3932
3933         * driver.cs: Prefer the corlib system version when looking for
3934         assemblies in the GAC. This is still a hack, but its a better hack
3935         now.
3936         
3937 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
3938
3939         * decl.cs, enum.cs: Improved error 3005 reporting.
3940   
3941         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
3942         (related_symbols): New private member for list of symbols
3943         related to reported error/warning.
3944         
3945         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
3946
3947 2004-04-29  Martin Baulig  <martin@ximian.com>
3948
3949         * ecore.cs (Expression.Constantify): If we're an enum and
3950         TypeManager.TypeToCoreType() doesn't give us another type, use
3951         t.UnderlyingSystemType.  Fixes #56178.  
3952
3953 2004-04-29  Martin Baulig  <martin@ximian.com>
3954
3955         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
3956         interfaces and for each interface, only add members directly
3957         declared in that interface.  Fixes #53255.
3958
3959 2004-04-28  Martin Baulig  <martin@ximian.com>
3960
3961         * expression.cs (ConditionalLogicalOperator): Use a temporary
3962         variable for `left' to avoid that we evaluate it more than once;
3963         bug #52588.
3964
3965 2004-04-28  Martin Baulig  <martin@ximian.com>
3966
3967         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
3968         `void[]' (CS1547).
3969
3970 2004-04-28  Martin Baulig  <martin@ximian.com>
3971
3972         * statement.cs (LocalInfo.Resolve): Check whether the type is not
3973         void (CS1547).
3974
3975         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
3976         whether the type is not void (CS1547).
3977
3978 2004-04-28  Martin Baulig  <martin@ximian.com>
3979
3980         * expression.cs (Unary.DoResolveLValue): Override this and report
3981         CS0131 for anything but Operator.Indirection.
3982
3983 2004-04-28  Martin Baulig  <martin@ximian.com>
3984
3985         Committing a patch from Ben Maurer; see bug #50820.
3986
3987         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3988         check for classes.
3989
3990         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3991         classes.        
3992
3993 2004-04-28  Martin Baulig  <martin@ximian.com>
3994
3995         Committing a patch from Ben Maurer; see bug #50820.
3996
3997         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3998         check for classes.
3999
4000         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
4001         classes.        
4002
4003 2004-04-28  Martin Baulig  <martin@ximian.com>
4004
4005         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
4006         (Block.AddLabel): Call DoLookupLabel() to only search in the
4007         current block.
4008
4009 2004-04-28  Martin Baulig  <martin@ximian.com>
4010
4011         * cfold.cs (ConstantFold.BinaryFold): Added special support for
4012         comparing StringConstants and NullLiterals in Equality and Inequality.
4013
4014 2004-04-28  Jackson Harper  <jackson@ximian.com>
4015
4016         * driver.cs: Attempt to load referenced assemblies from the
4017         GAC. This is the quick and dirty version of this method that
4018         doesnt take into account versions and just takes the first
4019         canidate found. Will be good enough for now as we will not have more
4020         then one version installed into the GAC until I update this method.
4021
4022 2004-04-28  Martin Baulig  <martin@ximian.com>
4023
4024         * typemanager.cs (TypeManager.CheckStructCycles): New public
4025         static method to check for cycles in the struct layout.
4026
4027         * rootcontext.cs (RootContext.PopulateTypes): Call
4028         TypeManager.CheckStructCycles() for each TypeContainer.
4029         [Note: We only need to visit each type once.]
4030
4031 2004-04-28  Martin Baulig  <martin@ximian.com>
4032
4033         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
4034
4035         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
4036         success and added `out object value'.  Use a `bool resolved' field
4037         to check whether we've already been called rather than
4038         `ConstantValue != null' since this breaks for NullLiterals.
4039
4040 2004-04-28  Raja R Harinath  <rharinath@novell.com>
4041
4042         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
4043         setting of this flag, since the 'set' method may be non-public.
4044
4045 2004-04-28  Raja R Harinath  <rharinath@novell.com>
4046
4047         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
4048         check on current_vector.Block.
4049
4050 2004-04-27  Martin Baulig  <martin@ximian.com>
4051
4052         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
4053         a field initializer.  Fixes #56459.
4054
4055 2004-04-27  Martin Baulig  <martin@ximian.com>
4056
4057         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
4058         we're not attempting to use an indexer.  Fixes #52154.
4059
4060 2004-04-27  Martin Baulig  <martin@ximian.com>
4061
4062         * statement.cs (Return): Don't create a return label if we don't
4063         need it; reverts my change from January 20th.  Thanks to Ben
4064         Maurer for this.
4065
4066 2004-04-27  Martin Baulig  <martin@ximian.com>
4067
4068         According to the spec, `goto' can only leave a nested scope, but
4069         never enter it.
4070
4071         * statement.cs (Block.LookupLabel): Only lookup in the current
4072         block, don't recurse into parent or child blocks.
4073         (Block.AddLabel): Check in parent and child blocks, report
4074         CS0140/CS0158 if we find a duplicate.
4075         (Block): Removed this indexer for label lookups.
4076         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
4077         this already does the error reporting for us.
4078
4079         * flowanalysis.cs
4080         (FlowBranching.UsageVector.Block): New public variable; may be null.
4081         (FlowBranching.CreateSibling): Added `Block' argument.
4082         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
4083         label for the target of a `goto' and check whether we're not
4084         leaving a `finally'.
4085
4086 2004-04-27  Martin Baulig  <martin@ximian.com>
4087
4088         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
4089         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
4090         just for returns).
4091
4092 2004-04-27  Martin Baulig  <martin@ximian.com>
4093
4094         * statement.cs (Block.AddLabel): Also check for implicit blocks
4095         and added a CS0158 check.
4096
4097 2004-04-27  Martin Baulig  <martin@ximian.com>
4098
4099         * flowanalysis.cs (FlowBranchingLoop): New class.
4100         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
4101         UsageVector's instead of an ArrayList.
4102         (FlowBranching.Label): Likewise.
4103         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
4104         (FlowBranching.AddBreakVector): New method.
4105
4106 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
4107
4108         * attribute.cs: Small regression fix: only convert the type if we
4109         the type is different, fixes System.Drawing build.
4110
4111 2004-04-27  Martin Baulig  <martin@ximian.com>
4112
4113         * attribute.cs (Attribute.Resolve): If we have a constant value
4114         for a named field or property, implicity convert it to the correct
4115         type.
4116
4117 2004-04-27  Raja R Harinath  <rharinath@novell.com>
4118
4119         * statement.cs (Block.Block): Implicit blocks share
4120         'child_variable_names' fields with parent blocks.
4121         (Block.AddChildVariableNames): Remove.
4122         (Block.AddVariable): Mark variable as "used by a child block" in
4123         every surrounding block.
4124         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
4125         been used in a child block, complain about violation of "Invariant
4126         meaning in blocks" rule.
4127         * cs-parser.jay (declare_local_variables): Don't use
4128         AddChildVariableNames.
4129         (foreach_statement): Don't create an implicit block: 'foreach'
4130         introduces a scope.
4131
4132 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
4133
4134         * convert.cs (ImplicitNumericConversion): 0 is also positive when
4135         converting from 0L to ulong.  Fixes 57522.
4136
4137 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
4138
4139         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
4140         derived class hides via 'new' keyword field from base class (test-242.cs).
4141         TODO: Handle this in the more general way.
4142         
4143         * class.cs (CheckBase): Ditto.
4144
4145 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
4146
4147         * decl.cs (caching_flags): New member for storing cached values
4148         as bit flags.
4149         (MemberCore.Flags): New enum where bit flags for caching_flags
4150         are defined.
4151         (MemberCore.cls_compliance): Moved to caching_flags.
4152         (DeclSpace.Created): Moved to caching_flags.
4153
4154         * class.cs: Use caching_flags instead of DeclSpace.Created
4155         
4156 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
4157
4158         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
4159         if we are only a derived class, not a nested class.
4160
4161         * typemanager.cs: Same as above, but do this at the MemberLookup
4162         level (used by field and methods, properties are handled in
4163         PropertyExpr).   Allow for the qualified access if we are a nested
4164         method. 
4165
4166 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
4167
4168         * class.cs: Refactoring.
4169         (IMethodData): New inteface; Holds links to parent members
4170         to avoid member duplication (reduced memory allocation).
4171         (Method): Implemented IMethodData interface.
4172         (PropertyBase): New inner classes for get/set methods.
4173         (PropertyBase.PropertyMethod): Implemented IMethodData interface
4174         (Event): New inner classes for add/remove methods.
4175         (Event.DelegateMethod): Implemented IMethodData interface.
4176
4177         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
4178         EmitContext (related to class.cs refactoring).
4179
4180 2004-04-21  Raja R Harinath  <rharinath@novell.com>
4181
4182         * delegate.cs (Delegate.VerifyApplicability): If the number of
4183         arguments are the same as the number of parameters, first try to
4184         verify applicability ignoring  any 'params' modifier on the last
4185         parameter.
4186         Fixes #56442.
4187
4188 2004-04-16  Raja R Harinath  <rharinath@novell.com>
4189
4190         * class.cs (TypeContainer.AddIndexer): Use
4191         'ExplicitInterfaceName' to determine if interface name was
4192         explicitly specified.  'InterfaceType' is not initialized at this time.
4193         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
4194         Indexers array is already in the required order.  Initialize
4195         'IndexerName' only if there are normal indexers.
4196         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
4197         (TypeContainer.Emit): Emit DefaultMember attribute only if
4198         IndexerName is initialized.
4199         Fixes #56300.
4200
4201 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
4202
4203         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
4204         Fixes #57007
4205
4206 2004-04-15  Raja R Harinath  <rharinath@novell.com>
4207
4208         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
4209         attributes.
4210         Fix for #56456.
4211
4212         * attribute.cs (Attribute.Resolve): Check for duplicate named
4213         attributes.
4214         Fix for #56463.
4215
4216 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
4217
4218         * iterators.cs (MarkYield): track whether we are in an exception,
4219         and generate code accordingly.  Use a temporary value to store the
4220         result for our state.
4221
4222         I had ignored a bit the interaction of try/catch with iterators
4223         since their behavior was not entirely obvious, but now it is
4224         possible to verify that our behavior is the same as MS .NET 2.0
4225
4226         Fixes 54814
4227
4228 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
4229
4230         * iterators.cs: Avoid creating temporaries if there is no work to
4231         do. 
4232
4233         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
4234         Enumerations, use TypeManager.EnumToUnderlying and call
4235         recursively. 
4236
4237         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
4238         bug #57013
4239
4240         (This.Emit): Use EmitContext.EmitThis to emit our
4241         instance variable.
4242
4243         (This.EmitAssign): Ditto.
4244
4245         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
4246         codepaths, we will move all the functionality into
4247         Mono.CSharp.This 
4248
4249         (FieldExpr.EmitAssign): Ditto.
4250
4251         This fixes several hidden bugs that I uncovered while doing a code
4252         review of this today.
4253
4254         * codegen.cs (EmitThis): reworked so the semantics are more clear
4255         and also support value types "this" instances.
4256
4257         * iterators.cs: Changed so that for iterators in value types, we
4258         do not pass the value type as a parameter.  
4259
4260         Initialization of the enumerator helpers is now done in the caller
4261         instead of passing the parameters to the constructors and having
4262         the constructor set the fields.
4263
4264         The fields have now `assembly' visibility instead of private.
4265
4266 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
4267
4268         * expression.cs (Argument.Resolve): Check if fields passed as ref
4269         or out are contained in a MarshalByRefObject.
4270
4271         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
4272         another compiler type.
4273
4274 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
4275
4276         * class.cs (Indexer.Define): use the new name checking method.
4277         Also, return false on an error.
4278         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
4279         (is_identifier_[start/part]_character): make static.
4280
4281 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
4282
4283         * expression.cs (Binary.ResolveOperator): Do no append strings
4284         twice: since we can be invoked more than once (array evaluation)
4285         on the same concatenation, take care of this here.  Based on a fix
4286         from Ben (bug #56454)
4287
4288 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
4289
4290         * codegen.cs: Fix another case where CS1548 must be reported (when 
4291         delay-sign isn't specified and no private is available #56564). Fix
4292         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
4293         error when MCS is used on the MS runtime and we need to delay-sign 
4294         (which seems unsupported by AssemblyBuilder - see #56621).
4295
4296 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
4297
4298         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
4299         (TypeManager.ComputeNamespaces): Faster implementation for
4300         Microsoft runtime.
4301
4302         * compiler.csproj: Updated AssemblyName to mcs.
4303
4304 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
4305
4306         * rootcontext.cs: Add new types to the boot resolution.
4307
4308         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
4309         MulticastDelegate is not allowed.
4310
4311         * typemanager.cs: Add new types to lookup: System.TypedReference
4312         and ArgIterator.
4313
4314         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
4315         check for TypedReference or ArgIterator, they are not allowed. 
4316
4317         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
4318         makes us properly catch 1510 in some conditions (see bug 56016 for
4319         details). 
4320
4321 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
4322
4323         * CryptoConvert.cs: update from corlib version
4324         with endian fixes.
4325
4326 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
4327
4328         * class.cs (Indexer.Define): Check indexername declaration
4329
4330 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
4331
4332         * attribute.cs (IsClsCompliant): Fixed problem with handling
4333         all three states (compliant, not-compliant, undetected).
4334
4335 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
4336
4337         * attribute.cs (Attribute): Location is now public.
4338         (Resolve): Store resolved arguments (pos_values) in attribute class.
4339         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
4340         (GetClsCompliantAttributeValue): New method that gets
4341         CLSCompliantAttribute value.
4342         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
4343         if exists else null.
4344         (AttributeTester): New class for CLS-Compliant verification routines.
4345
4346         * class.cs (Emit): Add CLS-Compliant verification.
4347         (Method.GetSignatureForError): Implemented.
4348         (Constructor.GetSignatureForError): Implemented
4349         (Constructor.HasCompliantArgs): Returns if constructor has
4350         CLS-Compliant arguments.
4351         (Constructor.Emit): Override.
4352         (Construcor.IsIdentifierClsCompliant): New method; For constructors
4353         is needed to test only parameters.
4354         (FieldBase.GetSignatureForError): Implemented.
4355         (TypeContainer): New member for storing base interfaces.
4356         (TypeContainer.FindMembers): Search in base interfaces too.
4357
4358         * codegen.cs (GetClsComplianceAttribute): New method that gets
4359         assembly or module CLSCompliantAttribute value.
4360         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
4361         for assembly.
4362         (ModuleClass.Emit): Add error 3012 test.
4363
4364         * const.cs (Emit): Override and call base for CLS-Compliant tests.
4365
4366         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
4367         state for all decl types.
4368         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
4369         if CLS-Compliant tests are required.
4370         (IsClsCompliaceRequired): New method. Analyze whether code
4371         must be CLS-Compliant.
4372         (IsExposedFromAssembly): New method. Returns true when MemberCore
4373         is exposed from assembly.
4374         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
4375         value or gets cached value.
4376         (HasClsCompliantAttribute): New method. Returns true if MemberCore
4377         is explicitly marked with CLSCompliantAttribute.
4378         (IsIdentifierClsCompliant): New abstract method. This method is
4379         used to testing error 3005.
4380         (IsIdentifierAndParamClsCompliant): New method. Common helper method
4381         for identifier and parameters CLS-Compliant testing.
4382         (VerifyClsCompliance): New method. The main virtual method for
4383         CLS-Compliant verifications.
4384         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
4385         null. I don't know why is null (too many public members !).
4386         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
4387         and get value of first CLSCompliantAttribute that found.
4388
4389         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
4390         (VerifyClsCompliance): Override and add extra tests.
4391
4392         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
4393         clscheck- disable CLS-Compliant verification event if assembly is has
4394         CLSCompliantAttribute(true).
4395
4396         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
4397         ApllyAttribute is now called in emit section as in the other cases.
4398         Possible future Emit integration.
4399         (IsIdentifierClsCompliant): New override.
4400         (VerifyClsCompliance): New override.
4401         (GetEnumeratorName): Returns full enum name.
4402
4403         * parameter.cs (GetSignatureForError): Implemented.
4404
4405         * report.cs (WarningData): New struct for Warning message information.
4406         (LocationOfPreviousError): New method.
4407         (Warning): New method. Reports warning based on the warning table.
4408         (Error_T): New method. Reports error based on the error table.
4409
4410         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
4411         verifications are done here.
4412
4413         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
4414
4415         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
4416         CLSCompliantAttribute.
4417         (all_imported_types): New member holds all imported types from other
4418         assemblies.
4419         (LoadAllImportedTypes): New method fills static table with exported types
4420         from all referenced assemblies.
4421         (Modules): New property returns all assembly modules.
4422
4423 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
4424
4425         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
4426         throwing a parser error.
4427
4428         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
4429         which removes the hardcoded get_/set_ prefixes for properties, as
4430         IL allows for the properties to be named something else.  
4431
4432         Bug #56013
4433
4434         * expression.cs: Do not override operand before we know if it is
4435         non-null.  Fix 56207
4436
4437 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4438
4439         * typemanager.cs: support for pinned variables.
4440
4441 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4442
4443         * decl.cs, typemanager.cs: Avoid using an arraylist
4444         as a buffer if there is only one result set.
4445
4446 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4447
4448         * expression.cs: Make sure you cant call a static method
4449         with an instance expression, bug #56174.
4450
4451 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
4452
4453         * class.cs (IsDuplicateImplementation): Improve error reporting to
4454         flag 663 (method only differs in parameter modifier).
4455
4456         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
4457         in preprocessor directives.
4458
4459         * location.cs (LookupFile): Allow for the empty path.
4460
4461         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
4462         better approach for some of that patch, but its failing with the
4463         CharSet enumeration.  For now try/catch will do.
4464
4465         * typemanager.cs: Do not crash if a struct does not have fields.
4466         Fixes 56150.
4467
4468 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4469
4470         * expression.cs: cs0213, cant fix a fixed expression.
4471         fixes 50231.
4472
4473 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4474
4475         * cs-parser.jay: detect invalid embeded statements gracefully.
4476         bug #51113.
4477
4478 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4479
4480         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
4481         As a regex:
4482         s/
4483         the invocation type may not be a subclass of the tye of the item/
4484         The type of the item must be a subclass of the invocation item.
4485         /g
4486
4487         Fixes bug #50820.
4488
4489 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
4490
4491         * attribute.cs: Added methods to get a string and a bool from an
4492         attribute. Required to information from AssemblyKeyFileAttribute,
4493         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
4494         * codegen.cs: Modified AssemblyName creation to include support for
4495         strongnames. Catch additional exceptions to report them as CS1548.
4496         * compiler.csproj: Updated include CryptoConvert.cs.
4497         * compiler.csproj.user: Removed file - user specific configuration.
4498         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
4499         Mono.Security assembly. The original class is maintained and tested in
4500         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
4501         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
4502         like CSC 8.0 (C# v2) supports.
4503         * Makefile: Added CryptoConvert.cs to mcs sources.
4504         * rootcontext.cs: Added new options for strongnames.
4505
4506 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
4507
4508         * driver.cs: For --expect-error, report error code `2'
4509         if the program compiled with no errors, error code `1' if
4510         it compiled with an error other than the one expected.
4511
4512 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
4513
4514         * compiler.csproj: Updated for Visual Studio .NET 2003.
4515         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
4516         * compiler.sln: Updated for Visual Studio .NET 2003.
4517
4518 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
4519
4520         * expression.cs: Fix bug #47234. We basically need to apply the
4521         rule that we prefer the conversion of null to a reference type
4522         when faced with a conversion to 'object' (csc behaviour).
4523
4524 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4525
4526         * statement.cs: Shorter form for foreach, eliminates
4527         a local variable. r=Martin.
4528
4529 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4530
4531         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
4532         checks if we can use brtrue/brfalse to test for 0.
4533         * expression.cs: use the above in the test for using brtrue/brfalse.
4534         cleanup code a bit.
4535
4536 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4537
4538         * expression.cs: Rewrite string concat stuff. Benefits:
4539
4540         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
4541         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
4542         rather than a concat chain.
4543
4544         * typemanager.cs: Add lookups for more concat overloads.
4545
4546 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4547
4548         * expression.cs: Emit shorter il code for array init.
4549
4550         newarr
4551         dup
4552         // set 1
4553
4554         // set 2
4555
4556         newarr
4557         stloc.x
4558
4559         ldloc.x
4560         // set 1
4561
4562         ldloc.x
4563         // set 2
4564
4565 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
4566
4567         * statement.cs: Before, two switch blocks would be merged if the
4568         total size of the blocks (end_item - begin_item + 1) was less than
4569         two times the combined sizes of the blocks.
4570
4571         Now, it will only merge if after the merge at least half of the
4572         slots are filled.
4573
4574         fixes 55885.
4575
4576 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
4577
4578         * class.cs : csc build fix for GetMethods(). See bug #52503.
4579
4580 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
4581
4582         * expression.cs: Make sure fp comparisons work with NaN.
4583         This fixes bug #54303. Mig approved this patch a long
4584         time ago, but we were not able to test b/c the runtime
4585         had a related bug.
4586
4587 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
4588
4589         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
4590
4591 2004-03-19  Martin Baulig  <martin@ximian.com>
4592
4593         * class.cs (MemberCore.IsDuplicateImplementation): Report the
4594         error here and not in our caller.
4595
4596 2004-03-19  Martin Baulig  <martin@ximian.com>
4597
4598         * interface.cs: Completely killed this file.
4599         (Interface): We're now a TypeContainer and live in class.cs.
4600
4601         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
4602         argument; we're now also called for interfaces.
4603         (TypeContainer.DefineMembers): Allow this method being called
4604         multiple times.
4605         (TypeContainer.GetMethods): New public method; formerly known as
4606         Interface.GetMethod().  This is used by PendingImplementation.
4607         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
4608         it's now private and non-static.
4609         (Interface): Moved this here; it's now implemented similar to
4610         Class and Struct.
4611         (Method, Property, Event, Indexer): Added `bool is_interface'
4612         argument to their .ctor's.
4613         (MemberBase.IsInterface): New public field.
4614
4615         * cs-parser.jay: Create normal Method, Property, Event, Indexer
4616         instances instead of InterfaceMethod, InterfaceProperty, etc.
4617         (opt_interface_base): Removed; we now use `opt_class_base' instead.
4618         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
4619
4620 2004-03-19  Martin Baulig  <martin@ximian.com>
4621
4622         * class.cs (MethodCore.IsDuplicateImplementation): New private
4623         method which does the CS0111 checking.
4624         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
4625         Use IsDuplicateImplementation().
4626
4627 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
4628
4629         * decl.cs (FindMemberToOverride): New method to find the correct
4630         method or property to override in the base class.
4631         * class.cs
4632             - Make Method/Property use the above method to find the
4633               version in the base class.
4634             - Remove the InheritableMemberSignatureCompare as it is now
4635               dead code.
4636
4637         This patch makes large code bases much faster to compile, as it is
4638         O(n) rather than O(n^2) to do this validation.
4639
4640         Also, it fixes bug 52458 which is that nested classes are not
4641         taken into account when finding the base class member.
4642
4643         Reviewed/Approved by Martin.
4644
4645 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
4646
4647         * interface.cs: In all interface classes removed redundant
4648         member initialization.
4649
4650 2004-03-16  Martin Baulig  <martin@ximian.com>
4651
4652         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
4653
4654 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
4655
4656         * decl.cs (DefineTypeAndParents): New helper method to define a
4657         type's containers before the type itself is defined;  This is a
4658         bug exposed by the recent changes to Windows.Forms when an
4659         implemented interface was defined inside a class that had not been
4660         built yet.   
4661
4662         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
4663
4664         (Check): Loop correctly to report errors modifiers
4665         (UNSAFE was not in the loop, since it was the same as TOP).
4666
4667         * interface.cs: Every interface member now takes a ModFlags,
4668         instead of a "is_new" bool, which we set on the base MemberCore. 
4669
4670         Every place where we called "UnsafeOk" in the interface, now we
4671         call the proper member (InterfaceMethod.UnsafeOK) instead to get
4672         the unsafe settings from the member declaration instead of the
4673         container interface. 
4674
4675         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
4676
4677         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
4678         `set_indexer_name' to the pending bits (one per type).
4679
4680         We fixed a bug today that was picking the wrong method to
4681         override, since for properties the existing InterfaceMethod code
4682         basically ignored the method name.  Now we make sure that the
4683         method name is one of the valid indexer names.
4684
4685 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
4686  
4687         * support.cs (SeekableStreamReader): Keep track of stream byte
4688         positions and don't mix them with character offsets to the buffer.
4689
4690         Patch from Gustavo Giráldez
4691
4692 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
4693
4694         * interface.cs (InterfaceSetGetBase): Removed double member
4695         initialization, base class does it as well.
4696
4697 2004-03-13  Martin Baulig  <martin@ximian.com>
4698
4699         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
4700         when compiling corlib.
4701
4702 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
4703
4704         * convert.cs (ExplicitConversion): We were reporting an error on
4705         certain conversions (object_type source to a value type, when the
4706         expression was `null') before we had a chance to pass it through
4707         the user defined conversions.
4708
4709         * driver.cs: Replace / and \ in resource specifications to dots.
4710         Fixes 50752
4711
4712         * class.cs: Add check for duplicate operators.  Fixes 52477
4713
4714 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
4715
4716         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
4717         that are in the middle of the statements, not only at the end.
4718         Fixes #54987
4719
4720         * class.cs (TypeContainer.AddField): No longer set the
4721         `HaveStaticConstructor' flag, now we call it
4722         `UserDefineStaticConstructor' to diferentiate the slightly
4723         semantic difference.
4724
4725         The situation is that we were not adding BeforeFieldInit (from
4726         Modifiers.TypeAttr) to classes that could have it.
4727         BeforeFieldInit should be set to classes that have no static
4728         constructor. 
4729
4730         See:
4731
4732         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
4733
4734         And most importantly Zoltan's comment:
4735
4736         http://bugzilla.ximian.com/show_bug.cgi?id=44229
4737
4738         "I think beforefieldinit means 'it's ok to initialize the type sometime 
4739          before its static fields are used', i.e. initialization does not need
4740          to be triggered by the first access to the type. Setting this flag
4741          helps the JIT to compile better code, since it can run the static
4742          constructor at JIT time, and does not need to generate code to call it
4743          (possibly lots of times) at runtime. Unfortunately, mcs does not set
4744          this flag for lots of classes like String. 
4745          
4746          csc sets this flag if the type does not have an explicit static 
4747          constructor. The reasoning seems to be that if there are only static
4748          initalizers for a type, and no static constructor, then the programmer
4749          does not care when this initialization happens, so beforefieldinit
4750          can be used.
4751          
4752          This bug prevents the AOT compiler from being usable, since it 
4753          generates so many calls to mono_runtime_class_init that the AOT code
4754          is much slower than the JITted code. The JITted code is faster, 
4755          because it does not generate these calls if the vtable is type is
4756          already initialized, which is true in the majority of cases. But the
4757          AOT compiler can't do this."
4758
4759 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
4760
4761         * class.cs (MethodData.Emit): Refactor the code so symbolic
4762         information is generated for destructors;  For some reasons we
4763         were taking a code path that did not generate symbolic information
4764         before. 
4765
4766 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4767
4768         * class.cs: Create a Constructor.CheckBase method that
4769         takes care of all validation type code. The method
4770         contains some code that was moved from Define.
4771
4772         It also includes new code that checks for duplicate ctors.
4773         This fixes bug #55148.
4774
4775 2004-03-09  Joshua Tauberer <tauberer@for.net>
4776
4777         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
4778         a { ... }-style array creation invokes EmitStaticInitializers
4779         which is not good for reference-type arrays.  String, decimal
4780         and now null constants (NullCast) are not counted toward
4781         static initializers.
4782
4783 2004-03-05  Martin Baulig  <martin@ximian.com>
4784
4785         * location.cs (SourceFile.HasLineDirective): New public field;
4786         specifies whether the file contains or is referenced by a "#line"
4787         directive.
4788         (Location.DefineSymbolDocuments): Ignore source files which
4789         either contain or are referenced by a "#line" directive.        
4790
4791 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
4792
4793         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
4794         direct access to our parent, so check the method inline there.
4795
4796 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4797
4798         * expression.cs (Invocation.EmitCall): Miguel's last commit
4799         caused a regression. If you had:
4800
4801             T t = null;
4802             t.Foo ();
4803
4804         In Foo the implict this would be null.
4805
4806 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
4807
4808         * expression.cs (Invocation.EmitCall): If the method is not
4809         virtual, do not emit a CallVirt to it, use Call.
4810
4811         * typemanager.cs (GetFullNameSignature): Improve the method to
4812         cope with ".ctor" and replace it with the type name.
4813
4814         * class.cs (ConstructorInitializer.Resolve): Now the method takes
4815         as an argument the ConstructorBuilder where it is being defined,
4816         to catch the recursive constructor invocations.
4817
4818 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
4819
4820         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
4821         routines to check if a type is an enumerable/enumerator allow
4822         classes that implement the IEnumerable or IEnumerator interfaces.
4823
4824         * class.cs (Property, Operator): Implement IIteratorContainer, and
4825         implement SetYields.
4826
4827         (Property.Define): Do the block swapping for get_methods in the
4828         context of iterators.   We need to check if Properties also
4829         include indexers or not.
4830
4831         (Operator): Assign the Block before invoking the
4832         OperatorMethod.Define, so we can trigger the Iterator code
4833         replacement. 
4834
4835         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
4836         Property and Operator classes are not created when we parse the
4837         declarator but until we have the block completed, so we use a
4838         singleton SimpleIteratorContainer.Simple to flag whether the
4839         SetYields has been invoked.
4840
4841         We propagate this setting then to the Property or the Operator to
4842         allow the `yield' to function.
4843
4844 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
4845
4846         * codegen.cs: Implemented attribute support for modules.
4847         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
4848         Assembly/Module functionality.
4849
4850         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
4851         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
4852         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
4853
4854 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
4855
4856         * interface.cs (FindMembers): The operation is performed on all base
4857         interfaces and not only on the first. It is required for future CLS Compliance patch.
4858
4859 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4860
4861         * statement.cs, codegen.cs:
4862         This patch deals with patterns such as:
4863
4864         public class List : IEnumerable {
4865
4866                 public MyEnumerator GetEnumerator () {
4867                         return new MyEnumerator(this);
4868                 }
4869
4870                 IEnumerator IEnumerable.GetEnumerator () {
4871                         ...
4872                 }
4873                 
4874                 public struct MyEnumerator : IEnumerator {
4875                         ...
4876                 }
4877         }
4878
4879         Before, there were a few things we did wrong:
4880         1) we would emit callvirt on a struct, which is illegal
4881         2) we emited ldarg when we needed to emit ldarga
4882         3) we would mistakenly call the interface methods on an enumerator
4883         type that derived from IEnumerator and was in another assembly. For example:
4884
4885         public class MyEnumerator : IEnumerator
4886
4887         Would have the interface methods called, even if there were public impls of the
4888         method. In a struct, this lead to invalid IL code.
4889
4890 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
4891
4892         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
4893           renamed to Emit.
4894
4895         * delegate.cs (Define): Fixed crash when delegate type is undefined.
4896
4897 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
4898
4899         * cs-parser.jay: Fix small regression: we were not testing V2
4900         compiler features correctly.
4901
4902         * interface.cs: If the emit context is null, then create one
4903
4904 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
4905
4906         * decl.cs (GetSignatureForError): New virtual method to get full name
4907           for error messages.
4908
4909         * attribute.cs (IAttributeSupport): New interface for attribute setting.
4910           Now it is possible to rewrite ApplyAttributes method to be less if/else.
4911
4912         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
4913           Duplicated members and code in these classes has been removed.
4914           Better encapsulation in these classes.
4915
4916 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
4917
4918         * assign.cs (Assign.DoResolve): When dealing with compound
4919         assignments, there is a new rule in ECMA C# 2.4 (might have been
4920         there before, but it is documented here) that states that in:
4921
4922         a op= b;
4923
4924         If b is of type int, and the `op' is a shift-operator, then the
4925         above is evaluated as:
4926
4927         a = (int) a op b 
4928
4929         * expression.cs (Binary.ResolveOperator): Instead of testing for
4930         int/uint/long/ulong, try to implicitly convert to any of those
4931         types and use that in pointer arithmetic.
4932
4933         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
4934         method to print information for from the type, not from the
4935         null-method we were given.
4936
4937 2004-02-01  Duncan Mak  <duncan@ximian.com>
4938
4939         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
4940         parsing for cmd, fixes bug #53694.
4941
4942 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
4943
4944         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
4945         in the member name duplication tests. Property and operator name duplication
4946         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
4947
4948 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
4949
4950         * interface.cs (PopulateMethod): Fixed crash when interface method
4951         returns not existing type (error test cs0246-3.cs).
4952
4953 2004-02-02  Ravi Pratap M <ravi@ximian.com>
4954
4955         * cs-parser.jay (interface_accessors): Re-write actions to also
4956         store attributes attached to get and set methods. Fix spelling
4957         while at it.
4958
4959         (inteface_property_declaration): Modify accordingly.
4960
4961         (InterfaceAccessorInfo): New helper class to store information to pass
4962         around between rules that use interface_accessors.
4963
4964         * interface.cs (Emit): Apply attributes on the get and set
4965         accessors of properties and indexers too.
4966
4967         * attribute.cs (ApplyAttributes): Modify accordingly to use the
4968         right MethodBuilder when applying attributes to the get and set accessors.
4969
4970 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
4971
4972         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
4973
4974 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
4975
4976         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
4977
4978 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
4979
4980         * cs-parser.jay: Remove YIELD token, instead use the new grammar
4981         changes that treat `yield' specially when present before `break'
4982         or `return' tokens.
4983
4984         * cs-tokenizer.cs: yield is no longer a keyword.
4985
4986 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
4987
4988         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
4989         setting for default constructors.
4990         For default constructors are almost every time set wrong Modifier. The
4991         generated IL code has been alright. But inside mcs this values was
4992         wrong and this was reason why several of my CLS Compliance tests
4993         failed.
4994
4995 2004-01-22  Martin Baulig  <martin@ximian.com>
4996
4997         * cs-parser.jay (namespace_or_type_name): Return an Expression,
4998         not a QualifiedIdentifier.  This is what `type_name_expression'
4999         was previously doing.
5000         (type_name_expression): Removed; the code is now in
5001         `namespace_or_type_name'.
5002         (qualified_identifier): Removed, use `namespace_or_type_name'
5003         instead.
5004         (QualifiedIdentifier): Removed this class.      
5005
5006 2004-01-22  Martin Baulig  <martin@ximian.com>
5007
5008         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
5009         not a string as alias name.
5010
5011 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
5012
5013         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
5014         #52730 bug, and instead compute correctly the need to use a
5015         temporary variable when requesting an address based on the
5016         static/instace modified of the field and the constructor.
5017  
5018 2004-01-21  Martin Baulig  <martin@ximian.com>
5019
5020         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
5021         class and namespace before looking up aliases.  Fixes #52517.
5022
5023 2004-01-21  Martin Baulig  <martin@ximian.com>
5024
5025         * flowanalysis.cs (UsageVector.Merge): Allow variables being
5026         assinged in a 'try'; fixes exception4.cs.
5027
5028 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5029         * class.cs : Implemented parameter-less constructor for TypeContainer
5030
5031         * decl.cs: Attributes are now stored here. New property OptAttributes
5032
5033         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
5034
5035         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
5036
5037 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5038
5039         * typemanager.cs (CSharpSignature): Now reports also inner class name.
5040           (CSharpSignature): New method for indexer and property signature.
5041
5042 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5043
5044         * pending.cs (IsVirtualFilter): Faster implementation.
5045
5046 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5047
5048         * typemanager.cs: Avoid inclusion of same assembly more than once.
5049
5050 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5051
5052         * cs-parser.jay: Fixed problem where the last assembly attribute
5053           has been applied also to following declaration (class, struct, etc.)
5054           
5055 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5056
5057         * class.cs: Added error CS0538, CS0539 reporting.
5058         Fixed crash on Microsoft runtime when field type is void.
5059
5060         * cs-parser.jay: Added error CS0537 reporting.
5061
5062         * pending.cs: Added error CS0535 reporting.
5063         Improved error report for errors CS0536, CS0534.
5064
5065 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
5066
5067         Merge a few bits from the Anonymous Method MCS tree.
5068
5069         * statement.cs (ToplevelBlock): New class for toplevel methods,
5070         will hold anonymous methods, lifted variables.
5071
5072         * cs-parser.jay: Create toplevel blocks for delegates and for
5073         regular blocks of code. 
5074
5075 2004-01-20  Martin Baulig  <martin@ximian.com>
5076
5077         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
5078         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
5079         and `NeedExplicitReturn'; added `IsLastStatement'.
5080         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
5081         have a `ReturnLabel' or we're not unreachable.
5082
5083         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
5084         child's reachability; don't just override ours with it.  Fixes
5085         #58058 (lluis's example).
5086         (FlowBranching): Added public InTryOrCatch(), InCatch(),
5087         InFinally(), InLoop(), InSwitch() and
5088         BreakCrossesTryCatchBoundary() methods.
5089
5090         * statement.cs (Return): Do all error checking in Resolve().
5091         Unless we are the last statement in a top-level block, always
5092         create a return label and jump to it.
5093         (Break, Continue): Do all error checking in Resolve(); also make
5094         sure we aren't leaving a `finally'.
5095         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
5096         statement in a top-level block.
5097         (Block.Flags): Added `IsDestructor'.
5098         (Block.IsDestructor): New public property.
5099
5100 2004-01-20  Martin Baulig  <martin@ximian.com>
5101
5102         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
5103
5104 2004-01-20  Martin Baulig  <martin@ximian.com>
5105
5106         * statement.cs (Statement.ResolveUnreachable): New public method.
5107         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
5108         (Block.Resolve): Resolve unreachable statements.
5109
5110 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
5111
5112         * expression.cs: We need to fix the case where we do
5113         not have a temp variable here.
5114
5115         * assign.cs: Only expression compound assignments need
5116         temporary variables.
5117
5118 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
5119
5120         * flowanalysis.cs: Reduce memory allocation in a few ways:
5121           - A block with no variables should not allocate a bit
5122             vector for itself.
5123           - A method with no out parameters does not need any tracking
5124             for assignment of the parameters, so we need not allocate
5125             any data for it.
5126           - The arrays:
5127                 public readonly Type[] VariableTypes;
5128                 public readonly string[] VariableNames;
5129             Are redundant. The data is already stored in the variable
5130             map, so we need not allocate another array for it.
5131           - We need to add alot of checks for if (params | locals) == null
5132             due to the first two changes.
5133
5134 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
5135
5136         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
5137         implement IMemoryLocation, we store a copy on a local variable and
5138         take the address of it.  Patch from Benjamin Jemlich
5139
5140         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
5141         to use a special "type_name_expression" rule which reduces the
5142         number of "QualifiedIdentifier" classes created, and instead
5143         directly creates MemberAccess expressions.
5144
5145 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
5146
5147         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
5148         that fixes #52853.  Null literal assignment to ValueType
5149
5150         * class.cs (MethodData.Emit): Instead of checking the name of the
5151         method to determine if its a destructor, create a new derived
5152         class from Method called Destructor, and test for that.  
5153
5154         * cs-parser.jay: Create a Destructor object instead of a Method.  
5155
5156         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
5157
5158         Fixes: 52933
5159
5160 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
5161
5162         * expression.cs (Binary.ResolveOperator): Perform an implicit
5163         conversion from MethodGroups to their delegate types on the
5164         Addition operation.
5165
5166         * delegate.cs: Introduce a new class DelegateCreation that is the
5167         base class for `NewDelegate' and `ImplicitDelegateCreation',
5168         factor some code in here.
5169
5170         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
5171         conversion from MethodGroups to compatible delegate types. 
5172
5173         * ecore.cs (Expression.Resolve): Do not flag error 654
5174         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
5175         we allow conversions from MethodGroups to delegate types now.
5176
5177         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
5178         assignments in v2 either.
5179
5180 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
5181
5182         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
5183         static read-only fields in ctors.
5184
5185         Applied patch from Benjamin Jemlich 
5186
5187         * expression.cs (UnaryMutator): Avoid leaking local variables. 
5188
5189 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
5190
5191         * cs-tokenizer.cs (IsCastToken): Allow the various native types
5192         here to return true, as they can be used like this:
5193
5194                 (XXX) int.MEMBER ()
5195
5196         Fixed 49836 and all the other dups
5197
5198 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
5199
5200         * driver.cs: Implement /win32res and /win32icon.
5201
5202 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
5203
5204         * cs-parser.jay: Add a rule to improve error handling for the
5205         common mistake of placing modifiers after the type.
5206
5207 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
5208
5209         * cs-parser.jay (interface_event_declaration): Catch
5210         initialization of events on interfaces, and report cs0068
5211
5212         * cs-parser.jay (interface_event_declaration): Catch
5213         initialization of events. 
5214
5215         * ecore.cs: Better report missing constructors.
5216
5217         * expression.cs (Binary.ResolveOperator): My previous bug fix had
5218         the error reporting done in the wrong place.  Fix.
5219
5220         * expression.cs (Binary.ResolveOperator): Catch the 
5221         operator + (E x, E y) error earlier, and later allow for implicit
5222         conversions in operator +/- (E e, U x) from U to the underlying
5223         type of E.
5224
5225         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
5226         52596, if the container class is abstract, the default constructor
5227         is protected otherwise its public (before, we were always public).
5228
5229         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
5230         fixed statement.
5231
5232         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
5233         Jemlich that fixes bug #52597, MCS was generating invalid code for
5234         idisposable structs.   Thanks to Ben for following up with this
5235         bug as well.
5236
5237 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
5238
5239         * driver.cs: Allow assemblies without code to be generated, fixes
5240         52230.
5241
5242 2004-01-07  Nick Drochak <ndrochak@gol.com>
5243
5244         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
5245
5246 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
5247
5248         * cs-parser.jay: Add rules to improve error reporting if fields or
5249         methods are declared at the namespace level (error 116)
5250
5251         * Add rules to catch event add/remove
5252
5253 2004-01-04  David Sheldon <dave-mono@earth.li>
5254
5255   * expression.cs: Added matching ")" to error message for 
5256   CS0077
5257
5258 2004-01-03 Todd Berman <tberman@gentoo.org>
5259
5260         * ecore.cs, attribute.cs:
5261         Applying fix from #52429.
5262
5263 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5264
5265         * ecore.cs, expression.cs, statement.cs:
5266         Total rewrite of how we handle branching. We
5267         now handle complex boolean expressions with fewer
5268         jumps. As well if (x == 0) no longer emits a ceq.
5269
5270         if (x is Foo) is much faster now, because we generate
5271         better code.
5272
5273         Overall, we get a pretty big improvement on our benchmark
5274         tests. The code we generate is smaller and more readable.
5275
5276         I did a full two-stage bootstrap. The patch was reviewed
5277         by Martin and Miguel.
5278
5279 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5280
5281         * cs-parser.jay: Make primary_expression not take a QI.
5282         we dont need this because the member_access rule covers
5283         us here. So we replace the rule with just IDENTIFIER.
5284
5285         This has two good effects. First, we remove a s/r conflict.
5286         Second, we allocate many fewer QualifiedIdentifier objects.
5287
5288 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5289
5290         * attribute.cs: Handle MarshalAs attributes as pseudo, and
5291         set the correct information via SRE. This prevents
5292         hanging on the MS runtime. Fixes #29374.
5293
5294 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5295
5296         * convert.cs: correctly handle conversions to value types
5297         from Enum and ValueType as unboxing conversions.
5298
5299         Fixes bug #52569. Patch by Benjamin Jemlich.
5300
5301 2004-01-02  Ravi Pratap  <ravi@ximian.com>
5302
5303         * expression.cs (BetterConversion): Prefer int -> uint
5304         over int -> ulong (csc's behaviour). This fixed bug #52046.
5305
5306 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5307
5308         * decl.cs (MemberCache.FindMembers): now returns a
5309         MemberInfo [].
5310
5311         * typemanager.cs: In general, go with with ^^.
5312         (CopyNewMethods): take an IList.
5313         (RealMemberLookup): Only allocate an arraylist
5314         if we copy from two sets of methods.
5315
5316         This change basically does two things:
5317         1) Fewer array lists allocated due to CopyNewMethods.
5318         2) the explicit cast in MemberList costed ALOT.
5319
5320 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
5321
5322         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
5323         a hashtable to avoid needless string allocations when an identifier is
5324         used more than once (the common case).
5325
5326 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
5327
5328         * pending.cs: MS's TypeBuilder.GetInterfaces ()
5329         is broken, it will not return anything. So, we
5330         have to use the information we have in mcs to
5331         do the task.
5332
5333         * typemanager.cs: Add a cache for GetInterfaces,
5334         since this will now be used more often (due to ^^)
5335
5336         (GetExplicitInterfaces) New method that gets the
5337         declared, not effective, interfaces on a type
5338         builder (eg, if you have interface IFoo, interface
5339         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
5340         { IBar }.
5341
5342         This patch makes MCS able to bootstrap itself on
5343         Windows again.
5344
5345 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
5346
5347         * expression.cs: Remove the Nop's that Miguel put
5348         in by mistake.
5349
5350 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5351
5352         * report.cs, codegen.cs: Give the real stack trace to
5353         the error when an exception is thrown.
5354
5355 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5356
5357         * decl.cs: only allocate hashtables for ifaces if 
5358         it is an iface!
5359
5360 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
5361
5362         * expression.cs: fix the error from cs0121-2.cs
5363         (a parent interface has two child interfaces that
5364         have a function with the same name and 0 params
5365         and the function is called through the parent).
5366
5367 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
5368
5369         * class.cs, rootcontext.cs, typmanager.cs: do not
5370         leak pointers.
5371
5372 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5373
5374         * codegen.cs: remove stack for the ec flow branching.
5375         It is already a linked list, so no need.
5376
5377 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
5378
5379         * Makefile: Allow custom profiler here.
5380
5381 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
5382
5383         * typemanager.cs (LookupType):
5384           - Use a static char [], because split takes
5385             a param array for args, so it was allocating
5386             every time.
5387           - Do not store true in a hashtable, it boxes.
5388
5389 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
5390
5391         * flowanalysis.cs: bytify common enums.
5392
5393 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5394
5395         * modifiers.cs: Add a new set of flags for the
5396         flags allowed on explicit interface impls.
5397         * cs-parser.jay: catch the use of modifiers in
5398         interfaces correctly.
5399         * class.cs: catch private void IFoo.Blah ().
5400
5401         All related to bug #50572.
5402
5403 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5404
5405         * decl.cs: Rewrite the consistant accessability checking.
5406         Accessability is not linear, it must be implemented in
5407         a tableish way. Fixes #49704.
5408
5409 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
5410
5411         * expression.cs: Handle negation in a checked context.
5412         We must use subtraction from zero. Fixes #38674.
5413
5414 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5415
5416         * class.cs: Ignore static void main in DLLs.
5417         * rootcontext.cs: Handle the target type here,
5418         since we are have to access it from class.cs
5419         * driver.cs: account for the above.
5420
5421 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5422
5423         * report.cs: Give line numbers and files if available.
5424
5425 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
5426
5427         * driver.cs: Implement /addmodule.
5428
5429         * typemanager.cs:  Change 'modules' field so it now contains Modules not
5430         ModuleBuilders.
5431
5432 2003-12-20  Martin Baulig  <martin@ximian.com>
5433
5434         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
5435         (FieldBase.IsAssigned): Removed this field.
5436         (FieldBase.SetAssigned): New public method.
5437         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
5438
5439 2003-12-20  Martin Baulig  <martin@ximian.com>
5440
5441         * expression.cs (LocalVariableReference.DoResolve): Don't set
5442         `vi.Used' if we're called from DoResolveLValue().
5443
5444         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
5445         returns the usage vector it just merged into the current one -
5446         pass this one to UsageWarning().
5447         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
5448         of the `EmitContext', don't call this recursively on our children.
5449
5450 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
5451
5452         * driver.cs: Implement /target:module.
5453
5454 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
5455
5456         * support.cs (CharArrayHashtable): New helper class.
5457
5458         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
5459         char arrays, not strings, so we can avoid creating a string in
5460         consume_identifier if the identifier is a keyword.
5461
5462 2003-12-16  Martin Baulig  <martin@ximian.com>
5463
5464         * statement.cs (LocalInfo.Assigned): Removed this property.
5465         (LocalInfo.Flags): Removed `Assigned'.
5466         (LocalInfo.IsAssigned): New public method; takes the EmitContext
5467         and uses flow analysis.
5468         (Block.UsageWarning): Made this method private.
5469         (Block.Resolve): Call UsageWarning() if appropriate.
5470
5471         * expression.cs (LocalVariableReference.DoResolve): Always set
5472         LocalInfo.Used here.
5473
5474 2003-12-13  Martin Baulig  <martin@ximian.com>
5475
5476         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
5477         any value here; we're now using flow analysis to figure out
5478         whether a statement/block returns a value.
5479
5480 2003-12-13  Martin Baulig  <martin@ximian.com>
5481
5482         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
5483         working again.
5484         (FlowBranching.MergeFinally): Don't call
5485         `branching.CheckOutParameters()' here, this is called in
5486         MergeTopBlock().
5487         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
5488         when adding the `finally' vector.       
5489
5490 2003-12-13  Martin Baulig  <martin@ximian.com>
5491
5492         * flowanalysis.cs
5493         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
5494         actually work and also fix #48962.
5495
5496 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
5497
5498         * decl.cs: Do not check System.Object for nested types,
5499         since we know it does not have any. Big bang for buck:
5500
5501         BEFORE:
5502            Run 1:   8.35 seconds
5503            Run 2:   8.32 seconds
5504            corlib:  17.99 seconds
5505         AFTER:
5506            Run 1:   8.17 seconds
5507            Run 2:   8.17 seconds
5508            corlib:  17.39 seconds
5509
5510 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
5511
5512         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
5513         time we are returning 0 members, so we save alot here.
5514
5515 2003-12-11  Martin Baulig  <martin@ximian.com>
5516
5517         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
5518         `MergeChild()', also just take the `FlowBranching' as argument;
5519         call Merge() on it and return the result.
5520         (FlowBranching.Merge): We don't need to do anything if we just
5521         have one sibling.
5522
5523 2003-12-11  Martin Baulig  <martin@ximian.com>
5524
5525         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
5526         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
5527         Maurer for this idea.
5528
5529 2003-12-11  Martin Baulig  <martin@ximian.com>
5530
5531         * flowanalysis.cs (MergeResult): This class is now gone; we now
5532         use the `UsageVector' for this.  The reason for this is that if a
5533         branching just has one sibling, we don't need to "merge" them at
5534         all - that's the next step to do.
5535         (FlowBranching.Merge): We now return a `UsageVector' instead of a
5536         `MergeResult'.
5537
5538 2003-12-11  Martin Baulig  <martin@ximian.com>
5539
5540         Reworked flow analyis and made it more precise and bug-free.  The
5541         most important change is that we're now using a special `Reachability'
5542         class instead of having "magic" meanings of `FlowReturns'.  I'll
5543         do some more cleanups and optimizations and also add some more
5544         documentation this week.
5545
5546         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
5547         largely reworked this class.
5548         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
5549         the new `Reachability' class instead of having "magic" values here.
5550         (FlowBranching): We're now using an instance of `Reachability'
5551         instead of having separate `Returns', `Breaks' etc. fields.
5552
5553         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
5554         based on flow analysis; ignore the return value of block.Emit ().
5555
5556 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
5557
5558         * driver.cs typemanager.cs: Find the mono extensions to corlib even
5559         if they are private.
5560
5561 2003-12-09  Martin Baulig  <martin@ximian.com>
5562
5563         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
5564         call them directly on the UsageVector.
5565
5566 2003-12-09  Martin Baulig  <martin@ximian.com>
5567
5568         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
5569         Changed return type from `FlowReturns' to `Reachability'.
5570
5571 2003-12-09  Martin Baulig  <martin@ximian.com>
5572
5573         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
5574         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
5575         `Reachable' fields with a single `Reachability' one.
5576
5577 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5578
5579         * class.cs (FindMembers): Remove foreach's.
5580
5581         Bootstrap times:
5582
5583         BEFORE
5584                 Run 1:   8.74 seconds
5585                 Run 2:   8.71 seconds
5586
5587         AFTER
5588                 Run 1:   8.64 seconds
5589                 Run 2:   8.58 seconds
5590
5591
5592 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5593
5594         * cs-parser.jay:
5595         * gen-treedump.cs:
5596         * statement.cs:
5597         This patch does a few things:
5598                 1. EmptyStatement is now a singleton, so it is never reallocated.
5599                 2. All blah is EmptyStatement constructs have been changed to
5600                    blah == EmptyStatement.Value, which is much faster and valid
5601                    now that EmptyStatement is a singleton.
5602                 3. When resolving a block, rather than allocating a new array for
5603                    the non-empty statements, empty statements are replaced with
5604                    EmptyStatement.Value
5605                 4. Some recursive functions have been made non-recursive.
5606         Mainly the performance impact is from (3), however (1) and (2) are needed for
5607         this to work. (4) does not make a big difference in normal situations, however
5608         it makes the profile look saner.
5609
5610         Bootstrap times:
5611
5612         BEFORE
5613         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5614         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
5615         Total memory allocated: 56397 KB
5616
5617         AFTER
5618         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
5619         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
5620         Total memory allocated: 55666 KB
5621
5622 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5623
5624         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
5625         than the hashtable in a hashtable version
5626
5627         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
5628         we always end up concating a string. This results in a huge perf
5629         loss, because many strings have to be tracked by the GC. In this
5630         patch, we first use a hashtable that works with two keys, so that
5631         the strings do not need to be concat'ed.
5632
5633         Bootstrap times:
5634         BEFORE
5635                 Run 1:   8.74 seconds
5636                 Run 2:   8.71 seconds
5637
5638         AFTER
5639                 Run 1:   8.65 seconds
5640                 Run 2:   8.56 seconds
5641
5642 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
5643
5644         * Makefile: Add a new target `do-time' that does a quick and simple
5645         profile, leaving easy to parse output.
5646
5647 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
5648
5649         * codegen.cs (Init): Create the dynamic assembly with 
5650         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
5651
5652 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5653
5654         * support.cs: Make the PtrHashtable use only one
5655         instance of its comparer.
5656
5657 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
5658
5659         * typemanager.cs: Fix lookup of GetNamespaces.
5660
5661 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
5662
5663         * expression.cs: Removed redundant line.
5664
5665         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
5666         ArrayLists, use for loops with bounds.  
5667
5668         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
5669         arraylist.
5670
5671         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
5672         arraylists, use for loop with bounds.
5673
5674         The above three changes give us a 0.071 second performance
5675         improvement out of 3.294 seconds down to 3.223.  On my machine
5676         the above changes reduced the memory usage by 1,387 KB during
5677         compiler bootstrap.
5678
5679         * cs-parser.jay (QualifiedIdentifier): New class used to represent
5680         QualifiedIdentifiers.  Before we created a new string through
5681         concatenation, and mostly later on, the result would be
5682         manipulated by DecomposeQI through string manipulation.
5683
5684         This reduced the compiler memory usage for bootstrapping from
5685         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
5686         compile times in 0.05 seconds.
5687
5688 2003-11-28  Dick Porter  <dick@ximian.com>
5689
5690         * support.cs: Do string compares with the Invariant culture.
5691
5692         * rootcontext.cs: 
5693         * gen-treedump.cs: 
5694         * expression.cs: 
5695         * driver.cs: 
5696         * decl.cs: 
5697         * codegen.cs: 
5698         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
5699         the comparison is done with the Invariant culture.
5700
5701 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
5702
5703         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
5704         GetEnumerator method.
5705
5706         (ProbeCollectionType): Iterate starting at the most specific type
5707         upwards looking for a GetEnumerator
5708
5709         * expression.cs: Shift count can be up to 31 for int/uint and 63
5710         for long/ulong.
5711
5712 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
5713
5714         * statement.cs (Block.LookupLabel): Also look for the label on the
5715         children blocks.  Use a hash table to keep track of visited
5716         nodes. 
5717
5718         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
5719         we actually did transform the other operand, otherwise fall back
5720         to the common codepath that casts to long.
5721
5722         * cs-tokenizer.cs: Use the same code pattern as the int case.
5723         Maybe I should do the parsing myself, and avoid depending on the
5724         Parse routines to get this done.
5725
5726 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
5727
5728         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5729         which fixes bug 51347.  This time test it.
5730
5731         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
5732         attributes for example can not tell the difference between these.
5733         The difference was only a syntax feature of the language. 
5734
5735         * attribute.cs: Apply attributes to delegates.
5736
5737         * delegate.cs: Call the apply attributes method.
5738
5739 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
5740
5741         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
5742         comparing 0 vs Byte.MinValue, not the value
5743
5744         (ImplicitConversionRequired): When reporting a conversion error,
5745         use error 31 to print out the constant error instead of the
5746         simpler 29.
5747
5748         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
5749         which fixes bug 51347.
5750
5751 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
5752
5753         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
5754         which fixes the -warnaserror command line option.
5755
5756 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
5757
5758         * cfold.cs (DoNumericPromotions): During constant folding of
5759         additions on UIntConstant, special case intconstants with
5760         IntConstants like we do on the expression binary operator. 
5761
5762 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
5763
5764         * convert.cs (ImplicitReferenceConversion): We were missing a case
5765         (System.Enum are not value types or class types, so we need to
5766         classify them separatedly).
5767
5768         * driver.cs: We do not support error 2007.
5769
5770 2003-11-12 Jackson Harper <jackson@ximian.com>
5771
5772         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
5773         system directory. Also use the full file name so users can
5774         libraries names mscorlib-o-tron.dll in a non system dir.
5775
5776 2003-11-10  Martin Baulig  <martin@ximian.com>
5777
5778         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
5779         (TypeManager.InitCoreTypes): Initialize them here, but instead of
5780         calling `ResolveType()' on them, directly assign their `Type'.
5781
5782 2003-11-08  Martin Baulig  <martin@ximian.com>
5783
5784         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
5785         return value and the `out parent' parameter.
5786         (TypeContainer.DefineType): Moved the CS0644 check into
5787         GetClassBases().  Don't pass the interface types to the
5788         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
5789         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
5790
5791         * ecore.cs (TypeExpr.IsAttribute): New property.
5792         (TypeExpr.GetInterfaces): New method.
5793
5794         * interface.cs (Interface.GetInterfaceTypeByName): Return a
5795         TypeExpr instead of a Type.
5796         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
5797         (Interface.DefineType): Don't pass the interface types to the
5798         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
5799         them later and then call `TypeBulider.AddInterfaceImplementation()'.
5800
5801         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
5802         instead of a `Type[]'.
5803         (TypeManager.RegisterBuilder): Likewise.
5804         (TypeManager.AddUserInterface): Likewise.
5805         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
5806         `Type[]' and also return a `TypeExpr[]'.
5807         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
5808
5809 2003-11-08  Martin Baulig  <martin@ximian.com>
5810
5811         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
5812         Expression.     
5813
5814 2003-11-08  Martin Baulig  <martin@ximian.com>
5815
5816         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
5817         TypeManager.ResolveExpressionTypes().
5818
5819         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
5820         instead of an Expression.
5821         (TypeExpr): This is now an abstract base class for `TypeExpression'.
5822         (TypeExpression): New public class; formerly known as `TypeExpr'.
5823
5824         * expression.cs (ComposedCast): Derive from TypeExpr.
5825
5826         * typemanager.cs (TypeManager.system_*_expr): These are now
5827         TypExpr's instead of Expression's.
5828         (TypeManager.ResolveExpressionTypes): New public static function;
5829         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
5830         of them.        
5831
5832 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
5833
5834         * expression.cs (New.DoResolve): Do not dereference value that
5835         might be a null return.
5836
5837         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
5838         sure that the constant value has the right type.  Fixes an
5839         unreported bug, similar to 50425.
5840
5841         * const.cs (Const.LookupConstantValue): Call
5842         ImplicitStandardConversionExists before doing a conversion to
5843         avoid havng the TypeManager.ChangeType do conversions.
5844
5845         Reduced the number of casts used
5846
5847         (Const.ChangeType): New routine to enable reuse of the constant
5848         type changing code from statement.
5849
5850         * typemanager.cs (ChangeType): Move common initialization to
5851         static global variables.
5852
5853         Fixes #50425.
5854
5855         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
5856         every value type to go through, even if it was void.  Fix that. 
5857
5858         * cs-tokenizer.cs: Use is_identifier_start_character on the start
5859         character of the define, and the is_identifier_part_character for
5860         the rest of the string.
5861
5862 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
5863
5864         * expression.cs (UnaryMutator.EmitCode): When I updated
5865         LocalVariableReference.DoResolve, I overdid it, and dropped an
5866         optimization done on local variable references.
5867
5868 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
5869
5870         * ecore.cs: Convert the return from Ldlen into an int.
5871
5872 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
5873
5874         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
5875         the accessibility, this is a special case for toplevel non-public
5876         classes (internal for instance).
5877
5878 2003-10-20  Nick Drochak <ndrochak@gol.com>
5879
5880         * ecore.cs: Fix typo and build.  Needed another right paren.
5881
5882 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
5883
5884         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
5885         `internal' case regular and protected, but not allowing protected
5886         to be evaluated later.  Bug 49840
5887
5888 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
5889
5890         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
5891         to kb.Nlast, and not the kb.nFirst to isolate the switch
5892         statement.
5893
5894         Extract the underlying type, so enumerations of long/ulong are
5895         treated like long/ulong.
5896
5897 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
5898
5899         * expression.cs (New): Overload the meaning of RequestedType to
5900         track the possible creation of the NewDelegate type, since
5901         DoResolve is invoked more than once for new constructors on field
5902         initialization.
5903
5904         See bugs: #48800 and #37014
5905
5906         * cs-parser.jay (declare_local_constants): Take an arraylist
5907         instead of a single constant.
5908
5909         (local_constant_declaration): It should take a
5910         constant_declarators, not a constant_declarator.  Fixes 49487
5911
5912         * convert.cs: Fix error report.
5913
5914 2003-10-13 Jackson Harper <jackson@ximian.com>
5915
5916         * typemanager.cs (TypeToCoreType): Add float and double this fixes
5917         bug #49611
5918
5919 2003-10-09  Martin Baulig  <martin@ximian.com>
5920
5921         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
5922         to the .ctor.
5923         (MethodCore.DoDefineParameters): Removed the TypeContainer
5924         argument; use the DeclSpace which was passed to the .ctor instead.
5925         (MethodCore.CheckParameter): Take a DeclSpace instead of a
5926         TypeContainer; we only need a DeclSpace here.
5927
5928 2003-10-09  Martin Baulig  <martin@ximian.com>
5929
5930         * class.cs (MethodData): Added additional `DeclSpace ds' argument
5931         to the .ctor.
5932         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
5933         EmitContext's .ctor.    
5934
5935 2003-10-09  Martin Baulig  <martin@ximian.com>
5936
5937         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
5938         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
5939         AsAccessible(), moved them as well.
5940
5941         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
5942
5943 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5944
5945         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5946
5947 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
5948
5949         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
5950         generation for >=, as spotted by Paolo, bug 48679.  
5951         Patch from David Waite.
5952
5953         * cs-tokenizer.cs: Add handling for #pragma.
5954
5955         * cs-parser.jay: Allow for both yield and yield return in the
5956         syntax.  The anti-cobolization of C# fight will go on!
5957
5958         * class.cs (TypeBuilder.DefineType): Catch error condition here
5959         (Parent.DefineType erroring out and returning null).
5960
5961         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5962         coping with enumerations variables, we were mistakenly processing
5963         them as a regular value type instead of built-in types.  Fixes the
5964         bug #48063
5965
5966         * typemanager.cs (IsBuiltinOrEnum): New method.
5967
5968 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5969
5970         * cs-parser.jay: Upgrade: yield now needs the return clause.
5971
5972 2003-09-19  Martin Baulig  <martin@ximian.com>
5973
5974         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5975         `MemberCache parent' argument.  Normally, an interface doesn't
5976         have a parent type except System.Object, but we use this in gmcs
5977         for generic type parameters.
5978
5979 2003-09-18  Martin Baulig  <martin@ximian.com>
5980
5981         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5982         on `type.IsInterface'; don't check whether the type has a parent
5983         to determine whether it's an interface.
5984
5985 2003-09-15  Martin Baulig  <martin@ximian.com>
5986
5987         * class.cs (TypeContainer.DefineType): Added an error flag to
5988         avoid reporting duplicate CS0146's ("class definition is
5989         circular.").
5990
5991         * driver.cs (Driver.MainDriver): Abort if
5992         RootContext.ResolveTree() reported any errors.
5993
5994 2003-09-07  Martin Baulig  <martin@ximian.com>
5995
5996         * report.cs (Error, Warning): Added overloaded versions which take
5997         a `params object[] args' and call String.Format().
5998
5999 2003-09-07  Martin Baulig  <martin@ximian.com>
6000
6001         * decl.cs (DeclSpace..ctor): Don't call
6002         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
6003         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
6004         (DeclSpace.RecordDecl): New method.
6005
6006         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
6007
6008 2003-09-02  Ravi Pratap  <ravi@ximian.com>
6009
6010         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
6011         value attributes to be applied to ParameterBuilders.
6012
6013         * class.cs (MethodCore.LabelParameters): Make static and more
6014         generic so that it can be used from other places - like interface
6015         methods, for instance.
6016
6017         * interface.cs (Interface.Emit): Call LabelParameters before
6018         emitting attributes on the InterfaceMethod.
6019
6020 2003-08-26  Martin Baulig  <martin@ximian.com>
6021
6022         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
6023         resolving aliases; fixes #47927.
6024
6025 2003-08-26  Martin Baulig  <martin@ximian.com>
6026
6027         * statement.cs (Using.DoResolve): This is internally emitting a
6028         try/finally clause, so we need to set ec.NeedExplicitReturn if we
6029         do not always return.  Fixes #47681.
6030
6031 2003-08-26  Martin Baulig  <martin@ximian.com>
6032
6033         * decl.cs (MemberCore): Moved WarningNotHiding(),
6034         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
6035         into MemberBase.
6036         (AdditionResult): Make this nested in DeclSpace.
6037         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
6038         argument; call NamespaceEntry.Define() unless we're nested in a
6039         class or struct.
6040
6041         * namespace.cs (Namespace.DefineName): New public function.  This
6042         is called from DeclSpace's .ctor to add 
6043         (Namespace.Lookup): Include DeclSpaces in the lookup.
6044
6045         * class.cs (Operator): Derive from MemberBase, not MemberCore.
6046
6047         * const.cs (Const): Derive from MemberBase, not MemberCore.     
6048
6049 2003-08-25  Martin Baulig  <martin@ximian.com>
6050
6051         * convert.cs (Convert.ExplicitReferenceConversion): When
6052         converting from an interface type to a class, unbox if the target
6053         type is a struct type.  Fixes #47822.
6054
6055 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6056
6057         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
6058         #47854.
6059
6060 2003-08-22  Martin Baulig  <martin@ximian.com>
6061
6062         * class.cs (TypeManager.DefineType): When defining a nested type,
6063         call DefineType() on our parent; fixes #47801.
6064
6065 2003-08-22  Martin Baulig  <martin@ximian.com>
6066
6067         * class.cs (MethodData.Define): While checking if a method is an
6068         interface implementation, improve the test a bit more to fix #47654.
6069
6070 2003-08-22  Martin Baulig  <martin@ximian.com>
6071
6072         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
6073         correctly; fixes #47722.
6074
6075 2003-08-22  Martin Baulig  <martin@ximian.com>
6076
6077         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
6078         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
6079
6080         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
6081
6082 2003-08-22  Martin Baulig  <martin@ximian.com>
6083
6084         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
6085         can only be assigned in static constructors.  Fixes #47161.
6086
6087 2003-08-22  Martin Baulig  <martin@ximian.com>
6088
6089         Rewrote and improved the flow analysis code.
6090
6091         * flowbranching.cs (FlowBranching): Make this class abstract.
6092         (FlowBranching.CreateBranching): New static function to create a
6093         new flow branching.
6094         (FlowBranchingBlock, FlowBranchingException): New classes.
6095         (FlowBranching.UsageVector.Type): New public readonly field.
6096         (FlowBranching.UsageVector.Breaks): Removed the setter.
6097         (FlowBranching.UsageVector.Returns): Removed the setter.
6098         (FlowBranching.UsageVector): Added Break(), Return(),
6099         NeverReachable() and Throw() methods to modify the reachability.
6100         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
6101         done by FlowBranching.Merge().
6102         (FlowBranching.UsageVector.MergeChild): New method; merges the
6103         merge result into the current vector.
6104         (FlowBranching.Merge): New abstract method to merge a branching.
6105
6106 2003-08-12  Martin Baulig  <martin@ximian.com>
6107
6108         * expression.cs (Indirection.CacheTemporaries): Create the
6109         LocalTemporary with the pointer type, not its element type.
6110
6111 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
6112
6113         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
6114         token was a keyword or not.
6115
6116         Add `error' options where an IDENTIFIER was expected;  Provide
6117         CheckToken and CheckIdentifierToken convenience error reporting
6118         functions. 
6119
6120         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
6121
6122         * decl.cs: Rename `NamespaceEntry Namespace' public field into
6123         NameSpaceEntry NameSpaceEntry.
6124
6125         (LookupInterfaceOrClass): Avoid creating a full qualified name
6126         from namespace and name: avoid doing lookups when we know the
6127         namespace is non-existant.   Use new Tree.LookupByNamespace which
6128         looks up DeclSpaces based on their namespace, name pair.
6129
6130         * driver.cs: Provide a new `parser verbose' to display the
6131         exception thrown during parsing.  This is turned off by default
6132         now, so the output of a failure from mcs is more graceful.
6133
6134         * namespace.cs: Track all the namespaces defined in a hashtable
6135         for quick lookup.
6136
6137         (IsNamespace): New method
6138
6139 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
6140
6141         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
6142         we know that we need to concatenate (full typename can never be
6143         null). 
6144
6145         * class.cs: ditto.
6146
6147         * statement.cs: Use a bitfield;  Do not initialize to null things
6148         which are done by the constructor by default.
6149
6150         * cs-parser.jay: bug fix, parameter was 4, not 3.
6151
6152         * expression.cs: Just use the property;
6153
6154         * statement.cs: No need for GetVariableInfo method.
6155
6156 2003-08-08  Martin Baulig  <martin@ximian.com>
6157
6158         * flowanalysis.cs (FlowReturns): This is now nested in the
6159         `FlowBranching' class.
6160         (MyBitVector): Moved this here from statement.cs.
6161         (FlowBranching.SiblingType): New enum type.
6162         (FlowBranching.CreateSibling): Added `SiblingType' argument.
6163
6164 2003-08-07  Martin Baulig  <martin@ximian.com>
6165
6166         * flowanalysis.cs (FlowBranchingType): This is now nested in the
6167         `FlowBranching' class and called `BranchingType'.
6168
6169 2003-08-07  Martin Baulig  <martin@ximian.com>
6170
6171         * flowanalysis.cs: Moved all the control flow analysis code into
6172         its own file.
6173
6174 2003-08-07  Martin Baulig  <martin@ximian.com>
6175
6176         * assign.cs (Assign.DoResolve): `target' must either be an
6177         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
6178         #37319.
6179
6180 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
6181
6182         * expression.cs (BinaryMethod): This kind of expression is created by the
6183         Binary class if it determines that the operator has to be handled
6184         by a method.
6185
6186         (BinaryDelegate): This kind of expression is created if we are
6187         dealing with a + or - operator on delegates.
6188
6189         (Binary): remove method, argumetns, and DelegateOperator: when
6190         dealing with methods, 
6191
6192         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
6193
6194         * statement.cs (Block): use bitfields for the three extra booleans
6195         we had in use.   Remove unused topblock parameter.
6196
6197         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
6198
6199         * assign.cs: Drop extra unneeded tests.
6200
6201 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
6202
6203         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
6204
6205         * statement.cs (Foreach): Use VariableStorage instead of
6206         LocalBuilders.   
6207
6208         * codegen.cs (VariableStorage): New class used by clients that
6209         require a variable stored: locals or fields for variables that
6210         need to live across yield.
6211
6212         Maybe provide a convenience api for EmitThis+EmitLoad?
6213
6214         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
6215         these bad boys.
6216
6217 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
6218
6219         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
6220         RemapParameterLValue): New methods that are used to turn a
6221         precomputed FieldInfo into an expression like this:
6222
6223                 instance.FieldInfo
6224
6225         The idea is to use this instead of making LocalVariableReference
6226         have more than one meaning.
6227
6228         * cs-parser.jay: Add error production to BASE.
6229
6230         * ecore.cs: Deal with TypeManager.GetField returning null, which
6231         is now a valid return value.
6232
6233         (FieldExprNoAddress): New expression for Fields whose address can
6234         not be taken.
6235
6236         * expression.cs (LocalVariableReference): During the resolve
6237         phases, create new expressions if we are in a remapping context.
6238         Remove code that dealt with remapping here.
6239
6240         (ParameterReference): same.
6241
6242         (ProxyInstance): New expression, like the `This' expression, but
6243         it is born fully resolved.  We know what we are doing, so remove
6244         the errors that are targeted to user-provided uses of `this'.
6245
6246         * statement.cs (Foreach): our variable is now stored as an
6247         Expression;  During resolution, follow the protocol, dont just
6248         assume it will return this.
6249
6250 2003-08-06  Martin Baulig  <martin@ximian.com>
6251
6252         * support.cs (SeekableStreamReader.cs): New public class.
6253
6254         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
6255         SeekableStreamReader instead of the normal StreamReader.
6256
6257 2003-08-04  Martin Baulig  <martin@ximian.com>
6258
6259         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
6260         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
6261         deambiguate casts and delegate invocations.
6262         (parenthesized_expression): Use the new tokens to ensure this is
6263         not a cast of method invocation.
6264
6265         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
6266         when reading a `)' and Deambiguate_CloseParens () was previously
6267         called.
6268
6269         * expression.cs (ParenthesizedExpression): New class.  This is
6270         just used for the CS0075 test.
6271         (Binary.DoResolve): Check for CS0075.   
6272
6273 2003-07-29  Ravi Pratap  <ravi@ximian.com>
6274
6275         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
6276         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
6277         reference comparison.
6278
6279         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
6280         examine the ReturnType for equality - this is necessary in the
6281         cases of implicit and explicit operators whose signature also
6282         includes the return type.
6283
6284 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
6285
6286         * namespace.cs: Cache the result of the namespace computation,
6287         instead of computing it every time.
6288
6289 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
6290
6291         * decl.cs: Use a global arraylist that we reuse over invocations
6292         to avoid excesive memory consumption.  Reduces memory usage on an
6293         mcs compile by one meg (45 average).
6294
6295         * typemanager.cs (LookupTypeReflection): In .NET pointers are
6296         private, work around that.
6297
6298 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
6299
6300         * literal.cs (IntLiteral): Define Zero and One static literals. 
6301
6302         * cs-parser.jay (integer_literal): use static literals to reduce
6303         memory usage for the most used literals (0, 1 and -1).  211kb
6304         reduced in memory usage.
6305
6306         Replace all calls to `new ArrayList' with `new
6307         ArrayList(4)' which is a good average number for most allocations,
6308         and also requires only 16 bytes of memory for its buffer by
6309         default. 
6310
6311         This reduced MCS memory usage in seven megabytes for the RSS after
6312         bootstrapping.
6313
6314 2003-07-28  Ravi Pratap  <ravi@ximian.com>
6315
6316         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
6317         handle params methods the correct way by forming only one
6318         applicable set with params and normal methods in them. Earlier we
6319         were looking at params methods only if we found no normal methods
6320         which was not the correct thing to do.
6321
6322         (Invocation.BetterFunction): Take separate arguments indicating
6323         when candidate and the best method are params methods in their
6324         expanded form.
6325
6326         This fixes bugs #43367 and #46199.
6327
6328         * attribute.cs: Documentation updates.
6329
6330         (CheckAttribute): Rename to CheckAttributeTarget.
6331         (GetValidPlaces): Rename to GetValidTargets.
6332
6333         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
6334         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
6335
6336         Fixes bug #44468.
6337
6338 2003-07-28  Martin Baulig  <martin@ximian.com>
6339
6340         * class.cs (TypeContainer.DefineMembers): Use the base type's full
6341         name when looking up the base class of a nested class.  Fixes #46977.
6342
6343 2003-07-26  Martin Baulig  <martin@ximian.com>
6344
6345         * expression.cs (Indexers.Indexer): New nested struct; contains
6346         getter, setter and the indexer's type.
6347         (Indexers.Properties): This is now an ArrayList of
6348         Indexers.Indexer's.
6349         (IndexerAccess.DoResolveLValue): Correctly set the type if the
6350         indexer doesn't have any getters.
6351
6352         * assign.cs (Assign.DoResolve): Also do the implicit conversions
6353         for embedded property and indexer assignments.
6354
6355 2003-07-26  Martin Baulig  <martin@ximian.com>
6356
6357         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
6358         preprocessor directive is not the first non-whitespace character
6359         on a line.
6360
6361 2003-07-26  Martin Baulig  <martin@ximian.com>
6362
6363         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
6364         namespace parsing, follow the spec more closely.
6365
6366         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
6367         NamespaceEntry.Lookup().
6368
6369 2003-07-25  Martin Baulig  <martin@ximian.com>
6370
6371         * MethodCore.cs (OverridesSomething): New public field; it's set
6372         from TypeContainer.DefineMembers if this method overrides
6373         something (which doesn't need to be a method).  Fix #39462.
6374
6375 2003-07-25  Ravi Pratap  <ravi@ximian.com>
6376
6377         * typemanager.cs (GetMembers): Ensure that the list of members is
6378         reversed. This keeps things in sync.
6379
6380         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
6381         find an AttributeUsage attribute.
6382
6383         * expression.cs (Invocation.OverloadResolve): Perform the check
6384         which disallows Invoke to be directly called on a Delegate.
6385
6386         (Error_InvokeOnDelegate): Report error cs1533.
6387
6388 2003-07-25  Martin Baulig  <martin@ximian.com>
6389
6390         * expression.cs (Indexers.GetIndexersForType): Only look in the
6391         interface hierarchy if the requested type is already an
6392         interface.  Fixes #46788 while keeping #46502 fixed.
6393
6394 2003-07-25  Martin Baulig  <martin@ximian.com>
6395
6396         * class.cs (TypeContainer.DefineMembers): Check whether all
6397         readonly fields have been assigned and report warning CS0649 if
6398         not.
6399
6400         * statement.cs (LocalInfo.IsFixed): Always return true if this is
6401         a valuetype.
6402
6403 2003-07-24  Ravi Pratap  <ravi@ximian.com>
6404
6405         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
6406         returned from GetMethods to make things consistent with the
6407         assumptions MCS makes about ordering of methods.
6408
6409         This should comprehensively fix bug #45127 and it does :-)
6410
6411         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
6412         ordering is actually reverse.
6413
6414         * Clean up some debug messages I left lying around.
6415
6416         * interface.cs (Populate*): Get rid of code which emits attributes
6417         since the stage in which we emit attributes is the 'Emit' stage,
6418         not the define stage.
6419
6420         (Emit): Move attribute emission for interface members here.
6421
6422 2003-07-22  Ravi Pratap  <ravi@ximian.com>
6423
6424         * expression.cs (Invocation.OverloadResolve): Follow the spec more
6425         closely: we eliminate methods in base types when we have an
6426         applicable method in a top-level type.
6427
6428         Please see section 14.5.5.1 for an exact description of what goes
6429         on. 
6430
6431         This fixes bug #45127 and a host of other related to corlib compilation.
6432
6433         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
6434         array is the method corresponding to the top-level type (this is
6435         because of the changes made to icall.c) so we change this
6436         accordingly.
6437
6438         (MethodGroupExpr.Name): This too.
6439
6440         * typemanager.cs (GetElementType): New method which does the right
6441         thing when compiling corlib. 
6442
6443         * everywhere: Make use of the above in the relevant places.
6444
6445 2003-07-22  Martin Baulig  <martin@ximian.com>
6446
6447         * cs-parser.jay (invocation_expression): Moved
6448         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
6449         `cast_expression', but create a InvocationOrCast which later
6450         resolves to either an Invocation or a Cast.
6451
6452         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
6453         method; call this before EmitStatement() to make sure that this
6454         expression can be used as a statement.
6455
6456         * expression.cs (InvocationOrCast): New class; resolves to either
6457         an Invocation or a Cast.
6458
6459         * statement.cs (StatementExpression): Call ResolveStatement() on
6460         the ExpressionStatement before emitting it.
6461
6462 2003-07-21  Martin Baulig  <martin@ximian.com>
6463
6464         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
6465         `ref' and `out' attributes match; fixes #46220.
6466         (MemberAccess.ResolveMemberAccess): You can't reference a type
6467         through an expression; fixes #33180.
6468         (Indexers.GetIndexersForType): Don't return the indexers from
6469         interfaces the class implements; fixes #46502.
6470
6471 2003-07-21  Martin Baulig  <martin@ximian.com>
6472
6473         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
6474         CS0661 checks; fixes bug #30442.
6475
6476 2003-07-21  Martin Baulig  <martin@ximian.com>
6477
6478         * decl.cs (AdditionResult): Added `Error'.
6479
6480         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
6481
6482         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
6483         makes cs0031.cs actually work.
6484
6485 2003-07-20  Martin Baulig  <martin@ximian.com>
6486
6487         * namespace.cs: Fixed that bug which caused a crash when compiling
6488         the debugger's GUI.
6489
6490 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
6491
6492         * typemanager.cs (LookupTypeReflection): Never expose types which
6493         are NotPublic, NestedPrivate, NestedAssembly, or
6494         NestedFamANDAssem.  We used to return these, and later do a check
6495         that would report a meaningful error, but the problem is that we
6496         would not get the real match, if there was a name override.
6497
6498 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
6499
6500         * namespace.cs (Namespace, Name): Do not compute the namespace
6501         name dynamically, compute it in the constructor.  This reduced
6502         memory usage by 1697 KB.
6503
6504         * driver.cs: Use --pause to pause at the end.
6505
6506 2003-07-17  Peter Williams  <peter@newton.cx>
6507
6508         * Makefile: Change the name of the test target so that it doesn't
6509         conflict with the recursive test target.
6510
6511 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
6512
6513         * expression.cs (LocalVariableReference.Emit, EmitAssign,
6514         AddressOf): Do not use EmitThis, that was wrong, use the actual
6515         this pointer.
6516
6517 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
6518
6519         * class.cs (MethodData.Define): While checking if a method is an
6520         interface implementation, improve the test: If we are not public
6521         (use new test here: use the computed MethodAttributes directly,
6522         instead of the parsed modifier flags) check if the `implementing'
6523         method comes from an interface or not.
6524
6525         * pending.cs (VerifyPendingMethods): Slightly better error
6526         message.
6527
6528         * makefile: add test target that does the mcs bootstrap.
6529
6530 2003-07-16  Ravi Pratap  <ravi@ximian.com>
6531
6532         * interface.cs (Define): Do nothing here since there are no
6533         members to populate etc. Move the attribute emission out of here
6534         since this was just totally the wrong place to put it. Attribute
6535         application happens during the 'Emit' phase, not in the 'Define'
6536         phase.
6537
6538         (Emit): Add this method and move the attribute emission here
6539
6540         * rootcontext.cs (EmitCode): Call the Emit method on interface
6541         types too.
6542
6543 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6544
6545         * expression.cs (OverloadResolve): Report error only if Location
6546         is not 'Null' which means that there was a probe going on.
6547
6548 2003-07-14  Martin Baulig  <martin@ximian.com>
6549
6550         * expression.cs (ConditionalLogicalOperator): New public class to
6551         implement user defined conditional logical operators.
6552         This is section 14.11.2 in the spec and bug #40505.
6553
6554 2003-07-14  Martin Baulig  <martin@ximian.com>
6555
6556         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
6557
6558 2003-07-14  Martin Baulig  <martin@ximian.com>
6559
6560         * codegen.cs (EmitContext.InFixedInitializer): New public field.
6561
6562         * ecore.cs (IVariable.VerifyFixed): New interface method.
6563
6564         * expression.cs (Unary.ResolveOperator): When resolving the `&'
6565         operator, check whether the variable is actually fixed.  Fixes bug
6566         #36055.  Set a variable definitely assigned when taking its
6567         address as required by the spec.
6568
6569         * statement.cs (LocalInfo.IsFixed): New field.
6570         (LocalInfo.MakePinned): Set `IsFixed' to true.
6571
6572 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
6573
6574         * attribute.cs (Attribute.Resolve): While doing a Member lookup
6575         for .ctors, ensure that we only ask for members declared in the
6576         attribute type (BindingFlags.DeclaredOnly).
6577
6578         Fixes bug #43632.
6579
6580         * expression.cs (Error_WrongNumArguments): Report error 1501
6581         correctly the way CSC does.
6582
6583 2003-07-13  Martin Baulig  <martin@ximian.com>
6584
6585         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
6586         lookup on the fully qualified name, to make things like "X.X" work
6587         where "X.X" is a fully qualified type name, but we also have a
6588         namespace "X" in the using list.  Fixes #41975.
6589
6590 2003-07-13  Martin Baulig  <martin@ximian.com>
6591
6592         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
6593         function. If we're a CompoundAssign, we need to create an embedded
6594         CompoundAssign, not an embedded Assign.
6595         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
6596         Fixes #45854.
6597
6598 2003-07-13  Martin Baulig  <martin@ximian.com>
6599
6600         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
6601         work to fix bug #46088.
6602
6603 2003-07-13  Ravi Pratap <ravi@ximian.com>
6604
6605         * class.cs (Operator.Emit): Do not emit attributes here - it is
6606         taken care of by the Method class that we delegate too. This takes
6607         care of bug #45876.
6608
6609 2003-07-10  Martin Baulig  <martin@ximian.com>
6610
6611         * expression.cs (TypeOfVoid): New class.
6612         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
6613
6614 2003-07-10  Martin Baulig  <martin@ximian.com>
6615
6616         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
6617         bug #35957.
6618
6619 2003-07-10  Martin Baulig  <martin@ximian.com>
6620
6621         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
6622         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
6623
6624         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
6625
6626         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
6627
6628 2003-07-10  Martin Baulig  <martin@ximian.com>
6629
6630         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
6631         of decimal.  Fixes #42850.
6632
6633         NOTE: I also fixed the created byte blob, but this doesn't work on
6634         the MS runtime and csc never produces any byte blobs for decimal
6635         arrays.
6636
6637 2003-07-10  Martin Baulig  <martin@ximian.com>
6638
6639         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
6640         structs; fixes #32068.
6641         (Block.AddChildVariableNames): Fixed #44302.
6642
6643 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6644
6645         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
6646
6647 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6648
6649         * attribute.cs: And this test is onger needed.
6650
6651 2003-07-08  Martin Baulig  <martin@ximian.com>
6652
6653         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
6654         inaccessible types.  Fixes #36313.
6655
6656         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
6657
6658         * namespace.cs (NamespaceEntry): Create implicit entries for all
6659         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
6660         implicit entries for N1.N2 and N1.
6661
6662 2003-07-08  Martin Baulig  <martin@ximian.com>
6663
6664         Rewrote the handling of namespaces to fix a lot of the issues
6665         wrt. `using' aliases etc.
6666
6667         * namespace.cs (Namespace): Splitted this class into a
6668         per-assembly `Namespace' and a per-file `NamespaceEntry'.
6669
6670         * typemanager.cs (TypeManager.IsNamespace): Removed.
6671         (TypeManager.ComputeNamespaces): Only compute namespaces from
6672         loaded assemblies here, not the namespaces from the assembly we're
6673         currently compiling.
6674
6675 2003-07-08  Martin Baulig  <martin@ximian.com>
6676
6677         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
6678
6679 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6680
6681         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
6682         already fixed it.  
6683
6684         I thought about the memory savings here, but LookupTypeReflection
6685         is used under already very constrained scenarios.  Compiling
6686         corlib or mcs only exposes one hit, so it would not really reduce
6687         any memory consumption.
6688
6689 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6690
6691         * typemanager.cs: fixes bug #45889 by only adding public types from
6692         other assemblies to the list of known types.
6693
6694 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
6695
6696         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
6697         on the type we resolved.
6698
6699 2003-07-05  Martin Baulig  <martin@ximian.com>
6700
6701         * pending.cs (PendingImplementation.ParentImplements): Don't
6702         create the proxy if the parent is abstract.
6703
6704         * class.cs (TypeContainer.DefineIndexers): Process explicit
6705         interface implementations first.  Fixes #37714.
6706
6707 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
6708
6709         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
6710         defined recursively;  but since we modify the input parameters
6711         (left is set to `this' temporarily), we reset this value if the
6712         left_is_explicit is false, which gives the original semantics to
6713         the code.  
6714
6715         * literal.cs (NullPointer): new class used to represent a null
6716         literal in a pointer context.
6717
6718         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
6719         type is a pointer, use a NullPointer object instead of a
6720         NullLiteral.   Closes 43687
6721
6722         (ExplicitConversion): Convert pointer values using
6723         the conv opcode to the proper type.
6724
6725         * ecore.cs (New): change ValueTypeVariable property into a method,
6726         that returns whether the valuetype is suitable for being used.
6727
6728         * expression.cs (Binary.DoNumericPromotions): Only return if we
6729         the int constant was a valid uint, and we can return both left and
6730         right as uints.  If not, we continue processing, to trigger the
6731         type conversion.  This fixes 39018.
6732
6733         * statement.cs (Block.EmitMeta): During constant resolution, set
6734         the CurrentBlock property on the emitcontext, so that we resolve
6735         constants propertly.
6736
6737 2003-07-02  Martin Baulig  <martin@ximian.com>
6738
6739         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
6740         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
6741
6742         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
6743         than emitting it here.
6744
6745         * statement.cs: Fixed some more flow analysis bugs.
6746
6747 2003-07-02  Martin Baulig  <martin@ximian.com>
6748
6749         * class.cs (MethodData.Define): When implementing interface
6750         methods, set Final unless we're Virtual.
6751
6752         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
6753         check work for interface methods.
6754
6755 2003-07-01  Martin Baulig  <martin@ximian.com>
6756
6757         * ecore.cs (EmitContext.This): Replaced this property with a
6758         GetThis() method which takes a Location argument.  This ensures
6759         that we get the correct error location for a CS0188.
6760
6761 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
6762
6763         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
6764         ImplicitStandardConversion.
6765
6766         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
6767
6768 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
6769
6770         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
6771         optimization.
6772
6773 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
6774
6775         * class.cs (Constructor.Define): Turn off initlocals for unsafe
6776         constructors.
6777
6778         (MethodData.Define): Turn off initlocals for unsafe methods.
6779
6780 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
6781
6782         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
6783         complete;  Fixes #37521.
6784
6785         * delegate.cs: Use Modifiers.TypeAttr to compute the
6786         TypeAttributes, instead of rolling our own.  This makes the flags
6787         correct for the delegates.
6788
6789 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
6790
6791         * class.cs (Constructor.Define): Set the private flag for static
6792         constructors as well.
6793
6794         * cs-parser.jay (statement_expression): Set the return value to
6795         null, to avoid a crash when we catch an error.
6796
6797 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
6798
6799         * cs-parser.jay: Applied patch from Jackson that adds support for
6800         extern and unsafe modifiers to destructor declarations.
6801
6802         * expression.cs: Report error 21 if the user is trying to index a
6803         System.Array.
6804
6805         * driver.cs: Add an error message, suggested by the bug report.
6806
6807         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
6808         if we do not have a ": this ()" constructor initializer.  Fixes 45149
6809
6810 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
6811
6812         * namespace.cs: Add some information to reduce FAQs.
6813
6814 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
6815
6816         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
6817         underlying enumeration types.  Fixes #43915.
6818
6819         * expression.cs: Treat ushort/short as legal values to be used in
6820         bitwise operations.
6821
6822 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
6823
6824         * delegate.cs: transfer custom attributes for paramenters from
6825         the delegate declaration to Invoke and BeginInvoke.
6826
6827 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
6828
6829         * attribute.cs: handle custom marshalers and emit marshal info
6830         for fields, too.
6831
6832 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
6833
6834         * makefile.gnu: Added anonymous.cs to the compiler sources.
6835
6836 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
6837
6838         * iterators.cs: Change the name of the proxy class to include two
6839         underscores.
6840
6841         * cs-parser.jay: Update grammar to include anonymous methods.
6842
6843         * anonymous.cs: new file.
6844
6845 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6846
6847         * class.cs (Field.Define): Add missing test for pointers and
6848         safety. 
6849
6850 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6851
6852         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6853         we use the stobj opcode.
6854
6855         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6856         since it wasn't the correct fix. 
6857
6858         It still is puzzling that we are required to use stobj for IntPtr
6859         which seems to be a ValueType.
6860
6861 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6862
6863         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6864         during regular simple name resolution.   Now, the trick is that
6865         instead of returning for processing the simplename, we do a
6866         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6867         contextual lookup type).   If a match is found, return that, if
6868         not, return for further composition.
6869
6870         This fixes long-standing 30485.
6871
6872         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6873         using the address to initialize an object, do an Stobj instead of
6874         using the regular Stelem.
6875
6876         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6877         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6878         Because if we are a BaseIndexerAccess that value will be true.
6879         Fixes 43643.
6880
6881         * statement.cs (GotoCase.Resolve): Return after reporting an
6882         error, do not attempt to continue. 
6883
6884         * expression.cs (PointerArithmetic.Emit): If our operand is a
6885         long, convert our constants to match the operand before
6886         multiplying.  Convert to I type before adding.   Fixes 43670.
6887
6888 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6889
6890         * enum.cs (ImplicitConversionExists) : Rename to
6891         ImplicitEnumConversionExists to remove ambiguity. 
6892
6893         * ecore.cs (NullCast): New type of cast expression class which
6894         basically is very similar to EmptyCast with the difference being
6895         it still is a constant since it is used only to cast a null to
6896         something else
6897         (eg. (string) null)
6898
6899         * convert.cs (ImplicitReferenceConversion): When casting a null
6900         literal, we return a NullCast.
6901
6902         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6903         should be around anymore.
6904
6905         The renaming (reported was slightly wrong). Corrections:
6906
6907         ConvertImplicitStandard -> ImplicitConversionStandard
6908         ConvertExplicitStandard -> ExplicitConversionStandard
6909
6910         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6911         before passing them in !
6912
6913         * convert.cs (ImplicitConversionStandard): When comparing for
6914         equal expr and target types, ensure that expr is not a
6915         NullLiteral.
6916
6917         In general, we must not be checking (expr_type ==
6918         target_type) in the top level conversion methods
6919         (ImplicitConversion, ExplicitConversion etc). This checking is
6920         done in the methods that they delegate to.
6921
6922 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6923
6924         * convert.cs: Move Error_CannotConvertType,
6925         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6926         ImplicitNumericConversion, ImplicitConversionExists,
6927         ImplicitUserConversionExists, StandardConversionExists,
6928         FindMostEncompassedType, FindMostSpecificSource,
6929         FindMostSpecificTarget, ImplicitUserConversion,
6930         ExplicitUserConversion, GetConversionOperators,
6931         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6932         TryImplicitIntConversion, Error_CannotConvertImplicit,
6933         ConvertImplicitRequired, ConvertNumericExplicit,
6934         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6935         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6936         its own file.
6937
6938         Perform the following renames:
6939
6940         StandardConversionExists -> ImplicitStandardConversionExists
6941         ConvertImplicit -> ImplicitConversion
6942         ConvertImplicitStandard -> ImplicitStandardConversion
6943         TryImplicitIntConversion -> ImplicitIntConversion
6944         ConvertImplicitRequired -> ImplicitConversionRequired
6945         ConvertNumericExplicit -> ExplicitNumericConversion
6946         ConvertReferenceExplicit -> ExplicitReferenceConversion
6947         ConvertExplicit -> ExplicitConversion
6948         ConvertExplicitStandard -> ExplicitStandardConversion
6949
6950 2003-05-19  Martin Baulig  <martin@ximian.com>
6951
6952         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6953         (TypeInfo): Added support for structs having structs as fields.
6954
6955         * ecore.cs (FieldExpr): Implement IVariable.
6956         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6957         VariableInfo for the field.
6958
6959 2003-05-18  Martin Baulig  <martin@ximian.com>
6960
6961         * expression.cs (This.DoResolve): Report a CS0027 if we're
6962         emitting a field initializer.
6963
6964 2003-05-18  Martin Baulig  <martin@ximian.com>
6965
6966         * expression.cs (This.ResolveBase): New public function.
6967         (This.DoResolve): Check for CS0188.
6968
6969         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6970         This.Resolve().
6971
6972         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6973         `instance_expression' to null if we don't have any non-static
6974         methods.
6975
6976 2003-05-18  Martin Baulig  <martin@ximian.com>
6977
6978         Reworked the way how local variables and parameters are handled by
6979         the flow analysis code.
6980
6981         * statement.cs (TypeInfo, VariableMap): New public classes.
6982         (VariableInfo): New public class.  This is now responsible for
6983         checking whether a variable has been assigned.  It is used for
6984         parameters and local variables.
6985         (Block.EmitMeta): Take the InternalParameters as argument; compute
6986         the layout of the flow vectors here.
6987         (Block.LocalMap, Block.ParameterMap): New public properties.
6988         (FlowBranching): The .ctor doesn't get the InternalParameters
6989         anymore since Block.EmitMeta() now computes the layout of the flow
6990         vector.
6991         (MyStructInfo): This class is now known as `StructInfo' and nested
6992         in `TypeInfo'; we don't access this directly anymore.
6993
6994         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6995         property and removed IsAssigned(), IsFieldAssigned(),
6996         SetAssigned() and SetFieldAssigned(); we now call them on the
6997         VariableInfo so we don't need to duplicate this code everywhere.
6998
6999         * expression.cs (ParameterReference): Added `Block block' argument
7000         to the .ctor.
7001         (LocalVariableReference, ParameterReference, This): The new
7002         VariableInfo class is now responsible for all the definite
7003         assignment stuff.
7004
7005         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
7006         IsParameterAssigned, SetParameterAssigned): Removed.
7007
7008 2003-05-18  Martin Baulig  <martin@ximian.com>
7009
7010         * typemanager.cs (InitCoreTypes): Try calling
7011         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
7012         the 3-args-version.  Corlib now also needs our `void_type'.
7013         (GetMethod): Added overloaded version which takes an optional
7014         `bool report_errors' to allow lookups of optional methods.
7015
7016 2003-05-12  Martin Baulig  <martin@ximian.com>
7017
7018         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
7019         only used for locals and not for parameters.
7020
7021 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
7022
7023         * support.cs (InternalParameters.ParameterType): Return the
7024         ExternalType of the parameter.
7025
7026         * parameter.cs (Parameter.ExternalType): drop the two arguments,
7027         they were unused.
7028
7029 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
7030
7031         * class.cs (MethodData.Define): Do not set the `newslot' on
7032         interface members, if they are also flagged as "override".
7033
7034         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
7035         better code for ++i and i++.  This only works for static fields
7036         and local variables.
7037
7038         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
7039         want to pull the DeclSpace out of the builder_to_declspace instead
7040         of the TypeBuilder (like in TypeContainer.FindMembers).
7041
7042         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
7043         instead of LookupTypeContainer.  Fixes the crash on .NET for
7044         looking up interface members.
7045
7046         * const.cs: Create our own emit context during the Definition
7047         stage, so that constants are evaluated in the proper context, when
7048         a recursive definition happens.
7049
7050 2003-05-11  Martin Baulig  <martin@ximian.com>
7051
7052         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
7053         new block for a switch section.
7054         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
7055         the adding/lookup in the switch block.  Fixes #39828.
7056
7057 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
7058
7059         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
7060         functionality: I needed to convert the data after I had performed
7061         the add/sub operation into the operands type size.
7062
7063         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
7064         pass the type for the box operation, otherwise the resulting
7065         object would have been of type object.
7066
7067         (BoxedCast): Add constructor to specify the type to box as.
7068
7069 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
7070
7071         * iterators.cs: I was reusing the `count' variable inadvertently,
7072         take steps to not allow this to happen.
7073
7074 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
7075
7076         * attribute.cs (Attribute.Resolve): Params attributes are encoded
7077         by creating an array at the point where the params starts and
7078         putting all those arguments there, then adjusting the size of the
7079         array.
7080
7081 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
7082
7083         * expression.cs (New.AddressOf): Implement interface
7084         IMemoryLocation.  This is used when the `new' operator is used in
7085         the context of an invocation to a method on a value type.
7086
7087         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
7088         example. 
7089
7090         * namespace.cs: Also check the using aliases here.
7091
7092         * driver.cs: Move the test for using validity after the types have
7093         been entered, so we do a single pass that also includes the using
7094         aliases. 
7095
7096         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
7097         in the regular case.   CreateSiblingForFinally is doing extra
7098         error checking.
7099
7100         * attribute.cs (GetAttributeArgumentExpression): Store the result
7101         on an out value, and use the return value to indicate failure
7102         instead of using null (which is a valid return for Constant.GetValue).
7103
7104         * statement.cs: Perform the analysis flow for the increment
7105         portion after the statement, because this will be the real flow of
7106         execution.  Fixes #42385
7107
7108         * codegen.cs (EmitContext.EmitArgument,
7109         EmitContext.EmitStoreArgument): New helper functions when the
7110         RemapToProxy flag is set.
7111
7112         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
7113         function.
7114
7115         Add support for remapping parameters. 
7116
7117         * iterators.cs: Propagate parameter values;  Store parameter
7118         values in the proxy classes.
7119
7120 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
7121
7122         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
7123         need a proxy reference;  I do not know what I was thinking
7124
7125         * cs-parser.jay (constructor_initializer): catch another error,
7126         and display nice message.
7127
7128         (field_declaration): catch void field declaration
7129         to flag a better error. 
7130
7131         * class.cs (MemberBase.CheckBase): Report an error instead of a
7132         warning if a new protected member is declared in a struct. 
7133         (Field.Define): catch the error of readonly/volatile.
7134
7135         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
7136
7137         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
7138         volatile variable is taken
7139
7140 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
7141
7142         * statement.cs (Fixed.Resolve): Report an error if we are not in
7143         an unsafe context.
7144
7145 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
7146
7147         * typemanager.cs: reuse the code that handles type clashes for
7148         delegates and enumerations.
7149
7150         * class.cs (Report28): Always report.
7151
7152         * expression.cs (EncodeAsAttribute): Allow nulls here.
7153
7154 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
7155
7156         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
7157         the functionality for testing whether an expression is valid for
7158         an attribute here.  Also handle the case of arrays of elements
7159         being stored. 
7160
7161         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
7162         encoding a linear array into an array of objects that are suitable
7163         to be passed to an CustomAttributeBuilder.
7164
7165         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
7166
7167         * ecore.cs: (FieldExpr): Handle field remapping here.
7168
7169         * iteratators.cs: Pass the instance variable (if the method is an
7170         instance method) to the constructors, so we can access the field
7171         variables on the class.
7172
7173         TODO: Test this with structs.  I think the THIS variable on
7174         structs might have to be a pointer, and not a refenrece
7175
7176 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
7177
7178         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
7179         local variables to fields in a proxy class.
7180
7181         * iterators.cs (PopulateProxy): Rename our internal fields to
7182         <XXX>.  
7183         Create a <THIS> field if we are an instance method, so we can
7184         reference our parent container variables.
7185         (MapVariable): Called back from the EmitContext code to enter a
7186         new variable to field mapping into the proxy class (we just create
7187         a FieldBuilder).
7188
7189         * expression.cs
7190         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
7191         for using the remapped locals to fields.
7192
7193         I placed the code here, because that gives the same semantics to
7194         local variables, and only changes the Emit code.
7195
7196         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
7197         statements inside iterators.
7198         (VariableInfo): Add a FieldBuilder for the cases when we are
7199         remapping local variables to fields in a proxy class
7200
7201         * ecore.cs (SimpleNameResolve): Avoid testing two times for
7202         current_block != null.
7203
7204         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
7205         not cope with strings, as it has been moved to the
7206         TableSwitchEmit.  Fixed bug in switch generation.
7207
7208         * expression.cs (New.DoResolve): Provide more context for the user
7209         when reporting an error.
7210
7211         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
7212         pointers. 
7213
7214         * expression.cs (MemberAccess.DoResolve): When we get a type back,
7215         check the permissions for it.  Note than in a type-resolution
7216         context the check was already present in DeclSpace.ResolveType,
7217         but was missing from the MemberAccess.
7218
7219         (ArrayCreation.CheckIndices): warn if the user has
7220         more nested levels of expressions, but there are no more
7221         dimensions specified.  Avoids crash on bug 41906.
7222
7223 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
7224
7225         * statement.cs (Block): replace Implicit bool, for a generic
7226         flags.   
7227         New flag: `Unchecked'.  This is used during the EmitMeta phase
7228         (which is out-of-line with the regular Resolve/Emit process for a
7229         statement, as this is done ahead of time, but still gets a chance
7230         to call constant resolve).
7231
7232         (Block.Flags): new enum for adding a new flag.
7233
7234         (Block.EmitMeta): track the state of unchecked.
7235
7236         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
7237         to enable constant resolution to work there as well.
7238
7239 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
7240
7241         * typemanager.cs (ienumerable_type): Also look up
7242         System.Collections.IEnumerable. 
7243
7244 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
7245
7246         TODO: Test more than one conditional per method.
7247
7248         * class.cs (Indexer.Define): Report the location where the user is
7249         referencing the unsupported feature.
7250
7251         (MethodData): Overload the use of `conditionals' to
7252         minimize the creation of needless ArrayLists.   This saves roughly
7253         212kb on my machine.
7254
7255         (Method): Implement the new IIteratorContainer interface.
7256         (Method.SetYields): Implement the method by setting the ModFlags
7257         to contain METHOD_YIELDS.
7258
7259         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
7260         which just got set to null.
7261
7262         * iterators.cs: New file.
7263
7264         (Yield, YieldBreak): New statements.
7265
7266         * statement.cs (Return.Resolve): Flag an error if we are used in
7267         an iterator method.
7268
7269         * codegen.cs (InIterator): New flag set if the code is being
7270         compiled in an iterator method.
7271
7272         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
7273         internal modifier, and we just use it to avoid adding extra
7274         fields, as this is seldom used.  
7275
7276         * cs-parser.jay: Add yield_statement (yield and yield break).
7277
7278         * driver.cs: New flag -v2 to turn on version 2 features. 
7279
7280         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
7281         hashtable when v2 is enabled.
7282
7283 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
7284
7285         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
7286         there is already a namespace defined with this name.
7287
7288         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
7289         people upgraded their corlibs.
7290
7291         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
7292         always use fully qualified types, no need to use the compiler
7293         front end.
7294
7295         (TypeManager.IsNamespace): Use binarysearch.
7296
7297         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
7298         AddDelegate): I did not quite use the new IsValid API properly: I
7299         have to pass the short-name and the fullname.  I was passing only
7300         the basename instead of the fullname sometimes. 
7301
7302         (TypeContainer.DefineType): call NamespaceClash.
7303
7304         * interface.cs (Interface.DefineType): use NamespaceClash before
7305         defining the type.
7306
7307         * delegate.cs (Delegate.DefineType): use NamespaceClash before
7308         defining the type.
7309
7310         * enum.cs: (Enum.DefineType): use NamespaceClash before
7311         defining the type.
7312
7313         * typemanager.cs (: 3-line patch that gives us some tasty 11%
7314         speed increase.  First, use the negative_hits cache when we get a
7315         negative.  Second, add the type with its full original name
7316         instead of the new . and + encoded name (reflection uses + to
7317         separate type from a nested type).  Use LookupTypeReflection
7318         directly which bypasses the type->name hashtable (that we already
7319         know does not contain the type.
7320
7321         * decl.cs (DeclSpace.ResolveTypeExpr): track the
7322         location/container type. 
7323
7324         * driver.cs: When passing utf8, use directly the UTF8Encoding.
7325
7326 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
7327
7328         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
7329
7330         * delegate.cs (NewDelegate.Resolve): Test whether an instance
7331         method is being referenced in the method group from a static
7332         context, and report error 120 if so.
7333
7334         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
7335         Error118. 
7336
7337         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
7338         is created, we create the A namespace).
7339
7340         * cs-parser.jay: A namespace also introduces a DeclarationFound.
7341         Fixes #41591
7342
7343 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
7344
7345         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
7346         invocation to ModuleBuilder.GetType with the same values will
7347         return a new type instance, so we need to cache its return
7348         values. 
7349
7350         * expression.cs (Binary.ResolveOperator): Only allow the compare
7351         operators on enums if they are of the same type.
7352
7353         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
7354         types of ValueType on their own case.  Before we were giving them
7355         the same treatment as objects.
7356
7357         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
7358         fullname.  Short name is used to compare against container name.
7359         Fullname is used to check against defined namespace names.
7360
7361         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
7362         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
7363
7364         (Method.CheckBase): Call parent.
7365         (MemberBase.CheckBase): Check for protected members on sealed
7366         classes.
7367         (PropertyBase.CheckBase): Call parent.
7368         (Field.Define): Call parent.
7369
7370         * report.cs: Negative error codes are now mapped to 8000 - code,
7371         so that the display is render more nicely.
7372
7373         * typemanager.cs: Do not use try/catch, instead report a regular
7374         error. 
7375
7376         (GetPointerType, GetReferenceType): These methods provide
7377         mechanisms to obtain the T* and T& from a T.  We had the code
7378         previously scattered around the code base, and it also used
7379         TypeManager.LookupType that would go through plenty of caches.
7380         This one goes directly to the type source.
7381
7382         In some places we did the Type.GetType followed by
7383         ModuleBuilder.GetType, but not in others, so this unifies the
7384         processing as well.
7385
7386         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
7387         statements now that we have namespace information.
7388
7389         * typemanager.cs (IsNamespace): New method, returns whether the
7390         string presented is a namespace or not.
7391
7392         (ComputeNamespaces): New public entry point, computes the list of
7393         available namespaces, using the GetNamespaces API call in Mono, or
7394         the slower version in MS.NET.   
7395
7396         Now before we start the semantic analysis phase, we have a
7397         complete list of namespaces including everything that the user has
7398         provided.
7399
7400         Deleted old code to cache namespaces in .nsc files.
7401
7402 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
7403
7404         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
7405         class/struct location definition Location for the implicit
7406         constructor location.
7407
7408         (Operator.Define): Use the location of the operator for the
7409         implicit Method definition.
7410
7411         (Constructor.Emit): use the constructor location for the implicit
7412         base initializer constructor.
7413
7414         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
7415         and the Expression class now contains two new methods:
7416
7417         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
7418         isolate type lookup from the rest of the resolution process.
7419
7420         Since we use Expressions to hold type definitions due to the way
7421         we parse the input we have historically overloaded Resolve to
7422         perform the Type lookups if a special flag is passed.  Now this is
7423         eliminated and two methods take their place. 
7424
7425         The differences in the two methods between xStep and xTerminal is
7426         that xStep is involved in our current lookup system that uses
7427         SimpleNames to compose a name, while xTerminal is used just to
7428         catch the case where the simplename lookup failed.
7429
7430 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
7431
7432         * expression.cs (ResolveMemberAccess): Remove redundant code.
7433         TypeExpr expressions are always born fully resolved.
7434
7435         * interface.cs (PopulateMethod): Do not lookup the types twice.
7436         We were doing it once during SemanticAnalysis and once during
7437         PopulateMethod.
7438
7439         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
7440         in local variable type definitions, were being returned as a
7441         SimpleName (we decomposed everything into a string), that is
7442         because primary_expression was being used instead of a type in the
7443         grammar (reduce/reduce conflicts).
7444
7445         The part that was wrong is that we converted the expression into a
7446         string (an oversimplification in one hand, compounded with primary
7447         expressions doing string concatenation).
7448
7449         So things like:
7450
7451         A.B.C [] x;
7452
7453         Would return "A.B.C[]" as a SimpleName.  This stopped things like
7454         using clauses from working on this particular context.  And a type
7455         was being matched directly against "A.B.C[]".
7456
7457         We now use the correct approach, and allow for ComposedCast to be
7458         part of the unary expression.  So the "A.B.C []" become a composed
7459         cast of "A.B.C" (as a nested group of MemberAccess with a
7460         SimpleName at the end) plus the rank composition "[]". 
7461
7462         Also fixes 35567
7463
7464 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
7465
7466         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
7467         for the access level checking.
7468
7469         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
7470         `TypeContainer container', because I kept getting confused when I
7471         was debugging this code.
7472
7473         * expression.cs (Indexers): Instead of tracking getters/setters,
7474         we now track them in parallel.  We create one arraylist less, but
7475         most importantly it is possible now for the LValue code to find a
7476         matching get for a set.
7477
7478         (IndexerAccess.DoResolveLValue): Update the code.
7479         GetIndexersForType has been modified already to extract all the
7480         indexers from a type.  The code assumed it did not.
7481
7482         Also make the code set the correct return type for the indexer.
7483         This was fixed a long time ago for properties, but was missing for
7484         indexers.  It used to be void_type.
7485
7486         (Binary.Emit): Test first for doubles instead of
7487         floats, as they are more common.
7488
7489         (Binary.EmitBranchable): Use the .un version of the branch opcodes
7490         when dealing with floats and the <=, >= operators.  This fixes bug
7491         #39314 
7492
7493         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
7494         to load the array value by emitting a load on the foreach variable
7495         type.  This was incorrect.  
7496
7497         We now emit the code to load an element using the the array
7498         variable type, and then we emit the conversion operator.
7499
7500         Fixed #40176
7501
7502 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
7503
7504         * attribute.cs: Avoid allocation of ArrayLists in the common case.
7505
7506 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
7507
7508         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
7509         test for protection before we test for signatures. 
7510
7511         (MethodSignature.ToString): implement.
7512
7513         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
7514         to the case where we reduced into a LongConstant.
7515
7516         * decl.cs (CheckAccessLevel): If the type is an array, we can not
7517         depend on whether the information is acurrate, because the
7518         Microsoft runtime will always claim that the array type is public,
7519         regardless of the real state.
7520
7521         If the type is a pointer, another problem happens: the type is
7522         reported as non-public in Microsoft.  
7523
7524         In both cases we have to call CheckAccessLevel recursively with
7525         the underlying type as the argument to be tested.
7526
7527 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
7528
7529         * assign.cs (Assign.Emit): If we are dealing with a compound
7530         assignment expression, we should use the code path that stores the
7531         intermediate result in a temporary value.  This fixes #40903.
7532
7533         *expression.cs (Indirection.ToString): Provide ToString method for
7534         debugging. 
7535
7536 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
7537
7538         * class.cs: Null out fields holding references to Block objects so
7539         they can be garbage collected.
7540
7541         * expression.cs (OverloadResolve): Remove unused local.
7542
7543 2003-04-07  Martin Baulig  <martin@ximian.com>
7544
7545         * codegen.cs (EmitContext.CurrentFile): New public field.
7546         (EmitContext.Mark): Use the CurrentFile to check whether the
7547         location is in the correct file.
7548         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
7549
7550 2003-04-07  Martin Baulig  <martin@ximian.com>
7551
7552         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
7553
7554         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
7555         location.  [FIXME: The location argument which gets passed to this
7556         method is sometimes wrong!]
7557
7558 2003-04-07  Nick Drochak <ndrochak@gol.com>
7559
7560         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
7561
7562 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
7563
7564         * expression.cs (Indirection.EmitAssign): We were using the
7565         temporary, but returning immediately instead of continuing the
7566         EmitAssing flow.
7567
7568 2003-04-06  Martin Baulig  <martin@ximian.com>
7569
7570         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
7571         if it's a nested child, but also deriving from the outer class.
7572         See test 190.cs.
7573
7574         * typemanager.cs (IsNestedChildOf): Make this work if it's a
7575         nested child, but also deriving from the outer class.  See
7576         test-190.cs.
7577         (FilterWithClosure): We may access private members of the outer
7578         class if we're a nested child and deriving from the outer class.
7579         (RealMemberLookup): Only set `closure_private_ok' if the
7580         `original_bf' contained BindingFlags.NonPublic.
7581
7582 2003-04-05  Martin Baulig  <martin@ximian.com>
7583
7584         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
7585
7586 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
7587
7588         * class.cs (Event.Define): Do not allow abstract events to have
7589         initializers. 
7590
7591 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
7592
7593         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
7594         block in event declarations.
7595
7596         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
7597         value type, get its address.
7598
7599         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
7600         leaving a class on the stack instead of a boolean value (int
7601         0/1).  Change the code so we compare against null, and then the
7602         result against zero.
7603
7604         * class.cs (TypeContainer.GetClassBases): We were checking for the
7605         parent class being sealed too late.
7606
7607         * expression.cs (Binary.Emit): For <= and >= when dealing with
7608         floating point values, use cgt.un and clt.un instead of cgt and
7609         clt alone.
7610
7611 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
7612
7613         * statement.cs: Apply the same optimization as MS: skip the 
7614         GetEnumerator returning an IEnumerator, and use the one returning a 
7615         CharEnumerator instead. This allows us to avoid the try-finally block 
7616         and the boxing.
7617
7618 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
7619
7620         * cs-parser.jay: Attributes cannot be applied to
7621                          namespaces. Fixes #40473
7622
7623 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7624
7625         * class.cs:
7626         (Add*): check if the name is valid using the full name for constants,
7627         fields, properties and events.
7628
7629 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
7630
7631         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
7632         char constants to be part of the enumeration.
7633
7634         * expression.cs (Conditional.DoResolve): Add support for operator
7635         true. Implements the missing functionality from 14.12
7636
7637         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
7638         operator true/false as required by the spec.
7639
7640         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
7641         implicit conversion to boolean.
7642
7643         * statement.cs (Statement.ResolveBoolean): A boolean expression is
7644         also one where the type implements `operator true'. 
7645
7646         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
7647         get an expression that will invoke operator true based on an
7648         expression.  
7649
7650         (GetConversionOperators): Removed the hack that called op_True
7651         here.  
7652
7653         (Expression.ResolveBoolean): Move this from Statement.
7654
7655 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
7656
7657         * ecore.cs (FieldExpr): do not allow initialization of initonly
7658         fields on derived classes
7659
7660 2003-03-13  Martin Baulig  <martin@ximian.com>
7661
7662         * statement.cs (Block.Emit): Call ig.BeginScope() and
7663         ig.EndScope() when compiling with debugging info; call
7664         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
7665
7666 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
7667
7668         * expression.cs (Indexers): Do not construct immediately, allow
7669         for new members to be appended as we go.  Fixes 38143
7670
7671 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7672
7673         * expression.cs: save/restore context when resolving an unchecked
7674         expression.
7675
7676 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
7677
7678         * cfold.cs: Catch division by zero in modulus operator during
7679         constant folding.
7680
7681 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
7682
7683         * interface.cs (Interface.DefineMembers): Avoid defining members
7684         twice. 
7685
7686 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
7687
7688         * driver.cs: handle the +/- options for -noconfig
7689
7690         * statement.cs (Unckeched.Resolve): Also track the state of
7691         unchecked in the Resolve phase.
7692
7693 2003-02-27  Martin Baulig  <martin@ximian.com>
7694
7695         * ecore.cs (Expression.MemberLookup): Don't create a
7696         MethodGroupExpr for something which is not a method.  Fixes #38291.
7697
7698 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
7699
7700         * class.cs (MemberBase.CheckParameters): Also check that the type
7701         is unmanaged if it is a pointer.
7702
7703         * expression.cs (SizeOf.Resolve): Add location information.
7704
7705         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
7706         a managed type is declared.
7707
7708         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
7709         parameter modifiers as well.  Fixes bug 38606
7710
7711         * class.cs: Very sad.  Am backing out the speed up changes
7712         introduced by the ArrayList -> Array in the TypeContainer, as they
7713         were not actually that much faster, and introduced a bug (no error
7714         reports on duplicated methods).
7715
7716         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
7717         source first, this will guarantee that we have a valid expression
7718         before calling in lower levels functions that will require a
7719         resolved object.  Then use this original_source in the
7720         target.ResolveLValue instead of the original source that was
7721         passed to us.
7722
7723         Another change.  Use target.Resolve instead of LValueResolve.
7724         Although we are resolving for LValues, we will let the Assign code
7725         take care of that (it will be called again from Resolve).  This
7726         basically allows code like this:
7727
7728         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
7729         class Y { void A (X x) { x [0] += o; }
7730
7731         The problem was that the indexer was trying to resolve for
7732         set_Item (idx, object o) and never finding one.  The real set_Item
7733         was set_Item (idx, X).  By delaying the process we get the right
7734         semantics. 
7735
7736         Fixes bug 36505
7737
7738 2003-02-23  Martin Baulig  <martin@ximian.com>
7739
7740         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
7741         while calling DoEmit ().
7742
7743         * codegen.cs (EmitContext.Mark): Don't mark locations in other
7744         source files; if you use the #line directive inside a method, the
7745         compiler stops emitting line numbers for the debugger until it
7746         reaches the end of the method or another #line directive which
7747         restores the original file.
7748
7749 2003-02-23  Martin Baulig  <martin@ximian.com>
7750
7751         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
7752
7753 2003-02-23  Martin Baulig  <martin@ximian.com>
7754
7755         * statement.cs (Block.AddChildVariableNames): We need to call this
7756         recursively, not just for our immediate children.
7757
7758 2003-02-23  Martin Baulig  <martin@ximian.com>
7759
7760         * class.cs (Event.Define): Always make the field private, like csc does.
7761
7762         * typemanager.cs (TypeManager.RealMemberLookup): Make events
7763         actually work, fixes bug #37521.
7764
7765 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
7766
7767         * delegate.cs: When creating the various temporary "Parameters"
7768         classes, make sure that we call the ComputeAndDefineParameterTypes
7769         on those new parameters (just like we do with the formal ones), to
7770         allow them to be resolved in the context of the DeclSpace.
7771
7772         This fixes the bug that Dick observed in Bugzilla #38530.
7773
7774 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
7775
7776         * expression.cs (ResolveMemberAccess): When resolving a constant,
7777         do not attempt to pull a constant if the value was not able to
7778         generate a valid constant.
7779
7780         * const.cs (LookupConstantValue): Do not report more errors than required.
7781
7782 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7783
7784         * expression.cs: fixes bug #38328.
7785
7786 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7787
7788         * class.cs: Changed all the various members that can be part of a
7789         class from being an ArrayList to be an Array of the right type.
7790         During the DefineType type_list, interface_list, delegate_list and
7791         enum_list are turned into types, interfaces, delegates and enums
7792         arrays.  
7793
7794         And during the member population, indexer_list, event_list,
7795         constant_list, field_list, instance_constructor_list, method_list,
7796         operator_list and property_list are turned into their real arrays.
7797
7798         Although we could probably perform this operation earlier, for
7799         good error reporting we need to keep the lists and remove the
7800         lists for longer than required.
7801
7802         This optimization was triggered by Paolo profiling the compiler
7803         speed on the output of `gen-sample-program.pl' perl script. 
7804
7805         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
7806         not crash in methods like MemberLookupFailed that use this field.  
7807
7808         This problem arises when the compiler fails to resolve a type
7809         during interface type definition for example.
7810
7811 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7812
7813         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
7814         inherit from System.Object, so we have to stop at null, not only
7815         when reaching System.Object.
7816
7817 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
7818
7819         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7820         DeclaredOnly because the parent indexer might have had a different
7821         name, but did not loop until the top of the hierarchy was reached.
7822
7823         The problem this one fixes is 35492: when a class implemented an
7824         indexer from an interface, we were getting the interface method
7825         (which was abstract) and we were flagging an error (can not invoke
7826         abstract method).
7827
7828         This also keeps bug 33089 functioning, and test-148 functioning.
7829
7830         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7831         out if a method is special is to see if it is declared in a
7832         property or event, or whether it is one of the predefined operator
7833         names.   This should fix correctly #36804.
7834
7835 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7836
7837         The goal here is to remove the dependency on EmptyCast.Peel ().
7838         Killing it completely.
7839
7840         The problem is that currently in a number of places where
7841         constants are expected, we have to "probe" for an EmptyCast, and
7842         Peel, which is not the correct thing to do, as this will be
7843         repetitive and will likely lead to errors. 
7844
7845         The idea is to remove any EmptyCasts that are used in casts that
7846         can be reduced to constants, so we only have to cope with
7847         constants. 
7848
7849         This bug hunt was triggered by Bug 37363 and the desire to remove
7850         the duplicate pattern where we were "peeling" emptycasts to check
7851         whether they were constants.  Now constants will always be
7852         constants.
7853
7854         * ecore.cs: Use an enumconstant here instead of wrapping with
7855         EmptyCast.  
7856
7857         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7858         throwing me off.  By handling this we can get rid of a few hacks.
7859
7860         * statement.cs (Switch): Removed Peel() code.
7861
7862 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7863
7864         * class.cs: Location information for error 508
7865
7866         * expression.cs (New.DoResolve): Add a guard against double
7867         resolution of an expression.  
7868
7869         The New DoResolve might be called twice when initializing field
7870         expressions (see EmitFieldInitializers, the call to
7871         GetInitializerExpression will perform a resolve on the expression,
7872         and later the assign will trigger another resolution
7873
7874         This leads to bugs (#37014)
7875
7876         * delegate.cs: The signature for EndInvoke should contain any ref
7877         or out parameters as well.  We were not doing this in the past. 
7878
7879         * class.cs (Field.Define): Do not overwrite the type definition
7880         inside the `volatile' group.  Turns out that volatile enumerations
7881         were changing the type here to perform a validity test, which
7882         broke conversions. 
7883
7884 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7885
7886         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7887         and structs, we do not want to load the instance variable
7888
7889         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7890         enum_type has to be handled like an object reference (implicit
7891         conversions exists from this to object), but the regular IsClass
7892         and IsValueType tests will never return true for this one.
7893
7894         Also we use TypeManager.IsValueType instead of type.IsValueType,
7895         just for consistency with the rest of the code (this is only
7896         needed if we ever use the construct exposed by test-180.cs inside
7897         corlib, which we dont today).
7898
7899 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7900
7901         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7902         just InternalCall.
7903
7904 2003-02-09  Martin Baulig  <martin@ximian.com>
7905
7906         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7907         (Namespace.DefineNamespaces): New static public method; this is
7908         called when we're compiling with debugging to add all namespaces
7909         to the symbol file.
7910
7911         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7912         pass it to the Namespace's .ctor.
7913
7914         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7915         and MethodBase arguments; pass the namespace ID to the symwriter;
7916         pass the MethodBase instead of the token to the symwriter.
7917         (SymbolWriter.DefineNamespace): New method to add a namespace to
7918         the symbol file.
7919
7920 2003-02-09  Martin Baulig  <martin@ximian.com>
7921
7922         * symbolwriter.cs: New file.  This is a wrapper around
7923         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7924         methods here in near future.
7925
7926 2003-02-09  Martin Baulig  <martin@ximian.com>
7927
7928         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7929         ILGenerator.MarkSequencePoint() which are actually used by the
7930         symbol writer.
7931
7932 2003-02-09  Martin Baulig  <martin@ximian.com>
7933
7934         * location.cs (SourceFile): New public sealed class.  This
7935         contains the name and an index which is used in the location's token.
7936         (Location): Reserve an appropriate number of bits in the token for
7937         the source file instead of walking over that list, this gives us a
7938         really huge performance improvement when compiling with debugging.
7939
7940         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7941         `SourceFile' argument instead of a string.
7942         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7943         but don't parse/tokenize here, we need to generate the list of all
7944         source files before we do that.
7945         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7946         the files.
7947
7948         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7949         instead of a string.
7950
7951         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7952         of a string.
7953
7954 2003-02-09  Martin Baulig  <martin@ximian.com>
7955
7956         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7957         filename on `#line default'.
7958
7959 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7960
7961         * statement.cs: don't clear the pinned var when the fixed statement
7962         returns from the method (fixes bug#37752).
7963
7964 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7965
7966         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7967         to IsValueType.
7968
7969 2003-02-07  Martin Baulig  <martin@ximian.com>
7970
7971         * driver.cs: Removed the `--debug-args' command line argument.
7972
7973         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7974         automatically by the AsssemblyBuilder.
7975         (CodeGen.InitializeSymbolWriter): We don't need to call any
7976         initialization function on the symbol writer anymore.  This method
7977         doesn't take any arguments.
7978
7979 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7980
7981         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7982         from referenced assemblies as well.
7983
7984 2003-02-02  Martin Baulig  <martin@ximian.com>
7985
7986         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7987
7988 2003-02-02  Martin Baulig  <martin@ximian.com>
7989
7990         * class.cs (Constructor.Emit): Open the symbol writer before
7991         emitting the constructor initializer.
7992         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7993         single-stepping through constructor initializers.
7994
7995 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7996
7997         * class.cs: Handle error 549: do not allow virtual methods in
7998         sealed classes. 
7999
8000 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
8001
8002         * decl.cs: Check access levels when resolving types
8003
8004 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
8005
8006         * statement.cs: Add parameters and locals set in catch blocks that might 
8007         return to set vector
8008
8009 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
8010
8011         * class.cs (Operator): Set the SpecialName flags for operators.
8012
8013         * expression.cs (Invocation.DoResolve): Only block calls to
8014         accessors and operators on SpecialName methods.
8015
8016         (Cast.TryReduce): Handle conversions from char constants.
8017
8018
8019 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
8020
8021         * statement.cs: small memory and time optimization in FlowBranching.
8022
8023 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
8024
8025         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
8026         problem that the last fix but in the other sid (Set).
8027
8028         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
8029         access when there is no indexer in the hierarchy.
8030
8031 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
8032
8033         * class.cs: Combine some if statements.
8034
8035 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8036
8037         * driver.cs: fixed bug #37187.
8038
8039 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
8040
8041         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
8042         any indexer, it's needed to build a list with all the indexers in the
8043         hierarchy (AllGetters), else we have problems. Fixes #35653.
8044
8045 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
8046
8047         * class.cs (MethodData.Define): It is wrong for an interface
8048         implementation to be static in both cases: explicit and implicit.
8049         We were only handling this in one case.
8050
8051         Improve the if situation there to not have negations.
8052
8053         * class.cs (Field.Define): Turns out that we do not need to check
8054         the unsafe bit on field definition, only on usage.  Remove the test.
8055
8056 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8057
8058         * driver.cs: use assembly.Location instead of Codebase (the latest
8059         patch made mcs fail when using MS assemblies).
8060
8061 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
8062
8063         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
8064         get the path to *corlib.dll.
8065
8066 2003-01-21  Nick Drochak <ndrochak@gol.com>
8067
8068         * cs-tokenizer.cs:
8069         * pending.cs:
8070         * typemanager.cs: Remove compiler warnings
8071
8072 2003-01-20  Duncan Mak  <duncan@ximian.com>
8073
8074         * AssemblyInfo.cs: Bump the version number to 0.19.
8075
8076 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8077
8078         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
8079
8080 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
8081
8082         * class.cs (Constructor::Emit): Emit debugging info for constructors.
8083
8084 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
8085
8086         * cs-parser.jay: Small fix: we were not comparing the constructor
8087         name correctly.   Thanks to Zoltan for the initial pointer.
8088
8089 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
8090
8091         * cs-tokenizer.cs: Set file name when specified with #line
8092
8093 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
8094
8095         * cs-parser.jay: Only perform the constructor checks here if we
8096         are named like the class;  This will help provider a better
8097         error.  The constructor path is taken when a type definition is
8098         not found, but most likely the user forgot to add the type, so
8099         report that rather than the constructor error.
8100
8101 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
8102
8103         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
8104         allocations.
8105
8106 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
8107
8108         * cs-parser.jay: Add cleanup call.
8109
8110 2003-01-13  Duncan Mak  <duncan@ximian.com>
8111
8112         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
8113         consistent with other methods.
8114
8115 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
8116
8117         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
8118
8119 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
8120
8121         * attribute.cs: only set GuidAttr to true when we have a
8122         GuidAttribute.
8123
8124 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8125
8126         * ecore.cs:
8127         * expression.cs:
8128         * typemanager.cs: fixes to allow mcs compile corlib with the new
8129         Type.IsSubclassOf fix.
8130
8131 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
8132
8133         * expression.cs (LocalVariableReference.DoResolve): Classify a
8134         constant as a value, not as a variable.   Also, set the type for
8135         the variable.
8136
8137         * cs-parser.jay (fixed_statement): take a type instead of a
8138         pointer_type, so we can produce a better error message later.
8139
8140         * statement.cs (Fixed.Resolve): Flag types that are not pointers
8141         as an error.  
8142
8143         (For.DoEmit): Make inifinite loops have a
8144         non-conditional branch back.
8145
8146         (Fixed.DoEmit): First populate the pinned variables, then emit the
8147         statement, then clear the variables.  Before I was emitting the
8148         code once for each fixed piece.
8149
8150
8151 2003-01-08  Martin Baulig  <martin@ximian.com>
8152
8153         * statement.cs (FlowBranching.MergeChild): A break in a
8154         SWITCH_SECTION does not leave a loop.  Fixes #36155.
8155
8156 2003-01-08  Martin Baulig  <martin@ximian.com>
8157
8158         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
8159         lives in the same number space than `param_map'.  Fixes #36154.
8160
8161 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
8162
8163         * cs-parser.jay (constructor_declaration): Set the
8164         Constructor.ModFlags before probing for it.  This makes the
8165         compiler report 514, 515 and 132 (the code was there, but got
8166         broken). 
8167
8168         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
8169         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
8170         (GotoCase.Resolve): Set `Returns' to ALWAYS.
8171
8172 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
8173
8174         * enum.cs: create the enum static fields using the enum type.
8175
8176 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
8177
8178         * class.cs: don't try to create the ParamBuilder for the return
8179         type if it's not needed (and handle it breaking for the ms runtime
8180         anyway).
8181
8182 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
8183
8184         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
8185
8186 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
8187
8188         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
8189         the command.   This showed up while compiling the JANET source
8190         code, which used \r as its only newline separator.
8191
8192 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
8193
8194         * class.cs (Method.Define): If we are an operator (because it
8195         reuses our code), then set the SpecialName and HideBySig.  #36128
8196
8197 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
8198
8199         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
8200         exception, report error 120 `object reference required'.
8201
8202         * driver.cs: Add --pause option, used during to measure the size
8203         of the process as it goes with --timestamp.
8204
8205         * expression.cs (Invocation.DoResolve): Do not allow methods with
8206         SpecialName to be invoked.
8207
8208 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
8209
8210         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
8211         number before adding it.
8212
8213 2002-12-21  Ravi Pratap  <ravi@ximian.com>
8214
8215         * ecore.cs (StandardImplicitConversion): When in an unsafe
8216         context, we allow conversion between void * to any other pointer
8217         type. This fixes bug #35973.
8218
8219 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
8220
8221         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
8222         is not thrown when extensionless outputs are used 
8223
8224 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8225
8226         * rootcontext.cs: fixed compilation of corlib.
8227
8228 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
8229
8230         * attribute.cs (Attributes.Contains): Add new method.
8231
8232         * class.cs (MethodCore.LabelParameters): if the parameter is an
8233         `out' parameter, check that no attribute `[In]' has been passed.
8234
8235         * enum.cs: Handle the `value__' name in an enumeration.
8236
8237 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
8238
8239         * decl.cs: Added special case to allow overrides on "protected
8240         internal" methods
8241
8242 2002-12-18  Ravi Pratap  <ravi@ximian.com>
8243
8244         * attribute.cs (Attributes.AddAttributeSection): Rename to this
8245         since it makes much more sense.
8246
8247         (Attributes.ctor): Don't require a Location parameter.
8248
8249         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
8250
8251         * attribute.cs (ApplyAttributes): Remove extra Location parameters
8252         since we already have that information per attribute.
8253
8254         * everywhere : make appropriate changes.
8255
8256         * class.cs (LabelParameters): Write the code which actually
8257         applies attributes to the return type. We can't do this on the MS
8258         .NET runtime so we flag a warning in the case an exception is
8259         thrown.
8260
8261 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
8262
8263         * const.cs: Handle implicit null conversions here too.
8264
8265 2002-12-17  Ravi Pratap  <ravi@ximian.com>
8266
8267         * class.cs (MethodCore.LabelParameters): Remove the extra
8268         Type [] parameter since it is completely unnecessary. Instead
8269         pass in the method's attributes so that we can extract
8270         the "return" attribute.
8271
8272 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
8273
8274         * cs-parser.jay (parse): Use Report.Error to flag errors instead
8275         of ignoring it and letting the compile continue.
8276
8277         * typemanager.cs (ChangeType): use an extra argument to return an
8278         error condition instead of throwing an exception.
8279
8280 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
8281
8282         * expression.cs (Unary.TryReduce): mimic the code for the regular
8283         code path.  Perform an implicit cast in the cases where we can
8284         implicitly convert to one of the integral types, and then reduce
8285         based on that constant.   This fixes bug #35483.
8286
8287 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8288
8289         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
8290
8291 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8292
8293         * namespace.cs: fixed bug #35489.
8294
8295 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
8296
8297         * class.cs: Remove some dead code.
8298
8299         * cs-parser.jay: Estimate the number of methods needed
8300         (RootContext.MethodCount);
8301
8302         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
8303         numbers instead of StringBuilders.
8304
8305         * support.cs (PtrHashtable): Add constructor with initial size;
8306         We can now reduce reallocations of the method table.
8307
8308 2002-12-10  Ravi Pratap  <ravi@ximian.com>
8309
8310         * attribute.cs (ApplyAttributes): Keep track of the emitted
8311         attributes on a per-target basis. This fixes bug #35413.
8312
8313 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
8314
8315         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
8316         default to the Windows 1252 encoding.
8317
8318         (UnixParseOption): Support version, thanks to Alp for the missing
8319         pointer. 
8320
8321         * AssemblyInfo.cs: Add nice assembly information.
8322
8323         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
8324         (bug 35169).
8325
8326         * cs-parser.jay: Allow a trailing comma before the close bracked
8327         in the attribute_section production.
8328
8329         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
8330         address of the instance was being taken, I will take this out,
8331         because we take the address of the object immediately here.
8332
8333 2002-12-09  Ravi Pratap  <ravi@ximian.com>
8334
8335         * typemanager.cs (AreMultipleAllowed): Take care of the most
8336         obvious case where attribute type is not in the current assembly -
8337         stupid me ;-)
8338
8339 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
8340
8341         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
8342         definitions, instead of doing that afterwards.  
8343
8344         Also we use a nice little hack, depending on the constructor, we
8345         know if we are a "composed" name or a simple name.  Hence, we
8346         avoid the IndexOf test, and we avoid 
8347
8348         * codegen.cs: Add code to assist in a bug reporter to track down
8349         the source of a compiler crash. 
8350
8351 2002-12-07  Ravi Pratap  <ravi@ximian.com>
8352
8353         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
8354         types have been emitted for a given element and flag an error
8355         if something which does not have AllowMultiple set is used more
8356         than once.
8357
8358         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
8359         attribute types and their corresponding AllowMultiple properties
8360
8361         (AreMultipleAllowed): Check the property for a given type.
8362
8363         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
8364         property in the case we have a TypeContainer.
8365
8366         (Attributes.AddAttribute): Detect duplicates and just skip on
8367         adding them. This trivial fix catches a pretty gross error in our
8368         attribute emission - global attributes were being emitted twice!
8369
8370         Bugzilla bug #33187 is now fixed.
8371
8372 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
8373
8374         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
8375         instead of pp_and).
8376
8377         * expression.cs (Binary.ResolveOperator): I can only use the
8378         Concat (string, string, string) and Concat (string, string,
8379         string, string) if the child is actually a concatenation of
8380         strings. 
8381
8382 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
8383
8384         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
8385         context where we need a 2-character lookahead.
8386
8387         * pending.cs (PendingImplementation): Rework so we can keep track
8388         of interface types all the time, and flag those which were
8389         implemented by parents as optional.
8390
8391 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
8392
8393         * expression.cs (Binary.ResolveOperator): Use
8394         String.Concat(string,string,string) or
8395         String.Concat(string,string,string,string) when possible. 
8396
8397         * typemanager: More helper methods.
8398
8399
8400 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
8401
8402         * pending.cs: remove the bogus return from GetMissingInterfaces()
8403         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
8404
8405 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8406
8407         * namespace.cs: avoid duplicated 'using xxx' being added to
8408         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
8409         when we get more than one 'using' statement for the same namespace.
8410         Report a CS0105 warning for it.
8411
8412 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
8413
8414         * cs-tokenizer.cs (consume_identifier): use read directly, instead
8415         of calling getChar/putback, uses internal knowledge of it.    
8416
8417         (xtoken): Reorder tokenizer so most common patterns are checked
8418         first.  This reduces the compilation time in another 5% (from 8.11s
8419         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
8420
8421         The parsing time is 22% of the compilation in mcs, and from that
8422         64% is spent on the tokenization process.  
8423
8424         I tried using a binary search for keywords, but this is slower
8425         than the hashtable.  Another option would be to do a couple of
8426         things:
8427
8428                 * Not use a StringBuilder, instead use an array of chars,
8429                   with a set value.  Notice that this way we could catch
8430                   the 645 error without having to do it *afterwards*.
8431
8432                 * We could write a hand-parser to avoid the hashtable
8433                   compares altogether.
8434
8435         The identifier consumption process takes 37% of the tokenization
8436         time.  Another 15% is spent on is_number.  56% of the time spent
8437         on is_number is spent on Int64.Parse:
8438
8439                 * We could probably choose based on the string length to
8440                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
8441                   computations. 
8442
8443         Another 3% is spend on wrapping `xtoken' in the `token' function.
8444
8445         Handle 0xa0 as whitespace (#34752)
8446
8447 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
8448
8449         * typemanager.cs (IsCLRType): New routine to tell whether a type
8450         is one of the builtin types.  
8451
8452         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
8453         typecode in more places instead of doing pointer comparissions.
8454         We could leverage some knowledge about the way the typecodes are
8455         laid out.
8456
8457         New code to cache namespaces in assemblies, it is currently not
8458         invoked, to be used soon.
8459
8460         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
8461
8462         * expression.cs (Binary.ResolveOperator): specially handle
8463         strings, and do not perform user-defined operator overloading for
8464         built-in types.
8465
8466 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
8467
8468         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
8469         internalcall as it is a pretty simple operation;  Avoid whenever
8470         possible to call Char.IsLetter.
8471
8472         (consume_identifier): Cut by half the number of
8473         hashtable calls by merging the is_keyword and GetKeyword behavior.
8474
8475         Do not short-circuit, because if we do, we
8476         report errors (ie, #if false && true would produce an invalid
8477         directive error);
8478
8479
8480 2002-11-24  Martin Baulig  <martin@ximian.com>
8481
8482         * expression.cs (Cast.TryReduce): If we're in checked syntax,
8483         check constant ranges and report a CS0221.  Fixes #33186.
8484
8485 2002-11-24  Martin Baulig  <martin@ximian.com>
8486
8487         * cs-parser.jay: Make this work for uninitialized variable
8488         declarations in the `for' initializer.  Fixes #32416.
8489
8490 2002-11-24  Martin Baulig  <martin@ximian.com>
8491
8492         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
8493         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
8494
8495 2002-11-24  Martin Baulig  <martin@ximian.com>
8496
8497         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
8498         argument; if true, we also check for user-defined conversions.
8499         This is only needed if both arguments are of a user-defined type.
8500         Fixes #30443, added test-175.cs.
8501         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
8502
8503         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
8504
8505 2002-11-24  Martin Baulig  <martin@ximian.com>
8506
8507         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
8508         function to get the store opcode.
8509         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
8510         only emit the Ldelema if the store opcode is Stobj.  You must run
8511         both test-34 and test-167 to test this.  Fixes #34529.
8512
8513 2002-11-23  Martin Baulig  <martin@ximian.com>
8514
8515         * ecore.cs (Expression.MemberLookup): Added additional
8516         `qualifier_type' argument which is used when we're being called
8517         from MemberAccess.DoResolve() and null if we're called from a
8518         SimpleName lookup.
8519         (Expression.MemberLookupFailed): New method to report errors; this
8520         does the CS1540 check and reports the correct error message.
8521
8522         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
8523         argument for the CS1540 check and redone the way how we're dealing
8524         with private members.  See the comment in the source code for details.
8525         (FilterWithClosure): Reverted this back to revision 1.197; renamed
8526         `closure_start_type' to `closure_qualifier_type' and check whether
8527         it's not null.  It was not this filter being broken, it was just
8528         being called with the wrong arguments.
8529
8530         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
8531         and pass it the correct `qualifier_type'; this also does the error
8532         handling for us.
8533
8534 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
8535
8536         * expression.cs (Invocation.EmitParams): If the we are dealing
8537         with a non-built-in value type, load its address as well.
8538
8539         (ArrayCreation): Use a a pretty constant instead
8540         of the hardcoded value 2.   Use 6 instead of 2 for the number of
8541         static initializers.  
8542
8543         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
8544         because they are not really value types, just glorified integers. 
8545
8546         * driver.cs: Do not append .exe, the CSC compiler does not do it.
8547
8548         * ecore.cs: Remove redundant code for enumerations, make them use
8549         the same code path as everything else, fixes the casting issue
8550         with enumerations in Windows.Forms.
8551
8552         * attribute.cs: Do only cast to string if it is a string, the
8553         validation happens later.
8554
8555         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
8556         people upgrade their corlibs.
8557
8558         * ecore.cs: Oops, enumerations were not following the entire code path
8559
8560 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
8561
8562         * typemanager.cs (FilterWithClosure): Commented out the test for
8563         1540 in typemanager.cs, as it has problems when accessing
8564         protected methods from a parent class (see test-174.cs). 
8565
8566         * attribute.cs (Attribute.ValidateGuid): new method.
8567         (Attribute.Resolve): Use above.
8568
8569 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
8570
8571         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
8572
8573         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
8574         handling for enumerations, as we only needed the TypeContainer
8575         functionality to begin with (this is required for the fix below to
8576         work for enums that reference constants in a container class for
8577         example). 
8578
8579         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
8580
8581         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
8582         a valid TypeBuilder to perform lookups on.o
8583
8584         * class.cs (InheritableMemberSignatureCompare): Use true in the
8585         call to GetGetMethod and GetSetMethod, because we are comparing
8586         the signature, and we need to get the methods *even* if they are
8587         private. 
8588
8589         (PropertyBase.CheckBase): ditto.
8590
8591         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
8592         GotoCase.Resolve): Use Peel on EmpytCasts.
8593
8594         * ecore.cs (EmptyCast): drop child, add Peel method.
8595
8596 2002-11-17  Martin Baulig  <martin@ximian.com>
8597
8598         * ecore.cs (EmptyCast.Child): New public property.
8599
8600         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
8601         label resolved to an EmptyCast.  Fixes #34162.
8602         (GotoCase.Resolve): Likewise.
8603         (Block.EmitMeta): Likewise.
8604
8605 2002-11-17  Martin Baulig  <martin@ximian.com>
8606
8607         * expression.cs (Invocation.BetterConversion): Prefer int over
8608         uint; short over ushort; long over ulong for integer literals.
8609         Use ImplicitConversionExists instead of StandardConversionExists
8610         since we also need to check for user-defined implicit conversions.
8611         Fixes #34165.  Added test-173.cs.
8612
8613 2002-11-16  Martin Baulig  <martin@ximian.com>
8614
8615         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
8616         with the `true' and `false' literals.  Fixes #33151.
8617
8618 2002-11-16  Martin Baulig  <martin@ximian.com>
8619
8620         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
8621         October 22nd; don't do the cs1540 check for static members.
8622
8623         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
8624         now using our own filter here and doing the cs1540 check again.
8625
8626 2002-11-16  Martin Baulig  <martin@ximian.com>
8627
8628         * support.cs (InternalParameters): Don't crash if we don't have
8629         any fixed parameters.  Fixes #33532.
8630
8631 2002-11-16  Martin Baulig  <martin@ximian.com>
8632
8633         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
8634         when looking up static methods to make this work on Windows.
8635         Fixes #33773.
8636
8637 2002-11-16  Martin Baulig  <martin@ximian.com>
8638
8639         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
8640         a setter rather than using PropertyInfo.CanWrite.
8641
8642 2002-11-15  Nick Drochak  <ndrochak@gol.com>
8643
8644         * class.cs: Allow acces to block member by subclasses. Fixes build
8645         breaker.
8646
8647 2002-11-14  Martin Baulig  <martin@ximian.com>
8648
8649         * class.cs (Constructor.Emit): Added the extern/block check.
8650         Fixes bug #33678.
8651
8652 2002-11-14  Martin Baulig  <martin@ximian.com>
8653
8654         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
8655         iteration while looking for indexers, this is needed because the
8656         indexer may have a different name in our base classes.  Fixed the
8657         error reporting (no indexers at all, not get accessor, no
8658         overloaded match).  Fixes bug #33089.
8659         (IndexerAccess.DoResolveLValue): Likewise.
8660
8661 2002-11-14  Martin Baulig  <martin@ximian.com>
8662
8663         * class.cs (PropertyBase.CheckBase): Make this work for multiple
8664         indexers.  Fixes the first part of bug #33089.
8665         (MethodSignature.InheritableMemberSignatureCompare): Added support
8666         for properties.
8667
8668 2002-11-13  Ravi Pratap  <ravi@ximian.com>
8669
8670         * attribute.cs (Attribute.Resolve): Catch the
8671         NullReferenceException and report it since it isn't supposed to
8672         happen. 
8673
8674 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
8675
8676         * expression.cs (Binary.EmitBranchable): Also handle the cases for
8677         LogicalOr and LogicalAnd that can benefit from recursively
8678         handling EmitBranchable.  The code now should be nice for Paolo.
8679
8680 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
8681
8682         * typemanager.cs (LookupType): Added a negative-hit hashtable for
8683         the Type lookups, as we perform quite a number of lookups on
8684         non-Types.  This can be removed once we can deterministically tell
8685         whether we have a type or a namespace in advance.
8686
8687         But this might require special hacks from our corlib.
8688
8689         * TODO: updated.
8690
8691         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
8692         and double which avoids a conversion from an integer to a double.
8693
8694         * expression.cs: tiny optimization, avoid calling IsConstant,
8695         because it effectively performs the lookup twice.
8696
8697 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
8698
8699         But a bogus return here to keep the semantics of the old code
8700         until the Mono runtime is fixed.
8701
8702         * pending.cs (GetMissingInterfaces): New method used to remove all
8703         the interfaces that are already implemented by our parent
8704         classes from the list of pending methods. 
8705
8706         * interface.cs: Add checks for calls after ResolveTypeExpr.
8707
8708 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
8709
8710         * class.cs (Class.Emit): Report warning 67: event not used if the
8711         warning level is beyond 3.
8712
8713         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
8714         being a NullLiteral.
8715
8716         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
8717         specifiers. 
8718
8719         * class.cs (TypeContainer.GetClassBases): Cover a missing code
8720         path that might fail if a type can not be resolved.
8721
8722         * expression.cs (Binary.Emit): Emit unsigned versions of the
8723         operators. 
8724
8725         * driver.cs: use error 5.
8726
8727 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
8728
8729         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
8730
8731 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
8732
8733         * cs-parser.jay (switch_section): A beautiful patch from Martin
8734         Baulig that fixed 33094.
8735
8736 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
8737
8738         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
8739         Check whether the base is abstract and report an error if so.
8740
8741         * expression.cs (IndexerAccess.DoResolveLValue,
8742         IndexerAccess.DoResolve): ditto. 
8743
8744         (Invocation.DoResolve): ditto.
8745
8746         (Invocation.FullMethodDesc): Improve the report string.
8747
8748         * statement.cs (Block): Eliminate IsVariableDefined as it is
8749         basically just a wrapper for GetVariableInfo.
8750
8751         * ecore.cs (SimpleName): Use new 
8752
8753         * support.cs (ReflectionParamter.ParameterType): We unwrap the
8754         type, as we return the actual parameter ref/unref state on a
8755         different call.
8756
8757 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
8758
8759         * support.cs: Return proper flags REF/OUT fixing the previous
8760         commit.  
8761
8762         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
8763         not used to mean `ref' but `ref or out' in ParameterReference
8764
8765         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
8766         full type signature instead of calling TypeManger.CSharpName
8767         ourselves. 
8768
8769         * support.cs (InternalParameters.ParameterDesc): Do not compare
8770         directly to the modflags, because REF/OUT will actually be bitsets
8771         if set. 
8772
8773         * delegate.cs (VerifyMethod): Check also the modifiers.
8774
8775         * cs-tokenizer.cs: Fix bug where floating point values with an
8776         exponent where a sign was missing was ignored.
8777
8778         * driver.cs: Allow multiple assemblies to be specified in a single
8779         /r: argument
8780
8781 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
8782
8783         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
8784         because identifiers after a parenthesis would end up in this kind
8785         of production, and we needed to desamiguate it for having casts
8786         like:
8787
8788                 (UserDefinedType *) xxx
8789
8790 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
8791
8792         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
8793         we should set on the Bindingflags.NonPublic, but not turn on
8794         private_ok.  private_ok controls whether a Private member is
8795         returned (this is chekced on the filter routine), while the
8796         BindingFlags.NonPublic just controls whether private/protected
8797         will be allowed.   This fixes the problem part of the problem of
8798         private properties being allowed to be used in derived classes.
8799
8800         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
8801         so we can call the children DoResolveLValue method (this will
8802         properly signal errors on lvalue assignments to base properties)
8803
8804         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
8805         getter are null, and we have a property info, we know that this
8806         happened because the lookup failed, so we report an error 122 for
8807         protection level violation.
8808
8809         We also silently return if setter and getter are null in the
8810         resolve functions, this condition only happens if we have flagged
8811         the error before.  This is the other half of the problem. 
8812
8813         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
8814         not have accessibility information, that is why we were returning
8815         true in the filter function in typemanager.cs.
8816
8817         To properly report 122 (property is inaccessible because of its
8818         protection level) correctly, we report this error in ResolveAccess
8819         by failing if both the setter and the getter are lacking (ie, the
8820         lookup failed). 
8821
8822         DoResolve and DoLResolve have been modified to check for both
8823         setter/getter being null and returning silently, the reason being
8824         that I did not want to put the knowledge about this error in upper
8825         layers, like:
8826
8827         int old = Report.Errors;
8828         x = new PropertyExpr (...);
8829         if (old != Report.Errors)
8830                 return null;
8831         else
8832                 return x;
8833
8834         So the property expr is returned, but it is invalid, so the error
8835         will be flagged during the resolve process. 
8836
8837         * class.cs: Remove InheritablePropertySignatureCompare from the
8838         class, as we no longer depend on the property signature to compute
8839         whether it is possible to implement a method or not.
8840
8841         The reason is that calling PropertyInfo.GetGetMethod will return
8842         null (in .NET, in Mono it works, and we should change this), in
8843         cases where the Get Method does not exist in that particular
8844         class.
8845
8846         So this code:
8847
8848         class X { public virtual int A { get { return 1; } } }
8849         class Y : X { }
8850         class Z : Y { public override int A { get { return 2; } } }
8851
8852         Would fail in Z because the parent (Y) would not have the property
8853         defined.  So we avoid this completely now (because the alternative
8854         fix was ugly and slow), and we now depend exclusively on the
8855         method names.
8856
8857         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8858         reference method, instead of using the property.
8859
8860         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8861         routines are gone now.
8862
8863         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8864         names, they were incorrectly named.
8865
8866         * cs-tokenizer.cs: Return are more gentle token on failure. 
8867
8868         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8869         had an out-of-sync index variable, which caused it to remove from
8870         the list of pending methods the wrong method sometimes.
8871
8872 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8873
8874         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8875         CanWrite, because those refer to this particular instance of the
8876         property, and do not take into account the fact that we can
8877         override single members of a property.
8878
8879         Constructor requires an EmitContext.  The resolution process does
8880         not happen here, but we need to compute the accessors before,
8881         because the resolution does not always happen for properties.
8882
8883         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8884         subclass, before we did not update this flag, but we did update
8885         bindingflags. 
8886
8887         (GetAccessors): Drop this routine, as it did not work in the
8888         presence of partially overwritten set/get methods. 
8889
8890         Notice that this broke the cs1540 detection, but that will require
8891         more thinking. 
8892
8893 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8894
8895         * class.cs:
8896         * codegen.cs:
8897         * driver.cs: issue a warning instead of an error if we don't support
8898         debugging for the platform. Also ignore a couple of errors that may
8899         arise when trying to write the symbols. Undo my previous patch.
8900
8901 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8902
8903         * driver.cs: ignore /debug switch except for Unix platforms.
8904
8905 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8906
8907         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8908
8909 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8910
8911         * driver.cs: Do not make mcs-debug conditional, so we do not break
8912         builds that use it.
8913
8914         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8915         review this patch.  But basically after all the children variables
8916         have been merged, the value of "Breaks" was not being set to
8917         new_breaks for Switch blocks.  I think that it should be set after
8918         it has executed.  Currently I set this to the value of new_breaks,
8919         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8920         conservative, but I do not understand this code very well.
8921
8922         I did not break anything in the build, so that is good ;-)
8923
8924         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8925
8926 2002-10-20  Mark Crichton  <crichton@gimp.org>
8927
8928         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8929
8930 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8931
8932         * cfold.cs: Fixed compile blocker.
8933
8934 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8935
8936         * driver.cs: I was chekcing the key, not the file.
8937
8938 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8939
8940         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8941         message that we were generating - we just need to silently return
8942         a null.
8943
8944 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8945
8946         * class.cs (Event.Define): Change my previous commit, as this
8947         breaks the debugger.  This is a temporary hack, as it seems like
8948         the compiler is generating events incorrectly to begin with.
8949
8950         * expression.cs (Binary.ResolveOperator): Added support for 
8951         "U operator - (E x, E y)"
8952
8953         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8954         y)".
8955
8956         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8957         init-only variables, but this path did not take into account that
8958         there might be also instance readonly variables.  Correct this
8959         problem. 
8960
8961         This fixes bug 32253
8962
8963         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8964         delegates as well.
8965
8966         * driver.cs: Change the extension for modules to `netmodule'
8967
8968         * cs-parser.jay: Improved slightly the location tracking for
8969         the debugger symbols.
8970
8971         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8972         modifiers that were specified instead of the hardcoded value
8973         (FamAndAssem).  This was basically ignoring the static modifier,
8974         and others.  Fixes 32429.
8975
8976         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8977         fixed a bug in the process (32476)
8978
8979         * expression.cs (ArrayAccess.EmitAssign): Patch from
8980         hwang_rob@yahoo.ca that fixes bug 31834.3
8981
8982 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8983
8984         * driver.cs: Make the module extension .netmodule.
8985
8986 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8987
8988         * driver.cs: Report an error if the resource file is not found
8989         instead of crashing.
8990
8991         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8992         false, like Emit does.
8993
8994 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8995
8996         * typemanager.cs: Remove unused private member.  Also reported mcs
8997         bug to report this as a warning like csc.
8998
8999 2002-10-15  Martin Baulig  <martin@gnome.org>
9000
9001         * statement.cs (Statement.Emit): Made this a virtual method; emits
9002         the line number info and calls DoEmit().
9003         (Statement.DoEmit): New protected abstract method, formerly knows
9004         as Statement.Emit().
9005
9006         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
9007
9008 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
9009
9010         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
9011         have fixed a remaining problem: not every AddXXXX was adding a
9012         fully qualified name.  
9013
9014         Now everyone registers a fully qualified name in the DeclSpace as
9015         being defined instead of the partial name.  
9016
9017         Downsides: we are slower than we need to be due to the excess
9018         copies and the names being registered this way.  
9019
9020         The reason for this is that we currently depend (on the corlib
9021         bootstrap for instance) that types are fully qualified, because
9022         we dump all the types in the namespace, and we should really have
9023         types inserted into the proper namespace, so we can only store the
9024         basenames in the defined_names array.
9025
9026 2002-10-10  Martin Baulig  <martin@gnome.org>
9027
9028         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
9029         from bug #31834, see the bug report for a testcase which is
9030         miscompiled.
9031
9032 2002-10-10  Martin Baulig  <martin@gnome.org>
9033
9034         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
9035         flow analysis code for this.
9036
9037         * statement.cs (Do, While, For): Tell the flow analysis code about
9038         infinite loops.
9039         (FlowBranching.UsageVector): Added support for infinite loops.
9040         (Block.Resolve): Moved the dead code elimination here and use flow
9041         analysis to do it.
9042
9043 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
9044
9045         * class.cs (Field.Define): Catch cycles on struct type
9046         definitions. 
9047
9048         * typemanager.cs (IsUnmanagedtype): Do not recursively check
9049         fields if the fields are static.  We only need to check instance
9050         fields. 
9051
9052         * expression.cs (As.DoResolve): Test for reference type.
9053
9054         * statement.cs (Using.ResolveExpression): Use
9055         ConvertImplicitRequired, not ConvertImplicit which reports an
9056         error on failture
9057         (Using.ResolveLocalVariableDecls): ditto.
9058
9059         * expression.cs (Binary.ResolveOperator): Report errors in a few
9060         places where we had to.
9061
9062         * typemanager.cs (IsUnmanagedtype): Finish implementation.
9063
9064 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
9065
9066         * expression.cs: Use StoreFromPtr instead of extracting the type
9067         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
9068
9069         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
9070         an enumeration value to a System.Enum, but System.Enum is not a
9071         value type, but an class type, so we need to box.
9072
9073         (Expression.ConvertExplicit): One codepath could return
9074         errors but not flag them.  Fix this.  Fixes #31853
9075
9076         * parameter.cs (Resolve): Do not allow void as a parameter type.
9077
9078 2002-10-06  Martin Baulig  <martin@gnome.org>
9079
9080         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
9081         if it's a class type and not a struct.  Fixes #31815.
9082
9083 2002-10-06  Martin Baulig  <martin@gnome.org>
9084
9085         * statement.cs: Reworked the flow analysis code a bit to make it
9086         usable for dead code elimination.
9087
9088 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9089
9090         * cs-parser.jay: allow empty source files. Fixes bug #31781.
9091
9092 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
9093
9094         * expression.cs (ComposedCast.DoResolveType): A quick workaround
9095         to fix the test 165, will investigate deeper.
9096
9097 2002-10-04  Martin Baulig  <martin@gnome.org>
9098
9099         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
9100         finally blocks actually work.
9101         (Try.Resolve): We don't need to create a sibling for `finally' if
9102         there is no finally block.
9103
9104 2002-10-04  Martin Baulig  <martin@gnome.org>
9105
9106         * class.cs (Constructor.Define): The default accessibility for a
9107         non-default constructor is private, not public.
9108
9109 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
9110
9111         * class.cs (Constructor): Make AllowedModifiers public, add
9112         EXTERN.
9113
9114         * cs-parser.jay: Perform the modifiers test here, as the
9115         constructor for the Constructor class usually receives a zero
9116         because of the way we create it (first we create, later we
9117         customize, and we were never checking the modifiers).
9118
9119         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
9120         is a version of LookupTypeReflection that includes the type-name
9121         cache.  This can be used as a fast path for functions that know
9122         the fully qualified name and are only calling into *.GetType() to
9123         obtain a composed type.
9124
9125         This is also used by TypeManager.LookupType during its type
9126         composition.
9127
9128         (LookupType): We now also track the real type name, as sometimes
9129         we can get a quey for the real type name from things like
9130         ComposedCast.  This fixes bug 31422.
9131
9132         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
9133         complete type fullname, it does not have to go through the type
9134         resolution system to obtain the composed version of the type (for
9135         obtaining arrays or pointers).
9136
9137         (Conditional.Emit): Use the EmitBoolExpression to
9138         generate nicer code, as requested by Paolo.
9139
9140         (ArrayCreation.CheckIndices): Use the patch from
9141         hwang_rob@yahoo.ca to validate the array initializers. 
9142
9143 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
9144
9145         * class.cs (ConstructorInitializer.Emit): simplify code by using
9146         Invocation.EmitCall, and at the same time, fix the bugs in calling
9147         parent constructors that took variable arguments. 
9148
9149         * ecore.cs (Expression.ConvertNumericExplicit,
9150         Expression.ImplicitNumericConversion): Remove the code that
9151         manually wrapped decimal (InternalTypeConstructor call is now gone
9152         as well).
9153
9154         * expression.cs (Cast.TryReduce): Also handle decimal types when
9155         trying to perform a constant fold on the type.
9156
9157         * typemanager.cs (IsUnmanagedtype): Partially implemented.
9158
9159         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
9160         that only turned off an error report, and did nothing else. 
9161
9162 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
9163
9164         * driver.cs: Handle and ignore /fullpaths
9165
9166 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
9167
9168         * expression.cs (Binary.ResolveOperator): Catch the case where
9169         DoNumericPromotions returns true, 
9170
9171         (Binary.DoNumericPromotions): Simplify the code, and the tests.
9172
9173 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
9174
9175         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
9176         report error 70.
9177
9178 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
9179
9180         * ecore.cs (ConvertNumericExplicit): It is not enough that the
9181         conversion exists, but it is also required that the conversion be
9182         performed.  This manifested in "(Type64Enum) 2".  
9183
9184         * class.cs (TypeManager.AddMethod): The fix is not to change
9185         AddEnum, because that one was using a fully qualified name (every
9186         DeclSpace derivative does), but to change the AddMethod routine
9187         that was using an un-namespaced name.  This now correctly reports
9188         the duplicated name.
9189
9190         Revert patch until I can properly fix it.  The issue
9191         is that we have a shared Type space across all namespaces
9192         currently, which is wrong.
9193
9194         Options include making the Namespace a DeclSpace, and merge
9195         current_namespace/current_container in the parser.
9196
9197 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
9198
9199         * cs-parser.jay: Improve error reporting when we get a different
9200         kind of expression in local_variable_type and
9201         local_variable_pointer_type. 
9202
9203         Propagate this to avoid missleading errors being reported.
9204
9205         * ecore.cs (ImplicitReferenceConversion): treat
9206         TypeManager.value_type as a target just like object_type.   As
9207         code like this:
9208
9209         ValueType v = 1;
9210
9211         Is valid, and needs to result in the int 1 being boxed before it
9212         is assigned to the value type v.
9213
9214         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
9215         to validate the enumeration name.
9216
9217         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
9218         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
9219         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
9220
9221         * ecore.cs (TryImplicitIntConversion): When doing an
9222         implicit-enumeration-conversion, check if the type is 64-bits and
9223         perform a conversion before passing to EnumConstant.
9224
9225 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
9226
9227         * decl.cs (Error_AmbiguousTypeReference); New routine used to
9228         report ambiguous type references.  Unlike the MS version, we
9229         report what the ambiguity is.   Innovation at work ;-)
9230
9231         (DeclSpace.FindType): Require a location argument to
9232         display when we display an ambiguous error.
9233
9234         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
9235
9236         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
9237
9238         * expression.cs (EmitDynamicInitializers): Apply patch from
9239         hwang_rob@yahoo.ca that fixes the order in which we emit our
9240         initializers. 
9241
9242 2002-09-21  Martin Baulig  <martin@gnome.org>
9243
9244         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
9245         delegate takes no arguments.
9246
9247 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
9248
9249         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
9250         from integers.
9251
9252         * expression.cs: Extract the underlying type.
9253
9254         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
9255
9256         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
9257
9258 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
9259
9260         * class.cs (TypeContainer.DefineType): We can not use the nice
9261         PackingSize with the size set to 1 DefineType method, because it
9262         will not allow us to define the interfaces that the struct
9263         implements.
9264
9265         This completes the fixing of bug 27287
9266
9267         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
9268         means also structs.  This fixes part of the problem. 
9269         (Expresion.ImplicitReferenceConversionExists): ditto.
9270
9271         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
9272         error if there were no errors reported during the type lookup
9273         process, to avoid duplicates or redundant errors.  Without this
9274         you would get an ambiguous errors plus a type not found.  We have
9275         beaten the user enough with the first error.  
9276
9277         (DeclSparce.FindType): Emit a warning if we have an ambiguous
9278         reference. 
9279
9280         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
9281         during the resolution process, stop the lookup, this avoids
9282         repeated error reports (same error twice).
9283
9284         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
9285
9286         * typemanager.cs (LookupType): Redo the type lookup code to match
9287         the needs of System.Reflection.  
9288
9289         The issue is that System.Reflection requires references to nested
9290         types to begin with a "+" sign instead of a dot.  So toplevel
9291         types look like: "NameSpace.TopLevelClass", and nested ones look
9292         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
9293         levels. 
9294
9295 2002-09-19  Martin Baulig  <martin@gnome.org>
9296
9297         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
9298         says that a method always returns or always throws an exception,
9299         don't report the CS0161.
9300
9301         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
9302         set `Returns = new_returns'.
9303
9304 2002-09-19  Martin Baulig  <martin@gnome.org>
9305
9306         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
9307         to an enum constant, check for a CS0176.
9308
9309 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
9310
9311         * class.cs (TypeContainer.CheckPairedOperators): Now we check
9312         for operators that must be in pairs and report errors.
9313
9314         * ecore.cs (SimpleName.DoResolveType): During the initial type
9315         resolution process, when we define types recursively, we must
9316         check first for types in our current scope before we perform
9317         lookups in the enclosing scopes.
9318
9319         * expression.cs (MakeByteBlob): Handle Decimal blobs.
9320
9321         (Invocation.VerifyArgumentsCompat): Call
9322         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
9323         I thought we were supposed to always call this, but there are a
9324         few places in the code where we dont do it.
9325
9326 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
9327
9328         * driver.cs: Add support in -linkres and -resource to specify the
9329         name of the identifier.
9330
9331 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
9332
9333         * ecore.cs (StandardConversionExists): Sync with the conversion
9334         code: allow anything-* to void* conversions.
9335
9336         (FindMostSpecificSource): Use an Expression argument
9337         instead of a Type, because we might be handed over a Literal which
9338         gets a few more implicit conversions that plain types do not.  So
9339         this information was being lost.
9340
9341         Also, we drop the temporary type-holder expression when not
9342         required.
9343
9344 2002-09-17  Martin Baulig  <martin@gnome.org>
9345
9346         * class.cs (PropertyBase.CheckBase): Don't check the base class if
9347         this is an explicit interface implementation.
9348
9349 2002-09-17  Martin Baulig  <martin@gnome.org>
9350
9351         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
9352         different `IndexerName' attributes.
9353
9354         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
9355         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
9356         virtual CommonResolve().
9357
9358 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
9359
9360         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
9361         and convert that to the UnderlyingType.
9362
9363         * statement.cs (Foreach.Resolve): Indexers are just like variables
9364         or PropertyAccesses.
9365
9366         * cs-tokenizer.cs (consume_string): Track line numbers and columns
9367         inside quoted strings, we were not doing this before.
9368
9369 2002-09-16  Martin Baulig  <martin@gnome.org>
9370
9371         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
9372         resolve it.  This is needed for the definite assignment check of the
9373         instance expression, fixes bug #29846.
9374         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
9375
9376 2002-09-16  Nick Drochak  <ndrochak@gol.com>
9377
9378         * parameter.cs: Fix compile error.  Cannot reference static member
9379         from an instance object.  Is this an mcs bug?
9380
9381 2002-09-14  Martin Baulig  <martin@gnome.org>
9382
9383         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
9384         multiple times.  Fixes bug #30295, added test-166.cs.
9385
9386 2002-09-14  Martin Baulig  <martin@gnome.org>
9387
9388         * statement.cs (Block.Emit): Don't emit unreachable code.
9389         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
9390         `break' statements.
9391         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
9392
9393 2002-09-14  Martin Baulig  <martin@gnome.org>
9394
9395         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
9396         is set.
9397
9398 2002-09-14  Martin Baulig  <martin@gnome.org>
9399
9400         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
9401         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
9402         be false on the ms runtime.
9403
9404 2002-09-13  Martin Baulig  <martin@gnome.org>
9405
9406         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
9407         the CS0038 error message.
9408
9409 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
9410
9411         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
9412         constant inside, return it.
9413
9414 2002-09-12  Martin Baulig  <martin@gnome.org>
9415
9416         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
9417         implicit conversion can be done between enum types.
9418
9419         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
9420         check whether an implicit conversion to the current enum's UnderlyingType
9421         exists and report an error if not.
9422
9423         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
9424         without debugging support.
9425
9426         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
9427         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
9428
9429 2002-09-12  Martin Baulig  <martin@gnome.org>
9430
9431         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
9432
9433         * ecore.cs (IMemberExpr.DeclaringType): New property.
9434         (SimpleName.SimpleNameResolve): Check whether we're accessing a
9435         nonstatic member of an outer type (CS0038).
9436
9437 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
9438
9439         * driver.cs: Activate the using-error detector at warning level
9440         4 (at least for MS-compatible APIs).
9441
9442         * namespace.cs (VerifyUsing): Small buglett fix.
9443
9444         * pending.cs (PendingImplementation): pass the container pointer. 
9445
9446         * interface.cs (GetMethods): Allow for recursive definition.  Long
9447         term, I would like to move every type to support recursive
9448         definitions, not the current ordering mechanism that we have right
9449         now.
9450
9451         The situation is this: Attributes are handled before interfaces,
9452         so we can apply attributes to interfaces.  But some attributes
9453         implement interfaces, we will now handle the simple cases
9454         (recursive definitions will just get an error).  
9455
9456         * parameter.cs: Only invalidate types at the end if we fail to
9457         lookup all types.  
9458
9459 2002-09-09  Martin Baulig  <martin@gnome.org>
9460
9461         * ecore.cs (PropertyExpr.Emit): Also check for
9462         TypeManager.system_int_array_get_length so this'll also work when
9463         compiling corlib.  Fixes #30003.
9464
9465 2002-09-09  Martin Baulig  <martin@gnome.org>
9466
9467         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
9468         and throw an exception if we can't get the type's size.  Fixed #30040,
9469         added test-165.cs.
9470
9471 2002-09-09  Martin Baulig  <martin@gnome.org>
9472
9473         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
9474
9475         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
9476         context.  Fixes bug #30027.
9477
9478         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
9479         virtual functions.  Fixes bug #30043, added test-164.cs.
9480
9481 2002-09-08  Ravi Pratap  <ravi@ximian.com>
9482
9483         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
9484
9485 2002-09-08  Nick Drochak  <ndrochak@gol.com>
9486
9487         * driver.cs: Use an object to get the windows codepage since it's not a
9488         static property.
9489
9490 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
9491
9492         * statement.cs (For.Emit): for infinite loops (test == null)
9493         return whether there is a break inside, not always "true".
9494
9495         * namespace.cs (UsingEntry): New struct to hold the name of the
9496         using definition, the location where it is defined, and whether it
9497         has been used in a successful type lookup.
9498
9499         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
9500         strings.
9501
9502         * decl.cs: ditto.
9503
9504 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9505
9506         * attribute.cs : Fix incorrect code which relied on catching
9507         a NullReferenceException to detect a null being passed in
9508         where an object was expected.
9509
9510 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
9511
9512         * statement.cs (Try): flag the catch variable as assigned
9513
9514         * expression.cs (Cast): Simplified by using ResolveType instead of
9515         manually resolving.
9516
9517         * statement.cs (Catch): Fix bug by using ResolveType.
9518
9519 2002-09-06  Ravi Pratap  <ravi@ximian.com>
9520
9521         * expression.cs (BetterConversion): Special case for when we have
9522         a NullLiteral as the argument and we have to choose between string
9523         and object types - we choose string the way csc does.
9524
9525         * attribute.cs (Attribute.Resolve): Catch the
9526         NullReferenceException and report error #182 since the Mono
9527         runtime no more has the bug and having this exception raised means
9528         we tried to select a constructor which takes an object and is
9529         passed a null.
9530
9531 2002-09-05  Ravi Pratap  <ravi@ximian.com>
9532
9533         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
9534         message (1502, 1503) when we can't locate a method after overload
9535         resolution. This is much more informative and closes the bug
9536         Miguel reported.
9537
9538         * interface.cs (PopulateMethod): Return if there are no argument
9539         types. Fixes a NullReferenceException bug.
9540
9541         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
9542         expressions too. Previously we were checking only in one place for
9543         positional arguments leaving out named arguments.
9544
9545         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
9546         type to the enum type is not allowed. Remove code corresponding to
9547         that.
9548
9549         (ConvertNumericExplicit): Allow explicit conversions from
9550         the underlying type to enum type. This precisely follows the spec
9551         and closes a bug filed by Gonzalo.
9552
9553 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9554
9555         * compiler.csproj:
9556         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
9557
9558 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
9559
9560         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
9561         it was important that we stored the right value after the
9562         reduction in `converted'.
9563
9564 2002-09-04  Martin Baulig  <martin@gnome.org>
9565
9566         * location.cs (Location.SymbolDocument): Use full pathnames for the
9567         source files.
9568
9569 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
9570
9571         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
9572         of the expression resolve mechanism, because that will catch the
9573         SimpleName error failures.
9574
9575         (Conditional): If we can not resolve the
9576         expression, return, do not crash.
9577
9578 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9579
9580         * cs-tokenizer.cs:
9581         (location): display token name instead of its number.
9582
9583 2002-08-28  Martin Baulig  <martin@gnome.org>
9584
9585         * expression.cs (Binary.ResolveOperator): Don't silently return
9586         but return an error if an operator cannot be applied between two
9587         enum types.
9588
9589 2002-08-28  Martin Baulig  <martin@gnome.org>
9590
9591         * class.cs (Constructor.Define): Set the permission attributes
9592         correctly instead of making all constructors public.
9593
9594 2002-08-28  Martin Baulig  <martin@gnome.org>
9595
9596         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
9597         for private members before reporting a CS0103; if we find anything,
9598         it's a CS0122.
9599
9600 2002-08-28  Martin Baulig  <martin@gnome.org>
9601
9602         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
9603         to check whether `closure_start_type == closure_invocation_type',
9604         we also need to check whether `m.DeclaringType == closure_invocation_type'
9605         before bypassing the permission checks.  We might be accessing
9606         protected/private members from the base class.
9607         (TypeManager.RealMemberLookup): Only set private_ok if private
9608         members were requested via BindingFlags.NonPublic.
9609
9610         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
9611
9612         * expression.cs (MemberAccess.ResolveMemberAccess): Set
9613         MethodGroupExpr.IsExplicitImpl if appropriate.
9614         (Invocation.DoResolve): Don't report the CS0120 for explicit
9615         interface implementations.
9616
9617 2002-08-27  Martin Baulig  <martin@gnome.org>
9618
9619         * expression.cs (Invocation.DoResolve): If this is a static
9620         method and we don't have an InstanceExpression, we must report
9621         a CS0120.
9622
9623 2002-08-25  Martin Baulig  <martin@gnome.org>
9624
9625         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
9626         `==' between a valuetype and an object.
9627
9628 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
9629
9630         * ecore.cs (TypeExpr): Provide a ToString method.
9631
9632 2002-08-24  Martin Baulig  <martin@gnome.org>
9633
9634         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
9635         now called proggie.dbg and it's a binary file.
9636
9637 2002-08-23  Martin Baulig  <martin@gnome.org>
9638
9639         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
9640
9641 2002-08-23  Martin Baulig  <martin@gnome.org>
9642
9643         * struct.cs (MyStructInfo.ctor): Make this work with empty
9644         structs; it's not allowed to use foreach() on null.
9645
9646 2002-08-23  Martin Baulig  <martin@gnome.org>
9647
9648         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
9649         writer the full pathname of the generated assembly.
9650
9651 2002-08-23  Martin Baulig  <martin@gnome.org>
9652
9653         * statements.cs (FlowBranching.UsageVector.MergeChildren):
9654         A `finally' block never returns or breaks; improved handling of
9655         unreachable code.
9656
9657 2002-08-23  Martin Baulig  <martin@gnome.org>
9658
9659         * statement.cs (Throw.Resolve): Allow `throw null'.
9660
9661 2002-08-23  Martin Baulig  <martin@gnome.org>
9662
9663         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
9664         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
9665         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
9666         MemberLookup would return a wrong event if this is an explicit
9667         interface implementation and the class has an event with the same
9668         name.
9669
9670 2002-08-23  Martin Baulig  <martin@gnome.org>
9671
9672         * statement.cs (Block.AddChildVariableNames): New public method.
9673         (Block.AddChildVariableName): Likewise.
9674         (Block.IsVariableNameUsedInChildBlock): Likewise.
9675         (Block.AddVariable): Check whether a variable name has already
9676         been used in a child block.
9677
9678         * cs-parser.jay (declare_local_variables): Mark all variable names
9679         from the current block as being used in a child block in the
9680         implicit block.
9681
9682 2002-08-23  Martin Baulig  <martin@gnome.org>
9683
9684         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
9685         find the symbol writer.
9686
9687         * driver.cs: csc also allows the arguments to /define being
9688         separated by commas, not only by semicolons.
9689
9690 2002-08-23  Martin Baulig  <martin@gnome.org>
9691
9692         * interface.cs (Interface.GetMembers): Added static check for events.
9693
9694 2002-08-15  Martin Baulig  <martin@gnome.org>
9695
9696         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
9697         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
9698
9699         * ecore.cs (Expression.MemberLookup): Added documentation and explained
9700         why the MethodData.EmitDestructor() change was necessary.
9701
9702 2002-08-20  Martin Baulig  <martin@gnome.org>
9703
9704         * class.cs (TypeContainer.FindMembers): Added static check for events.
9705
9706         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
9707
9708         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
9709         use Type.GetEvents(), not Type.FindMembers().
9710
9711 2002-08-20  Martin Baulig  <martin@gnome.org>
9712
9713         * decl.cs (MemberCache): Added a special method cache which will
9714         be used for method-only searched.  This ensures that a method
9715         search will return a MethodInfo with the correct ReflectedType for
9716         inherited methods.      
9717
9718 2002-08-20  Martin Baulig  <martin@gnome.org>
9719
9720         * decl.cs (DeclSpace.FindMembers): Made this public.
9721
9722 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9723
9724         * delegate.cs: fixed build on windows.
9725         [FIXME:  Filed as bug #29150: MCS must report these errors.]
9726
9727 2002-08-19  Ravi Pratap  <ravi@ximian.com>
9728
9729         * ecore.cs (StandardConversionExists): Return a false
9730         if we are trying to convert the void type to anything else
9731         since that is not allowed.
9732
9733         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
9734         we flag error 70 in the event an event is trying to be accessed
9735         directly from outside the declaring type.
9736
9737 2002-08-20  Martin Baulig  <martin@gnome.org>
9738
9739         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
9740         MemberCache from typemanager.cs to decl.cs.
9741
9742 2002-08-19  Martin Baulig  <martin@gnome.org>
9743
9744         * class.cs (TypeContainer): Implement IMemberContainer.
9745         (TypeContainer.DefineMembers): Create the MemberCache.
9746         (TypeContainer.FindMembers): Do better BindingFlags checking; only
9747         return public members if BindingFlags.Public was given, check
9748         whether members are static.
9749
9750 2002-08-16  Martin Baulig  <martin@gnome.org>
9751
9752         * decl.cs (DeclSpace.Define): Splitted this in Define and
9753         DefineMembers.  DefineMembers is called first and initializes the
9754         MemberCache.
9755
9756         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
9757         DefineMembers() on all our DeclSpaces.
9758
9759         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
9760         but call DefineMembers() on all nested interfaces.  We call their
9761         Define() in our new Define() function.
9762
9763         * interface.cs (Interface): Implement IMemberContainer.
9764         (Interface.Define): Moved all code except the attribute stuf to
9765         DefineMembers().
9766         (Interface.DefineMembers): Initialize the member cache.
9767
9768         * typemanager.cs (IMemberFinder): Removed this interface, we don't
9769         need this anymore since we can use MemberCache.FindMembers directly.
9770
9771 2002-08-19  Martin Baulig  <martin@gnome.org>
9772
9773         * typemanager.cs (MemberCache): When creating the cache for an
9774         interface type, add all inherited members.
9775         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
9776         to `out bool used_cache' and documented it.
9777         (TypeManager.MemberLookup): If we already used the cache in the first
9778         iteration, we don't need to do the interfaces check.
9779
9780 2002-08-19  Martin Baulig  <martin@gnome.org>
9781
9782         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
9783         here from IMemberFinder and don't implement this interface anymore.
9784         (DeclSpace.MemberCache): Moved here from IMemberFinder.
9785
9786         * typemanager.cs (IMemberFinder): This interface is now only used by
9787         classes which actually support the member cache.
9788         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
9789         since we only put DeclSpaces into this Hashtable.
9790         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
9791         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
9792
9793 2002-08-16  Martin Baulig  <martin@gnome.org>
9794
9795         * typemanager.cs (ICachingMemberFinder): Removed.
9796         (IMemberFinder.MemberCache): New property.
9797         (TypeManager.FindMembers): Merged this with RealFindMembers().
9798         This function will never be called from TypeManager.MemberLookup()
9799         so we can't use the cache here, just the IMemberFinder.
9800         (TypeManager.MemberLookup_FindMembers): Check whether the
9801         IMemberFinder has a MemberCache and call the cache's FindMembers
9802         function.
9803         (MemberCache): Rewrote larger parts of this yet another time and
9804         cleaned it up a bit.
9805
9806 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
9807
9808         * driver.cs (LoadArgs): Support quoting.
9809
9810         (Usage): Show the CSC-like command line arguments.
9811
9812         Improved a few error messages.
9813
9814 2002-08-15  Martin Baulig  <martin@gnome.org>
9815
9816         * typemanager.cs (IMemberContainer.Type): New property.
9817         (IMemberContainer.IsInterface): New property.
9818
9819         The following changes are conditional to BROKEN_RUNTIME, which is
9820         defined at the top of the file.
9821
9822         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9823         class'es members, but add all members from TypeHandle.ObjectType
9824         if we're an interface.
9825         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9826         is the current type.
9827         (MemberCache.CacheEntry.Container): Removed this field.
9828         (TypeHandle.GetMembers): Include inherited members.
9829
9830 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9831
9832         * typemanager.cs: fixed compilation and added a comment on a field that
9833         is never used.
9834
9835 2002-08-15  Martin Baulig  <martin@gnome.org>
9836
9837         * class.cs (ConstructorInitializer.Resolve): In the
9838         Expression.MemberLookup call, use the queried_type as
9839         invocation_type.
9840
9841         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9842         declared' attribute, it's always true.
9843         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9844         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9845         temporary wrapper for FindMembers which tells MemberLookup whether
9846         members from the base classes are included in the return value.
9847         This will go away soon.
9848         (TypeManager.MemberLookup): Use this temporary hack here; once the
9849         new MemberCache is completed, we don't need to do the DeclaredOnly
9850         looping here anymore since the MemberCache will take care of this.
9851         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9852         (MemberCache): When creating the MemberCache for a class, get
9853         members from the current class and all its base classes.
9854         (MemberCache.CacheEntry.Container): New field.  This is a
9855         temporary hack until the Mono runtime is fixed to distinguish
9856         between ReflectedType and DeclaringType.  It allows us to use MCS
9857         with both the MS runtime and the unfixed Mono runtime without
9858         problems and without accecting performance.
9859         (MemberCache.SearchMembers): The DeclaredOnly looping from
9860         TypeManager.MemberLookup is now done here.      
9861
9862 2002-08-14  Martin Baulig  <martin@gnome.org>
9863
9864         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9865         Type.GetFields on dynamic types but get the fields from the
9866         corresponding TypeContainer.
9867         (MyStructInfo.GetStructInfo): Added check for enum types.
9868
9869         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9870         (MemberList.SyncRoot): Implemented.
9871         (TypeManager.FilterWithClosure): No need to check permissions if
9872         closure_start_type == closure_invocation_type, don't crash if
9873         closure_invocation_type is null.
9874
9875 2002-08-13  Martin Baulig  <martin@gnome.org>
9876
9877         Rewrote TypeContainer.FindMembers to use a member cache.  This
9878         gives us a speed increase of about 35% for the self-hosting MCS
9879         build and of about 15-20% for the class libs (both on GNU/Linux).
9880
9881         * report.cs (Timer): New class to get enhanced profiling.  This
9882         whole class is "TIMER" conditional since it remarkably slows down
9883         compilation speed.
9884
9885         * class.cs (MemberList): New class.  This is an IList wrapper
9886         which we're now using instead of passing MemberInfo[]'s around to
9887         avoid copying this array unnecessarily.
9888         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9889         (ICachingMemberFinder, IMemberContainer): New interface.
9890         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9891         has already been checked, otherwise use it for the name comparision.
9892         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9893         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9894         if possible.  Returns a MemberList, not a MemberInfo [].
9895         (TypeHandle): New class, implements IMemberContainer.  We create
9896         one instance of this class per type, it contains a MemberCache
9897         which is used to do the member lookups.
9898         (MemberCache): New class.  Each instance of this class contains
9899         all members of a type and a name-based hash table.
9900         (MemberCache.FindMembers): This is our new member lookup
9901         function.  First, it looks up all members of the requested name in
9902         the hash table.  Then, it walks this list and sorts out all
9903         applicable members and returns them.
9904
9905 2002-08-13  Martin Baulig  <martin@gnome.org>
9906
9907         In addition to a nice code cleanup, this gives us a performance
9908         increase of about 1.4% on GNU/Linux - not much, but it's already
9909         half a second for the self-hosting MCS compilation.
9910
9911         * typemanager.cs (IMemberFinder): New interface.  It is used by
9912         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9913         Enum, Delegate or Interface.
9914         (TypeManager.finder_to_member_finder): New PtrHashtable.
9915         (TypeManager.finder_to_container): Removed.
9916         (TypeManager.finder_to_delegate): Removed.
9917         (TypeManager.finder_to_interface): Removed.
9918         (TypeManager.finder_to_enum): Removed.
9919
9920         * interface.cs (Interface): Implement IMemberFinder.
9921
9922         * delegate.cs (Delegate): Implement IMemberFinder.
9923
9924         * enum.cs (Enum): Implement IMemberFinder.
9925
9926         * class.cs (TypeContainer): Implement IMemberFinder.
9927
9928 2002-08-12  Martin Baulig  <martin@gnome.org>
9929
9930         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9931
9932 2002-08-12  Martin Baulig  <martin@gnome.org>
9933
9934         * ecore.cs (ITypeExpression): New interface for expressions which
9935         resolve to a type.
9936         (TypeExpression): Renamed to TypeLookupExpression.
9937         (Expression.DoResolve): If we're doing a types-only lookup, the
9938         expression must implement the ITypeExpression interface and we
9939         call DoResolveType() on it.
9940         (SimpleName): Implement the new ITypeExpression interface.
9941         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9942         hack, the situation that we're only looking up types can't happen
9943         anymore when this method is called.  Moved the type lookup code to
9944         DoResolveType() and call it.
9945         (SimpleName.DoResolveType): This ITypeExpression interface method
9946         is now doing the types-only lookup.
9947         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9948         (ResolveFlags): Added MaskExprClass.
9949
9950         * expression.cs (MemberAccess): Implement the ITypeExpression
9951         interface.
9952         (MemberAccess.DoResolve): Added support for a types-only lookup
9953         when we're called via ITypeExpression.DoResolveType().
9954         (ComposedCast): Implement the ITypeExpression interface.
9955
9956         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9957         Expression.Resolve() with ResolveFlags.Type instead.
9958
9959 2002-08-12  Martin Baulig  <martin@gnome.org>
9960
9961         * interface.cs (Interface.Define): Apply attributes.
9962
9963         * attribute.cs (Attribute.ApplyAttributes): Added support for
9964         interface attributes.
9965
9966 2002-08-11  Martin Baulig  <martin@gnome.org>
9967
9968         * statement.cs (Block.Emit): Only check the "this" variable if we
9969         do not always throw an exception.
9970
9971         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9972         whether the property has a set accessor.
9973
9974 2002-08-11  Martin Baulig  <martin@gnome.org>
9975
9976         Added control flow analysis support for structs.
9977
9978         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9979         with control flow analysis turned off.
9980         (IVariable): New interface.
9981         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9982         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9983         (FieldExpr.DoResolve): Resolve the instance expression with flow
9984         analysis turned off and do the definite assignment check after the
9985         resolving when we know what the expression will resolve to.
9986
9987         * expression.cs (LocalVariableReference, ParameterReference):
9988         Implement the new IVariable interface, only call the flow analysis
9989         code if ec.DoFlowAnalysis is true.
9990         (This): Added constructor which takes a Block argument.  Implement
9991         the new IVariable interface.
9992         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9993         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9994         This does the definite assignment checks for struct members.
9995
9996         * class.cs (Constructor.Emit): If this is a non-static `struct'
9997         constructor which doesn't have any initializer, call
9998         Block.AddThisVariable() to tell the flow analysis code that all
9999         struct elements must be initialized before control returns from
10000         the constructor.
10001
10002         * statement.cs (MyStructInfo): New public class.
10003         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
10004         argument to this indexer.  If non-zero, check an individual struct
10005         member, not the whole struct.
10006         (FlowBranching.CheckOutParameters): Check struct members.
10007         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
10008         overloaded versions of these methods which take an additional
10009         `int field_idx' argument to check struct members.
10010         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
10011         overloaded versions of these methods which take an additional
10012         `string field_name' argument to check struct member.s
10013         (VariableInfo): Implement the IVariable interface.
10014         (VariableInfo.StructInfo): New public property.  Returns the
10015         MyStructInfo instance of the variable if it's a struct or null.
10016         (Block.AddThisVariable): New public method.  This is called from
10017         Constructor.Emit() for non-static `struct' constructor which do
10018         not have any initializer.  It creates a special variable for the
10019         "this" instance variable which will be checked by the flow
10020         analysis code to ensure that all of the struct's fields are
10021         initialized before control returns from the constructor.
10022         (UsageVector): Added support for struct members.  If a
10023         variable/parameter is a struct with N members, we reserve a slot
10024         in the usage vector for each member.  A struct is considered fully
10025         initialized if either the struct itself (slot 0) or all its
10026         members are initialized.
10027
10028 2002-08-08  Martin Baulig  <martin@gnome.org>
10029
10030         * driver.cs (Driver.MainDriver): Only report an error CS5001
10031         if there were no compilation errors.
10032
10033         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
10034         `UnsafeContext' property to determine whether the parent is in
10035         unsafe context rather than checking the parent's ModFlags:
10036         classes nested in an unsafe class are unsafe as well.
10037
10038 2002-08-08  Martin Baulig  <martin@gnome.org>
10039
10040         * statement.cs (UsageVector.MergeChildren): Distinguish between
10041         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
10042         we return.  Added test17() and test18() to test-154.cs.
10043
10044 2002-08-08  Martin Baulig  <martin@gnome.org>
10045
10046         * typemanager.cs (TypeManager.FilterWithClosure): If we have
10047         Family access, make sure the invoking type isn't a subclass of the
10048         queried type (that'd be a CS1540).
10049
10050         * ecore.cs (Expression.MemberLookup): Added overloaded version of
10051         this method which takes an additional `Type invocation_type'.
10052
10053         * expression.cs (BaseAccess.DoResolve): Use the base type as
10054         invocation and query type.
10055         (MemberAccess.DoResolve): If the lookup failed and we're about to
10056         report a CS0122, try a lookup with the ec.ContainerType - if this
10057         succeeds, we must report a CS1540.
10058
10059 2002-08-08  Martin Baulig  <martin@gnome.org>
10060
10061         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
10062         (MethodGroupExpr): Implement the IMemberExpr interface.
10063
10064         * expression (MemberAccess.ResolveMemberAccess): No need to have
10065         any special code for MethodGroupExprs anymore, they're now
10066         IMemberExprs.   
10067
10068 2002-08-08  Martin Baulig  <martin@gnome.org>
10069
10070         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
10071         Family, FamANDAssem and FamORAssem permissions.
10072         (TypeManager.IsSubclassOrNestedChildOf): New public method.
10073
10074 2002-08-08  Martin Baulig  <martin@gnome.org>
10075
10076         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
10077         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
10078         or loop block.
10079
10080 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
10081
10082         * driver.cs: implemented /resource option to embed managed resources.
10083
10084 2002-08-07  Martin Baulig  <martin@gnome.org>
10085
10086         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
10087         (FieldBase.HasFieldInitializer): New public property.
10088         (FieldBase.GetInitializerExpression): New public method.  Resolves and
10089         returns the field initializer and makes sure it is only resolved once.
10090         (TypeContainer.EmitFieldInitializers): Call
10091         FieldBase.GetInitializerExpression to get the initializer, this ensures
10092         that it isn't resolved multiple times.
10093
10094         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
10095         the resolving process (SimpleName/MemberLookup) that we're currently
10096         emitting a field initializer (which must not access any instance members,
10097         this is an error CS0236).
10098
10099         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
10100         argument, if the `IsFieldInitializer' flag is set, we must report and
10101         error CS0236 and not an error CS0120.   
10102
10103 2002-08-07  Martin Baulig  <martin@gnome.org>
10104
10105         * ecore.cs (IMemberExpr): New public interface.
10106         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
10107         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
10108         if the expression is an IMemberExpr.
10109
10110         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
10111         to be null, implicitly default to `this' if we're non-static in
10112         this case.  Simplified the code a lot by using the new IMemberExpr
10113         interface.  Also fixed bug #28176 here.
10114
10115 2002-08-06  Martin Baulig  <martin@gnome.org>
10116
10117         * cs-parser.jay (SimpleLookup): Removed.  We need to create
10118         ParameterReferences during semantic analysis so that we can do a
10119         type-only search when resolving Cast, TypeOf and SizeOf.
10120         (block): Pass the `current_local_parameters' to the Block's
10121         constructor.
10122
10123         * class.cs (ConstructorInitializer): Added `Parameters parameters'
10124         argument to the constructor.
10125         (ConstructorInitializer.Resolve): Create a temporary implicit
10126         block with the parameters.
10127
10128         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
10129         references here if we aren't doing a type-only search.
10130
10131         * statement.cs (Block): Added constructor which takes a
10132         `Parameters parameters' argument.
10133         (Block.Parameters): New public property.
10134
10135         * support.cs (InternalParameters.Parameters): Renamed `parameters'
10136         to `Parameters' and made it public readonly.
10137
10138 2002-08-06  Martin Baulig  <martin@gnome.org>
10139
10140         * ecore.cs (Expression.Warning): Made this public as well.
10141
10142         * report.cs (Report.Debug): Print the contents of collections.
10143
10144 2002-08-06  Martin Baulig  <martin@gnome.org>
10145
10146         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
10147         used to tell Resolve() which kinds of expressions it may return.
10148         (Expression.Resolve): Added overloaded version of this method which
10149         takes a `ResolveFlags flags' argument.  This can be used to tell
10150         Resolve() which kinds of expressions it may return.  Reports a
10151         CS0118 on error.
10152         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
10153         ResolveFlags.SimpleName.
10154         (Expression.Error118): Added overloaded version of this method which
10155         takes a `ResolveFlags flags' argument.  It uses the flags to determine
10156         which kinds of expressions are allowed.
10157
10158         * expression.cs (Argument.ResolveMethodGroup): New public method.
10159         Resolves an argument, but allows a MethodGroup to be returned.
10160         This is used when invoking a delegate.
10161
10162         * TODO: Updated a bit.
10163
10164 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10165
10166         Fixed compilation with csc.
10167
10168         * ecore.cs: Expression.Error made public. Is this correct? Should
10169         Warning be made public too?
10170
10171         * expression.cs: use ea.Location instead of ea.loc.
10172         [FIXME:  Filed as bug #28607: MCS must report these errors.]
10173
10174 2002-08-06  Martin Baulig  <martin@gnome.org>
10175
10176         * ecore.cs (Expression.loc): Moved the location here instead of
10177         duplicating it in all derived classes.
10178         (Expression.Location): New public property.
10179         (Expression.Error, Expression.Warning): Made them non-static and
10180         removed the location argument.
10181         (Expression.Warning): Added overloaded version which takes an
10182         `int level' argument.
10183         (Expression.Error118): Make this non-static and removed the
10184         expression and location arguments.
10185         (TypeExpr): Added location argument to the constructor.
10186
10187         * expression.cs (StaticCallExpr): Added location argument to
10188         the constructor.
10189         (Indirection, PointerArithmetic): Likewise.
10190         (CheckedExpr, UnCheckedExpr): Likewise.
10191         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
10192         (StringPtr): Likewise.
10193
10194
10195 2002-08-05  Martin Baulig  <martin@gnome.org>
10196
10197         * expression.cs (BaseAccess.DoResolve): Actually report errors.
10198
10199         * assign.cs (Assign.DoResolve): Check whether the source
10200         expression is a value or variable.
10201
10202         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
10203         while resolving the corresponding blocks.
10204
10205         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
10206         an error, don't silently return null.
10207
10208         * statement.cs (Block.AddVariable): Do the error reporting here
10209         and distinguish between CS0128 and CS0136.
10210         (Block.DoResolve): Report all unused labels (warning CS0164).
10211         (LabeledStatement): Pass the location to the constructor.
10212         (LabeledStatement.HasBeenReferenced): New property.
10213         (LabeledStatement.Resolve): Set it to true here.
10214
10215         * statement.cs (Return.Emit): Return success even after reporting
10216         a type mismatch error (CS0126 or CS0127), this is what csc does and
10217         it avoids confusing the users with any consecutive errors.
10218
10219 2002-08-05  Martin Baulig  <martin@gnome.org>
10220
10221         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
10222
10223         * const.cs (Const.LookupConstantValue): Catch circular definitions.
10224
10225         * expression.cs (MemberAccess.DoResolve): Silently return if an
10226         error has already been reported.
10227
10228         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
10229         error has already been reported.
10230
10231 2002-08-05  Martin Baulig  <martin@gnome.org>
10232
10233         * statement.cs (UsageVector): Only initialize the `parameters'
10234         vector if we actually have any "out" parameters.
10235
10236 2002-08-05  Martin Baulig  <martin@gnome.org>
10237
10238         * expression.cs (Binary.ResolveOperator): When combining delegates,
10239         they must have the same type.
10240
10241 2002-08-05  Martin Baulig  <martin@gnome.org>
10242
10243         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
10244         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
10245         work with the ms runtime and we also don't need it: if we're a
10246         PropertyBuilder and not in the `indexer_arguments' hash, then we
10247         are a property and not an indexer.
10248
10249         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
10250         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
10251         since the latter one doesn't work with the ms runtime.
10252
10253 2002-08-03  Martin Baulig  <martin@gnome.org>
10254
10255         Fixed bugs #27998 and #22735.
10256
10257         * class.cs (Method.IsOperator): New public field.
10258         (Method.CheckBase): Report CS0111 if there's already a method
10259         with the same parameters in the current class.  Report CS0508 when
10260         attempting to change the return type of an inherited method.
10261         (MethodData.Emit): Report CS0179 if a method doesn't have a body
10262         and it's not marked abstract or extern.
10263         (PropertyBase): New abstract base class for Property and Indexer.
10264         (PropertyBase.CheckBase): Moved here from Property and made it work
10265         for indexers.
10266         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
10267         the same so we can reuse it there.
10268         (Property, Indexer): Derive from PropertyBase.
10269         (MethodSignature.inheritable_property_signature_filter): New delegate
10270         to find properties and indexers.
10271
10272         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
10273         argument and improved error reporting.
10274
10275         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
10276         EmptyReadOnlyParameters and made it a property.
10277
10278         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
10279         version of this method which takes a `PropertyInfo indexer'.
10280         (TypeManager.RegisterIndexer): New method.
10281
10282         * class.cs: Added myself as author of this file :-)
10283
10284 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10285
10286         * class.cs: fixed compilation on windoze.
10287
10288 2002-08-03  Martin Baulig  <martin@gnome.org>
10289
10290         * interface.cs (Interface.GetInterfaceBases): Check whether all
10291         base interfaces are at least as accessible than the current one.
10292
10293         * class.cs (TypeContainer.GetClassBases): Check whether base types
10294         are at least as accessible than the current type.
10295         (TypeContainer.AsAccessible): Implemented and made non-static.
10296         (MemberBase.CheckParameters): Report errors if the accessibility
10297         checks fail.
10298
10299         * delegate.cs (Delegate.Delegate): The default visibility is
10300         internal for top-level types and private for nested types.
10301         (Delegate.Define): Report errors if the accessibility checks fail.
10302
10303         * enum.cs (Enum.Enum): The default visibility is internal for
10304         top-level types and private for nested types.
10305         (Enum.DefineType): Compute the correct visibility.
10306
10307         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
10308         function which takes a `bool is_toplevel' instead of a TypeContainer.
10309
10310         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
10311         builtin type.
10312
10313 2002-08-02  Martin Baulig  <martin@gnome.org>
10314
10315         * expression.cs (LocalVariableReferenc): Added constructor which
10316         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
10317         (LocalVariableReference.IsReadOnly): New property.
10318         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
10319         variable is readonly, use our own readonly flag to do this; you can
10320         use the new constructor to get a writable reference to a read-only
10321         variable.
10322
10323         * cs-parser.jay (foreach_statement, using_statement): Get a writable
10324         reference to the local variable.
10325
10326 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
10327
10328         * rootcontext.cs (ResolveCore): Also include System.Exception
10329
10330         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
10331         we reach an EmptyStatement.
10332
10333         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
10334         is also fine.
10335
10336         * expression.cs (Binary.ResolveOperator): Check error result in
10337         two places.
10338
10339         use brtrue/brfalse directly and avoid compares to null.
10340
10341 2002-08-02  Martin Baulig  <martin@gnome.org>
10342
10343         * class.cs (TypeContainer.Define): Define all nested interfaces here.
10344         Fixes bug #28407, added test-155.cs.
10345
10346 2002-08-01  Martin Baulig  <martin@gnome.org>
10347
10348         * class.cs (Event.EmitDefaultMethod): Make this work with static
10349         events.  Fixes #28311, added verify-3.cs.
10350
10351 2002-08-01  Martin Baulig  <martin@gnome.org>
10352
10353         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
10354         `is_disposable' fields.
10355         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
10356         `hm.is_disposable' if we're using the collection pattern.
10357         (Foreach.EmitCollectionForeach): Use the correct type for the
10358         enumerator's local variable, only emit the try/finally block if
10359         necessary (fixes #27713).
10360
10361 2002-08-01  Martin Baulig  <martin@gnome.org>
10362
10363         * ecore.cs (Expression.report118): Renamed to Error118 and made
10364         it public static.
10365
10366         * statement.cs (Throw.Resolve): Check whether the expression is of
10367         the correct type (CS0118) and whether the type derives from
10368         System.Exception (CS0155).
10369         (Catch.Resolve): New method.  Do the type lookup here and check
10370         whether it derives from System.Exception (CS0155).
10371         (Catch.CatchType, Catch.IsGeneral): New public properties.
10372
10373         * typemanager.cs (TypeManager.exception_type): Added.
10374
10375 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
10376
10377         * driver.cs: Updated About function.
10378
10379 2002-07-31  Martin Baulig  <martin@gnome.org>
10380
10381         Implemented Control Flow Analysis.
10382
10383         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
10384         (EmitContext.CurrentBranching): Added.
10385         (EmitContext.StartFlowBranching): Added.
10386         (EmitContext.EndFlowBranching): Added.
10387         (EmitContext.KillFlowBranching): Added.
10388         (EmitContext.IsVariableAssigned): Added.
10389         (EmitContext.SetVariableAssigned): Added.
10390         (EmitContext.IsParameterAssigned): Added.
10391         (EmitContext.SetParameterAssigned): Added.
10392         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
10393         Added control flow analysis stuff here.
10394
10395         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
10396         resolve the expression as lvalue.
10397         (LocalVariableReference.DoResolve): Check whether the variable has
10398         already been assigned.
10399         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
10400         the parameter as assigned here.
10401         (ParameterReference.DoResolve): Check whether the parameter has already
10402         been assigned.
10403         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
10404         expression as lvalue.
10405
10406         * statement.cs (FlowBranching): New class for the flow analysis code.
10407         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
10408         (LabeledStatement.IsDefined): New public property.
10409         (LabeledStatement.AddUsageVector): New public method to tell flow
10410         analyis that the label may be reached via a forward jump.
10411         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
10412         flow analysis.
10413         (VariableInfo.Number): New public field.  This is used by flow analysis
10414         to number all locals of a block.
10415         (Block.CountVariables): New public property.  This is the number of
10416         local variables in this block (including the locals from all parent
10417         blocks).
10418         (Block.EmitMeta): Number all the variables.
10419
10420         * statement.cs: Added flow analysis support to all classes.
10421
10422 2002-07-31  Martin Baulig  <martin@gnome.org>
10423
10424         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
10425         To get debugging messages, compile mcs with /define:MCS_DEBUG and
10426         then use this argument.
10427
10428         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
10429
10430         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
10431         use this to specify /define options.
10432
10433 2002-07-29  Martin Baulig  <martin@gnome.org>
10434
10435         * statement.cs (Fixed): Moved all code that does variable lookups
10436         and resolvings from Emit to Resolve.
10437
10438         * statement.cs (For): Moved all code that does variable lookups
10439         and resolvings from Emit to Resolve.
10440
10441         * statement.cs (Using): Moved all code that does variable lookups
10442         and resolvings from Emit to Resolve.
10443
10444 2002-07-29  Martin Baulig  <martin@gnome.org>
10445
10446         * attribute.cs (Attribute.Resolve): Explicitly catch a
10447         System.NullReferenceException when creating the
10448         CustromAttributeBuilder and report a different warning message.
10449
10450 2002-07-29  Martin Baulig  <martin@gnome.org>
10451
10452         * support.cs (ParameterData.ParameterName): Added method to
10453         get the name of a parameter.
10454
10455         * typemanager.cs (TypeManager.IsValueType): New public method.
10456
10457 2002-07-29  Martin Baulig  <martin@gnome.org>
10458
10459         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
10460         is a flag which specifies that it's either ref or out.
10461         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
10462         the out parameter to `out Parameter.Modifier mod', also set the
10463         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
10464
10465         * support.cs (InternalParameters.ParameterModifier): Distinguish
10466         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
10467         Parameter.Modifier.ISBYREF flag if it's either ref or out.
10468
10469         * expression.cs (Argument.GetParameterModifier): Distinguish
10470         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
10471         Parameter.Modifier.ISBYREF flag if it's either ref or out.
10472
10473 2002-07-29  Martin Baulig  <martin@gnome.org>
10474
10475         * expression.cs (ParameterReference.ParameterReference): Added
10476         `Location loc' argument to the constructor.
10477
10478         * cs-parser.jay: Pass location to ParameterReference.
10479
10480 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
10481
10482         * statement.cs (Try): Initialize the location.
10483
10484         * cs-parser.jay: pass location to Try.
10485
10486         * expression.cs (Unary.Reduce): Change the prototype to return
10487         whether a constant fold could be performed or not.  The result is
10488         returned in an out parameters.  In the case of Indirection and
10489         AddressOf, we want to perform the full tests.
10490
10491 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
10492
10493         * statement.cs (Statement.Emit): Flag dead code.
10494
10495 2002-07-27  Andrew Birkett  <andy@nobugs.org>
10496
10497         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
10498
10499 2002-07-27  Martin Baulig  <martin@gnome.org>
10500
10501         * class.cs (MethodData.Define): Put back call to
10502         TypeManager.AddMethod(), accidentally commented this out.
10503
10504         * report.cs (Debug): New public method to print debugging information,
10505         this is `[Conditional ("DEBUG")]'.
10506
10507 2002-07-26  Martin Baulig  <martin@gnome.org>
10508
10509         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
10510         (switch_statement): Push the current_block to the switch_stack and
10511         pop it again when we're done with the switch.
10512         (switch_section): The new block is a child of the current_block.
10513         Fixes bug #24007, added test-152.cs.
10514
10515 2002-07-27  Martin Baulig  <martin@gnome.org>
10516
10517         * expression.cs (Invocation.EmitArguments): When calling a varargs
10518         function with only its fixed arguments, we need to pass an empty
10519         array.
10520
10521 2002-07-27  Martin Baulig  <martin@gnome.org>
10522
10523         Mono 0.13 has been released.
10524
10525 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
10526
10527         * driver.cs: Rename --resource to --linkres, because that is what
10528         we do currently, we dont support --resource yet.
10529
10530         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
10531
10532 2002-07-25  Martin Baulig  <martin@gnome.org>
10533
10534         * class.cs (MethodData): New public class.  This is a `method builder'
10535         class for a method or one accessor of a Property/Indexer/Event.
10536         (MethodData.GetMethodFlags): Moved here from MemberBase.
10537         (MethodData.ApplyAttributes): Likewise.
10538         (MethodData.ApplyObsoleteAttribute): Likewise.
10539         (MethodData.ApplyConditionalAttribute): Likewise.
10540         (MethodData.ApplyDllImportAttribute): Likewise.
10541         (MethodData.CheckAbstractAndExternal): Likewise.
10542         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
10543         (MethodData.Emit): Formerly known as Method.Emit().
10544         (MemberBase): Moved everything which was specific to a single
10545         accessor/method to MethodData.
10546         (Method): Create a new MethodData and call Define() and Emit() on it.
10547         (Property, Indexer, Event): Create a new MethodData objects for each
10548         accessor and call Define() and Emit() on them.
10549
10550 2002-07-25  Martin Baulig  <martin@gnome.org>
10551
10552         Made MethodCore derive from MemberBase to reuse the code from there.
10553         MemberBase now also checks for attributes.
10554
10555         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
10556         (MemberBase.GetMethodFlags): Moved here from class Method and marked
10557         as virtual.
10558         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
10559         `CallingConventions cc' and `Attributes opt_attrs' arguments.
10560         (MemberBase.ApplyAttributes): New virtual method; applies the
10561         attributes to a method or accessor.
10562         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
10563         (MemberBase.ApplyConditionalAttribute): Likewise.
10564         (MemberBase.ApplyDllImportAttribute): Likewise.
10565         (MemberBase.CheckAbstractAndExternal): Likewise.
10566         (MethodCore.ParameterTypes): This is now a property instead of a
10567         method, it's initialized from DoDefineParameters().
10568         (MethodCore.ParameterInfo): Removed the set accessor.
10569         (MethodCore.DoDefineParameters): New protected virtual method to
10570         initialize ParameterTypes and ParameterInfo.
10571         (Method.GetReturnType): We can now simply return the MemberType.
10572         (Method.GetMethodFlags): Override the MemberBase version and add
10573         the conditional flags.
10574         (Method.CheckBase): Moved some code from Define() here, call
10575         DoDefineParameters() here.
10576         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
10577         here to avoid some larger code duplication.
10578         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
10579         ensure that abstract and external accessors don't declare a body.
10580
10581         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
10582         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
10583         lookup in the attribute's parent classes, so we need to abort as soon
10584         as we found the first match.
10585         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
10586         the attribute has no arguments.
10587
10588         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
10589         of a Method.
10590
10591 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10592
10593         * cs-parser.jay: reverted previous patch.
10594
10595 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10596
10597         * cs-parser.jay: fixed bug #22119.
10598
10599 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10600
10601         * attribute.cs: fixed compilation. The error was:
10602         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
10603         be assigned to before control leaves the current method."
10604         [FIXME:  Filed as bug #28186: MCS must report this error.]
10605
10606 2002-07-25  Martin Baulig  <martin@gnome.org>
10607
10608         * attribute.cs (Attribute.Conditional_GetConditionName): New static
10609         method to pull the condition name ouf of a Conditional attribute.
10610         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
10611         the obsolete message and error flag out of an Obsolete attribute.
10612
10613         * class.cs (Method.GetMethodFlags): New public method to get the
10614         TypeManager.MethodFlags for this method.
10615         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
10616         private methods.
10617         (Method.Define): Get and apply the Obsolete and Conditional attributes;
10618         if we're overriding a virtual function, set the new private variable
10619         `parent_method'; call the new TypeManager.AddMethod().
10620
10621         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
10622         the MethodBuilder and the Method in a PtrHashtable.
10623         (TypeManager.builder_to_method): Added for this purpose.
10624         (TypeManager.MethodFlags): Added IsObsoleteError.
10625         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
10626         Obsolete and Conditional arguments in MethodBuilders.  If we discover
10627         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
10628         the message from the attribute.
10629
10630 2002-07-24  Martin Baulig  <martin@gnome.org>
10631
10632         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
10633         preprocessor directives, ensure that the argument to #define/#undef is
10634         exactly one identifier and that it's actually an identifier.
10635
10636         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
10637         did not work ....
10638
10639 2002-07-24  Martin Baulig  <martin@gnome.org>
10640
10641         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
10642         initialize it to TypeManager.object_type in the constructor.
10643         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
10644         of the `hm.get_current' method if we're using the collection pattern.
10645         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
10646         for the explicit conversion to make it work when we're using the collection
10647         pattern and the `Current' property has a different return type than `object'.
10648         Fixes #27713.
10649
10650 2002-07-24  Martin Baulig  <martin@gnome.org>
10651
10652         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
10653         does not match, but don't report any errors.  This method is called in
10654         order for all methods in a MethodGroupExpr until a matching method is
10655         found, so we don't want to bail out if the first method doesn't match.
10656         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
10657         matches, report the 123.  Fixes #28070.
10658
10659 2002-07-24  Martin Baulig  <martin@gnome.org>
10660
10661         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
10662         TypeManager.TypeToCoreType() to the top of the method so the
10663         following equality checks will work.  Fixes #28107.
10664
10665 2002-07-24  Martin Baulig  <martin@gnome.org>
10666
10667         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
10668         operand is of type uint, and the other operand is of type sbyte,
10669         short or int, the operands are converted to type long." -
10670         Actually do what this comment already told us.  Fixes bug #28106,
10671         added test-150.cs.
10672
10673 2002-07-24  Martin Baulig  <martin@gnome.org>
10674
10675         * class.cs (MethodBase): New abstract class.  This is now a base
10676         class for Property, Indexer and Event to avoid some code duplication
10677         in their Define() and DefineMethods() methods.
10678         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
10679         generic methods for Define() and DefineMethods().
10680         (FieldBase): Derive from MemberBase, not MemberCore.
10681         (Property): Derive from MemberBase, not MemberCore.
10682         (Property.DefineMethod): Moved all the code from this method to the
10683         new MethodBase.DefineAccessor(), just call it with appropriate
10684         argumetnts.
10685         (Property.Define): Call the new Property.DoDefine(), this does some
10686         sanity checks and we don't need to duplicate the code everywhere.
10687         (Event): Derive from MemberBase, not MemberCore.
10688         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
10689         accessors, this will also make them work with interface events.
10690         (Indexer): Derive from MemberBase, not MemberCore.
10691         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
10692         (Indexer.Define): Use the new MethodBase functions.
10693
10694         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
10695         argument to the constructor.
10696         (Interface.FindMembers): Added support for interface events.
10697         (Interface.PopluateEvent): Implemented.
10698
10699         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
10700
10701 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
10702
10703         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
10704         but this is required to check for a method name being the same as
10705         the containing class.  
10706
10707         Handle this now.
10708
10709 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10710
10711         * interface.cs: initialize variable.
10712
10713 2002-07-23  Martin Baulig  <martin@gnome.org>
10714
10715         Implemented the IndexerName attribute in interfaces.
10716
10717         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
10718         name if this is an explicit interface implementation.
10719         (Indexer.InterfaceIndexerName): New public variable.  If we're
10720         implementing an interface indexer, this is the IndexerName in that
10721         interface.  Otherwise, it's the IndexerName.
10722         (Indexer.DefineMethod): If we're implementing interface indexer,
10723         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
10724         and Pending.ImplementIndexer methods.
10725         (Indexer.Define): Also define the PropertyBuilder if we're
10726         implementing an interface indexer and this is neither an explicit
10727         interface implementation nor do the IndexerName match the one in
10728         the interface.
10729
10730         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
10731         If a method is defined here, then we always need to create a proxy
10732         for it.  This is used when implementing interface indexers.
10733         (Pending.IsInterfaceIndexer): New public method.
10734         (Pending.ImplementIndexer): New public method.
10735         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
10736         This is used when implementing interface indexers to define a proxy
10737         if necessary.
10738         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
10739         define a proxy if necessary.
10740
10741         * interface.cs (Interface.IndexerName): New public variable.
10742         (Interface.PopulateIndexer): Set the IndexerName.
10743         (Interface.DefineIndexers): New private method.  Populate all the
10744         indexers and make sure their IndexerNames match.
10745
10746         * typemanager.cs (IndexerPropertyName): Added support for interface
10747         indexers.
10748
10749 2002-07-22  Martin Baulig  <martin@gnome.org>
10750
10751         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
10752         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
10753         ret if HasReturnLabel.
10754         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
10755         variables.
10756
10757         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
10758         and set the ec.LoopBeginTryCatchLevel.
10759         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
10760         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
10761         the current ec.TryCatchLevel, the branch goes out of an exception
10762         block.  In this case, we need to use Leave and not Br.
10763
10764 2002-07-22  Martin Baulig  <martin@gnome.org>
10765
10766         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
10767         block unless the block does not always return or it is contained in
10768         another try { ... } catch { ... } block.  Fixes bug #26506.
10769         Added verify-1.cs to the test suite.
10770
10771 2002-07-22  Martin Baulig  <martin@gnome.org>
10772
10773         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
10774         then we do not always return.  Fixes bug #24985.
10775
10776 2002-07-22  Martin Baulig  <martin@gnome.org>
10777
10778         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
10779         lookup on a per-class level; ie. walk up the class hierarchy until we
10780         found at least one applicable method, then choose the best among them.
10781         Fixes bug #24463 and test-29.cs.
10782
10783 2002-07-22  Martin Baulig  <martin@gnome.org>
10784
10785         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
10786         return types of the methods.  The return type is not part of the
10787         signature and we must not check it to make the `new' modifier work.
10788         Fixes bug #27999, also added test-147.cs.
10789         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
10790
10791         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
10792         on the method's return type.
10793
10794 2002-07-21  Martin Baulig  <martin@gnome.org>
10795
10796         * assign.cs: Make this work if the rightmost source is a constant and
10797         we need to do an implicit type conversion.  Also adding a few more tests
10798         to test-38.cs which should have caught this.
10799
10800         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
10801         target in the makefile for this.  The makefile.gnu is primarily intended
10802         for end-users who don't want to debug the compiler.
10803
10804 2002-07-21  Martin Baulig  <martin@gnome.org>
10805
10806         * assign.cs: Improved the Assign class so it can now handle embedded
10807         assignments (X = Y = Z = something).  As a side-effect this'll now also
10808         consume less local variables.  test-38.cs now passes with MCS, added
10809         a few new test cases to that test.
10810
10811 2002-07-20  Martin Baulig  <martin@gnome.org>
10812
10813         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
10814         instructions.  Fixes bug #27977, also added test-146.cs.
10815
10816 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10817
10818         * cs-tokenizer.cs: fixed getHex ().
10819
10820 2002-07-19  Martin Baulig  <martin@gnome.org>
10821
10822         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10823         not Type.GetType() to lookup the array type.  This is needed when
10824         we're constructing an array of a user-defined type.
10825         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10826         single-dimensional arrays, but also for single-dimensial arrays of
10827         type decimal.
10828
10829 2002-07-19  Martin Baulig  <martin@gnome.org>
10830
10831         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10832         this function is called, it's not allowed to share LocalBuilders
10833         among ILGenerators.
10834
10835 2002-07-19  Martin Baulig  <martin@gnome.org>
10836
10837         * expression.cs (Argument.Resolve): Report an error 118 when trying
10838         to pass a type as argument.
10839
10840 2002-07-18  Martin Baulig  <martin@gnome.org>
10841
10842         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10843         Conv_R_Un for the signed `long' type.
10844
10845 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10846
10847         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10848         `expr' for the temporary result, as that will fail if we do
10849         multiple resolves on the same expression.
10850
10851 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10852
10853         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10854         ec.TypeContainer for looking up aliases. 
10855
10856         * class.cs (TypeContainer): Remove LookupAlias from here.
10857
10858         * decl.cs (DeclSpace); Move here.
10859
10860 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10861
10862         * class.cs (FindMembers): Only call filter if the constructor
10863         bulider is not null.
10864
10865         Also handle delegates in `NestedTypes' now.  Now we will perform
10866         type lookups using the standard resolution process.  This also
10867         fixes a bug.
10868
10869         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10870         This uses Expressions (the limited kind that can be parsed by the
10871         tree) instead of strings.
10872
10873         * expression.cs (ComposedCast.ToString): Implement, used to flag
10874         errors since now we have to render expressions.
10875
10876         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10877         FormArrayType. 
10878
10879         * ecore.cs (SimpleName.ToString): ditto.
10880
10881         * cs-parser.jay: Instead of using strings to assemble types, use
10882         Expressions to assemble the type (using SimpleName, ComposedCast,
10883         MemberAccess).  This should fix the type lookups in declarations,
10884         because we were using a different code path for this.
10885
10886         * statement.cs (Block.Resolve): Continue processing statements
10887         even when there is an error.
10888
10889 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10890
10891         * class.cs (Event.Define): Also remove the `remove' method from
10892         the list of pending items.
10893
10894         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10895         generate more compact code. 
10896
10897 2002-07-17  Martin Baulig  <martin@gnome.org>
10898
10899         * const.cs (Const.LookupConstantValue): Add support for constant
10900         `unchecked' and `checked' expressions.
10901         Also adding test case test-140.cs for this.
10902
10903 2002-07-17  Martin Baulig  <martin@gnome.org>
10904
10905         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10906         check whether mi.ReturnType implements the IEnumerator interface; the
10907         `==' and the IsAssignableFrom() will fail in this situation.
10908
10909 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10910
10911         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10912         here too.
10913
10914 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10915
10916         * expression.cs: fixed bug #27811.
10917
10918 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10919
10920         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10921         Molaro: when we are a ref, the value already contains a pointer
10922         value, do not take the address of it.
10923
10924 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10925         * removed mb-parser.jay and mb-tokenizer.cs
10926
10927 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10928
10929         * expression.cs: check against the building corlib void type.
10930
10931 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10932
10933         * ecore.cs: fix for valuetype static readonly fields: when 
10934         initializing them, we need their address, not the address of a copy.
10935
10936 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10937
10938         * typemanager.cs: register also enum_type in corlib.
10939
10940 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10941
10942         * class.cs: allow calling this (but not base) initializers in structs.
10943
10944 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10945
10946         * ecore.cs: make sure we compare against the building base types
10947         in GetTypeSize ().
10948
10949 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10950
10951         * typemanager.cs: fix TypeToCoreType() to handle void and object
10952         (corlib gets no more typerefs after this change).
10953
10954 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10955
10956         * expression.cs (ArrayCreation.EmitArrayArguments): use
10957         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10958
10959         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10960         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10961         array indexes, the runtime actually forbids them.
10962
10963         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10964         for array arguments here.
10965
10966         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10967         instead of the default for ValueTypes.
10968
10969         (New.DoEmit): Use IsValueType instead of
10970         IsSubclassOf (value_type)
10971         (New.DoResolve): ditto.
10972         (Invocation.EmitCall): ditto.
10973
10974         * assign.cs (Assign): ditto.
10975
10976         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10977         Statements *are* currently doing part of their resolution during
10978         Emit.  
10979
10980         Expressions do always resolve during resolve, but statements are
10981         only required to propagate resolution to their children.
10982
10983 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10984
10985         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10986
10987         (LoadAssembly): Do not add the dll if it is already specified
10988
10989         (MainDriver): Add the System directory to the link path at the end,
10990         after all the other -L arguments. 
10991
10992         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10993         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10994         ldelem.u1) and using the opposite for sbytes.
10995
10996         This fixes Digger, and we can finally run it.
10997
10998         * driver.cs (UnixParseOption): Move the option parsing here.  
10999         (CSCParseOption): Implement CSC-like parsing of options.
11000
11001         We now support both modes of operation, the old Unix way, and the
11002         new CSC-like way.  This should help those who wanted to make cross
11003         platform makefiles.
11004
11005         The only thing broken is that /r:, /reference: and /lib: are not
11006         implemented, because I want to make those have the same semantics
11007         as the CSC compiler has, and kill once and for all the confussion
11008         around this.   Will be doing this tomorrow.
11009
11010         * statement.cs (Unsafe.Resolve): The state is checked during
11011         resolve, not emit, so we have to set the flags for IsUnsfe here.
11012
11013 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
11014
11015         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
11016         not catch the Error_ObjectRefRequired in SimpleName (as it is
11017         possible to have a class/instance variable name that later gets
11018         deambiguated), we have to check this here.      
11019
11020 2002-07-10  Ravi Pratap  <ravi@ximian.com>
11021
11022         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
11023         make static and put into Expression.
11024
11025         (Event.Define): Register the private field of the event with the 
11026         TypeManager so that GetFieldFromEvent can get at it.
11027
11028         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
11029         keep track of the private field associated with an event which
11030         has no accessors.
11031
11032         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
11033         private field.
11034
11035         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
11036
11037 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
11038
11039         * expression.cs (Binary.EmitBranchable): this routine emits the
11040         Binary expression in a branchable context.  This basically means:
11041         we need to branch somewhere, not just get the value on the stack.
11042
11043         This works together with Statement.EmitBoolExpression.
11044
11045         * statement.cs (Statement.EmitBoolExpression): Use
11046         EmitBranchable. 
11047
11048 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
11049
11050         * statement.cs (For): Reduce the number of jumps in loops.
11051
11052         (For): Implement loop inversion for the For statement.
11053
11054         (Break): We can be breaking out of a Try/Catch controlled section
11055         (foreach might have an implicit try/catch clause), so we need to
11056         use Leave instead of Br.
11057
11058         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
11059         now).  If the instace expression supports IMemoryLocation, we use
11060         the AddressOf method from the IMemoryLocation to extract the
11061         address instead of emitting the instance.
11062
11063         This showed up with `This', as we were emitting the instance
11064         always (Emit) instead of the Address of This.  Particularly
11065         interesting when This is a value type, as we dont want the Emit
11066         effect (which was to load the object).
11067
11068 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
11069
11070         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
11071
11072         * statement.cs (Checked): Set the CheckedState during the resolve
11073         process too, as the ConvCast operations track the checked state on
11074         the resolve process, and not emit.
11075
11076         * cs-parser.jay (namespace_member_declaration): Flag that we have
11077         found a declaration when we do.  This is used to flag error 1529
11078
11079         * driver.cs: Report ok when we display the help only.
11080
11081 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
11082
11083         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
11084
11085 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
11086
11087         * cs-tokenizer.cs (define): We also have to track locally the
11088         defines.  AllDefines is just used for the Conditional Attribute,
11089         but we also need the local defines for the current source code. 
11090
11091 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
11092
11093         * statement.cs (While, For, Do): These loops can exit through a
11094         Break statement, use this information to tell whether the
11095         statement is the last piece of code.
11096
11097         (Break): Flag that we break.
11098
11099         * codegen.cs (EmitContexts): New `Breaks' state variable.
11100
11101 2002-07-03  Martin Baulig  <martin@gnome.org>
11102
11103         * class.cs (TypeContainer.MethodModifiersValid): Allow override
11104         modifiers in method declarations in structs.  Otherwise, you won't
11105         be able to override things like Object.Equals().
11106
11107 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
11108
11109         * class.cs (Method, Property, Indexer): Do not allow the public
11110         modifier to be used in explicit interface implementations.
11111
11112         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
11113         override modifiers in method declarations in structs
11114
11115 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
11116
11117         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
11118         integer or real overflow, report an error
11119
11120 2002-07-02  Martin Baulig  <martin@gnome.org>
11121
11122         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
11123         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
11124         to tell the runtime about our newly created System.Object and
11125         System.ValueType types.
11126
11127 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
11128
11129         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
11130         struct instead of Ldarg/Starg.
11131
11132 2002-07-02  Martin Baulig  <martin@gnome.org>
11133
11134         * expression.cs (Indirection.Indirection): Call
11135         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
11136
11137 2002-07-02  Martin Baulig  <martin@gnome.org>
11138
11139         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
11140         ValueType, call TypeManager.TypeToCoreType() on it.
11141         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
11142         the OpCodes.Newarr argument.
11143
11144 2002-07-02  Martin Baulig  <martin@gnome.org>
11145
11146         * expression.cs (Invocation.EmitCall): When compiling corlib,
11147         replace all calls to the system's System.Array type to calls to
11148         the newly created one.
11149
11150         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
11151         System.Array methods.
11152         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
11153         from the system's System.Array type which must be replaced.
11154
11155 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
11156
11157         * typemanager.cs: load unverifiable_code_ctor so we can build
11158         corlib using the correct type. Avoid using GetTypeCode() with
11159         TypeBuilders.
11160         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
11161         TypeManager.object_type to allow building corlib.
11162
11163 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
11164
11165         * ecore.cs: handle System.Enum separately in LoadFromPtr().
11166
11167 2002-07-01  Martin Baulig  <martin@gnome.org>
11168
11169         * class.cs: Make the last change actually work, we need to check
11170         whether `ifaces != null' to avoid a crash.
11171
11172 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
11173
11174         * class.cs: when we build structs without fields that implement
11175         interfaces, we need to add the interfaces separately, since there is
11176         no API to both set the size and add the interfaces at type creation
11177         time.
11178
11179 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
11180
11181         * expression.cs: the dimension arguments to the array constructors
11182         need to be converted if they are a long.
11183
11184 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
11185
11186         * class.cs: don't emit ldarg.0 if there is no parent constructor
11187         (fixes showstopper for corlib).
11188
11189 2002-06-29  Martin Baulig  <martin@gnome.org>
11190
11191         MCS now compiles corlib on GNU/Linux :-)
11192
11193         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
11194         ie. check for MethodImplOptions.InternalCall.
11195
11196         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
11197         and TypeManager.attribute_type are null, so we must explicitly check
11198         whether parent is not null to find out whether it's an attribute type.
11199         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
11200         and SetBuilder, not only if the property is neither abstract nor external.
11201         This is necessary to set the MethodImplOptions on the accessor methods.
11202         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
11203         SetBuilder, see Property.Emit().
11204
11205         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
11206         populate "System.Object", "System.ValueType" and "System.Attribute" since
11207         they've already been populated from BootCorlib_PopulateCoreTypes().
11208
11209 2002-06-29  Martin Baulig  <martin@gnome.org>
11210
11211         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
11212         is the NullLiteral, we also need to make sure that target_type is not
11213         an enum type.   
11214
11215 2002-06-29  Martin Baulig  <martin@gnome.org>
11216
11217         * rootcontext.cs (RootContext.ResolveCore): We must initialize
11218         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
11219         before calling BootstrapCorlib_ResolveDelegate ().
11220
11221 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11222
11223         * statement.cs: fixed build-breaker. All tests passed ok.
11224
11225 2002-06-27  Martin Baulig  <martin@gnome.org>
11226
11227         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
11228         for System.Decimal when compiling corlib.
11229
11230 2002-06-27  Martin Baulig  <martin@gnome.org>
11231
11232         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
11233         switch blocks which contain nothing but a default clause.
11234
11235 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
11236
11237        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
11238
11239 2002-06-27  Martin Baulig  <martin@gnome.org>
11240
11241         * ecore.cs (PropertyExpr.PropertyExpr): Call
11242         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
11243
11244         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
11245         is already a TypeBuilder.
11246
11247 2002-06-27  Martin Baulig  <martin@gnome.org>
11248
11249         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
11250         `target_type == TypeManager.array_type', not IsAssignableFrom() in
11251         the "from an array-type to System.Array" case.  This makes it work
11252         when compiling corlib.
11253
11254 2002-06-27  Martin Baulig  <martin@gnome.org>
11255
11256         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
11257         non-static PropertyExpr, set its InstanceExpression.  This makes
11258         the `ICollection.Count' property work in System/Array.cs.
11259
11260 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
11261
11262         * driver.cs: Made error handling more consistent.  Errors now
11263         tracked by Report class, so many methods which used to return int
11264         now return void.  Main() now prints success/failure and 
11265         errors/warnings message.
11266
11267         Renamed '--probe' compiler argument to '--expect-error'.  Removed
11268         the magic number return values (123 and 124).  Now, if the
11269         expected error occurs, the compiler exits with success (exit value
11270         0).  If the compilation completes without seeing that particular
11271         error, the compiler exits with failure (exit value 1).  The
11272         makefile in mcs/errors has been changed to handle the new behaviour.
11273
11274         * report.cs: Made 'expected error' number a property and renamed
11275         it from 'Probe' to 'ExpectedError'.
11276
11277         * genericparser.cs: Removed error handling support, since it is
11278         now all done by Report class.
11279
11280         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
11281         class, so parse() no longer returns an int.
11282
11283         * namespace.cs: Use Report.Error instead of GenericParser.error
11284
11285 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
11286
11287         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
11288         TypeContainer.AddOperator): At the front of the list put the
11289         explicit implementations, so they get resolved/defined first. 
11290
11291 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
11292
11293         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
11294         interface type is implemented by this TypeContainer.  Used during
11295         explicit interface implementation.
11296
11297         (Property.Define, Indexer.Define, Method.Define): Validate that
11298         the given interface in the explicit implementation is one of the
11299         base classes for the containing type.
11300
11301         Also if we are explicitly implementing an interface, but there is
11302         no match in the pending implementation table, report an error.
11303
11304         (Property.Define): Only define the property if we are
11305         not explicitly implementing a property from an interface.  Use the
11306         correct name also for those properties (the same CSC uses,
11307         although that is really not needed).
11308
11309         (Property.Emit): Do not emit attributes for explicitly implemented
11310         properties, as there is no TypeBuilder.
11311
11312         (Indexer.Emit): ditto.
11313
11314         Hiding then means that we do not really *implement* a pending
11315         implementation, which makes code fail.
11316
11317 2002-06-22  Martin Baulig  <martin@gnome.org>
11318
11319         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
11320         the return value of Object.GetType().  [FIXME: we need to do this whenever
11321         we get a type back from the reflection library].
11322
11323 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
11324
11325         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
11326
11327 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
11328
11329         * attribute.cs: Return null if we can not look up the type.
11330
11331         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
11332         the interface types found.
11333
11334         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
11335         interface types found.
11336
11337         * typemanager.cs (GetInterfaces): Make this routine returns alll
11338         the interfaces and work around the lame differences between
11339         System.Type and System.Reflection.Emit.TypeBuilder in the results
11340         result for GetInterfaces.
11341
11342         (ExpandInterfaces): Given an array of interface types, expand and
11343         eliminate repeated ocurrences of an interface.  This expands in
11344         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
11345         be IA, IB, IC.
11346
11347 2002-06-21  Martin Baulig  <martin@gnome.org>
11348
11349         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
11350         on System.Enum.
11351
11352 2002-06-21  Martin Baulig  <martin@gnome.org>
11353
11354         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
11355         and called with one of the core types, return the corresponding typebuilder for
11356         that type.
11357
11358         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
11359         element type.
11360
11361 2002-06-21  Martin Baulig  <martin@gnome.org>
11362
11363         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
11364         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
11365         (Expression.ConvertReferenceExplicit): Likewise.
11366
11367         * expression.cs (ElementAccess.DoResolve): Likewise.
11368         (ElementAccess.DoResolveLValue): Likewise.
11369
11370 2002-06-10  Martin Baulig  <martin@gnome.org>
11371
11372         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
11373         add the "value" parameter to the parameter list.
11374
11375         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
11376         to our caller.
11377
11378 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
11379
11380         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
11381         the argument to an int, uint, long or ulong, per the spec.  Also
11382         catch negative constants in array creation.
11383
11384 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
11385
11386         * class.cs: do not allow the same interface to appear twice in
11387         the definition list.
11388
11389 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
11390
11391         * ecore.cs: don't use ldlen with System.Array.
11392
11393 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
11394
11395         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
11396
11397 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
11398
11399         * modifiers.cs: produce correct field attributes for protected
11400         internal. Easy fix so miguel can work on ther harder stuff:-)
11401
11402 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
11403
11404         * pending.cs: New file.  Move the code from class.cs here.
11405         Support clearning the pending flag for all methods (when not doing
11406         explicit interface implementation).
11407
11408 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
11409
11410         * rootcontext.cs: added a couple more types needed to bootstrap.
11411
11412 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
11413
11414         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
11415         constructor in the type, instead of any constructor in the type
11416         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
11417         a bug in the Mono runtime when applying the params attribute). 
11418
11419 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
11420         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
11421
11422 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
11423
11424         * expression.cs (Unary.ResolveOperator): Use TypeManager
11425         to resolve the type.
11426
11427 2002-06-13  Ravi Pratap  <ravi@ximian.com>
11428
11429         * cs-parser.jay (enum_member_declaration): Pass in the attributes
11430         attached.
11431
11432         * enum.cs (AddEnumMember): Add support to store the attributes associated 
11433         with each member too.
11434
11435         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
11436         field builders too - this takes care of the enum member case.
11437
11438 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
11439
11440         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
11441         address-of operator on both value types and pointers.
11442
11443 2002-06-10  Martin Baulig  <martin@gnome.org>
11444
11445         * interface.cs (Interface.PopulateIndexer): Add the indexer's
11446         PropertyBuilder to the `property_builders' list.
11447
11448         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
11449         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
11450         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
11451         find any indexers which are inherited from an interface.
11452
11453 2002-06-09  Martin Baulig  <martin@gnome.org>
11454
11455         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
11456         the same type as the constant if necessary.  There's also a test-130.cs
11457         for this.
11458
11459         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
11460
11461         * typemanager.cs (TypeManager.ChangeType): Previously known as
11462         Enum.ChangeEnumType().
11463
11464 2002-06-09  Martin Baulig  <martin@gnome.org>
11465
11466         * expression.cs (Cast.TryReduce): Added support for consts.
11467
11468 2002-06-08  Ravi Pratap  <ravi@ximian.com>
11469
11470         * class.cs (Accessor): Hold attributes information so we can pass
11471         it along.
11472
11473         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
11474         Modify to pass in attributes attached to the methods.
11475
11476         (add_accessor_declaration, remove_accessor_declaration): Ditto.
11477
11478         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
11479         to handle the Accessor kind :-)
11480
11481         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
11482
11483 2002-06-08  Martin Baulig  <martin@gnome.org>
11484
11485         * expression.cs (Unary.TryReduceNegative): Added support for
11486         ULongConstants.
11487
11488 2002-06-08  Martin Baulig  <martin@gnome.org>
11489
11490         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
11491         name can't be found in the `defined_names' - the caller will do a
11492         MemberLookup in this case and thus find methods in System.Enum
11493         such as Enum.IsDefined().
11494
11495 2002-06-08  Martin Baulig  <martin@gnome.org>
11496
11497         * enum.cs (Enum.ChangeEnumType): This is a custom version of
11498         Convert.ChangeType() which works with TypeBuilder created types.
11499         (Enum.LookupEnumValue, Enum.Define): Use it here.
11500
11501         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
11502         `TypeBuilder.BaseType != null' check.
11503         (TypeContainer.FindMembers): Only lookup parent members if we
11504         actually have a parent.
11505         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
11506         (ConstructorInitializer.Resolve): Likewise.
11507
11508         * interface.cs (Interface.FindMembers): Added
11509         `TypeBuilder.BaseType != null' check.
11510
11511         * rootcontext.cs (RootContext.ResolveCore): Added
11512         "System.Runtime.CompilerServices.IndexerNameAttribute" to
11513         classes_second_stage.
11514
11515         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
11516         debug_type and trace_type when compiling with --nostdlib.       
11517
11518 2002-06-07  Martin Baulig  <martin@gnome.org>
11519
11520         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
11521         (AddField): Set it to true when adding a non-static field.
11522         (DefineType): Use `have_nonstatic_fields' to find out whether we
11523         have non-static fields, not `Fields != null'.
11524
11525 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
11526
11527         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
11528         dereferencing a null on the static-field code path)
11529
11530 2002-05-30  Martin Baulig  <martin@gnome.org>
11531
11532         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
11533         to take command line arguments.  Use reflection to call the new
11534         custom `Initialize' function on the symbol writer and pass it the
11535         command line arguments.
11536
11537         * driver.cs (--debug-args): New command line argument to pass command
11538         line arguments to the symbol writer.
11539
11540 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
11541
11542         * assign.cs (DoResolve): Forgot to do the implicit conversion to
11543         the target type for indexers and properties.  Thanks to Joe for
11544         catching this.
11545
11546 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
11547
11548         * typemanager.cs (MethodFlags): returns the method flags
11549         (Obsolete/ShouldIgnore) that control warning emission and whether
11550         the invocation should be made, or ignored. 
11551
11552         * expression.cs (Invocation.Emit): Remove previous hack, we should
11553         not do this on matching a base type, we should do this based on an attribute
11554
11555         Only emit calls to System.Diagnostics.Debug and
11556         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
11557         on the command line.
11558
11559         * rootcontext.cs: Global settings for tracing and debugging.
11560
11561         * cs-tokenizer.cs (define): New utility function to track
11562         defines.   Set the global settings for TRACE and DEBUG if found.
11563
11564 2002-05-25  Ravi Pratap  <ravi@ximian.com>
11565
11566         * interface.cs (Populate*): Pass in the TypeContainer as well as
11567         the DeclSpace as parameters so that we can create EmitContexts and
11568         then use that to apply attributes etc.
11569
11570         (PopulateMethod, PopulateEvent, PopulateProperty)
11571         (PopulateIndexer): Apply attributes everywhere.
11572
11573         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
11574         etc.
11575
11576         (ApplyAttributes): Update accordingly.
11577
11578         We now apply interface attributes for all members too.
11579
11580 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
11581
11582         * class.cs (Indexer.Define); Correctly check if we are explicit
11583         implementation (instead of checking the Name for a ".", we
11584         directly look up if the InterfaceType was specified).
11585
11586         Delay the creation of the PropertyBuilder.
11587
11588         Only create the PropertyBuilder if we are not an explicit
11589         interface implementation.   This means that explicit interface
11590         implementation members do not participate in regular function
11591         lookups, and hence fixes another major ambiguity problem in
11592         overload resolution (that was the visible effect).
11593
11594         (DefineMethod): Return whether we are doing an interface
11595         implementation. 
11596
11597         * typemanager.cs: Temporary hack until we get attributes in
11598         interfaces (Ravi is working on that) and we get IndexerName
11599         support in interfaces.
11600
11601         * interface.cs: Register the indexers as properties.
11602
11603         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
11604         warning, I have verified that this is a bug in the .NET runtime
11605         (JavaScript suffers of the same problem).
11606
11607         * typemanager.cs (MemberLookup): When looking up members for
11608         interfaces, the parent of an interface is the implicit
11609         System.Object (so we succeed in searches of Object methods in an
11610         interface method invocation.  Example:  IEnumerable x;  x.ToString
11611         ()) 
11612
11613 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
11614
11615         * class.cs (Event): Events should also register if they do
11616         implement the methods that an interface requires.
11617
11618         * typemanager.cs (MemberLookup); use the new GetInterfaces
11619         method. 
11620
11621         (GetInterfaces): The code used to lookup interfaces for a type is
11622         used in more than one place, factor it here. 
11623
11624         * driver.cs: Track the errors at the bottom of the file, we kept
11625         on going.
11626
11627         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
11628         instance if the method we are calling is static!
11629
11630 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
11631
11632         * attribute.cs (ApplyAttributes): Make this function filter out
11633         the IndexerName attribute (as that attribute in reality is never
11634         applied) and return the string constant for the IndexerName
11635         attribute. 
11636
11637         * class.cs (TypeContainer.Emit): Validate that all the indexers
11638         have the same IndexerName attribute, and if so, set the
11639         DefaultName attribute on the class. 
11640
11641         * typemanager.cs: The return value might contain other stuff (not
11642         only methods).  For instance, consider a method with an "Item"
11643         property and an Item method.
11644
11645         * class.cs: If there is a problem with the parameter types,
11646         return. 
11647
11648 2002-05-24  Ravi Pratap  <ravi@ximian.com>
11649
11650         * ecore.cs (ImplicitConversionExists): Wrapper function which also
11651         looks at user defined conversion after making a call to 
11652         StandardConversionExists - we need this for overload resolution.
11653
11654         * expression.cs : Update accordingly the various method calls.
11655
11656         This fixes 2 bugs filed against implicit user defined conversions 
11657
11658 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
11659
11660         * statement.cs: Track the result of the assignment.
11661
11662 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
11663
11664         * expression.cs (MemberAccess): Improved error reporting for
11665         inaccessible members.
11666
11667 2002-05-22  Martin Baulig  <martin@gnome.org>
11668
11669         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
11670         itself with debugging support.
11671
11672 2002-05-22  Martin Baulig  <martin@gnome.org>
11673
11674         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
11675         Removed, this isn't needed anymore.
11676
11677 2002-05-20  Martin Baulig  <martin@gnome.org>
11678
11679         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
11680         be underlying type for an enum.
11681
11682 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
11683
11684         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
11685         that splits out the loading of just the core types.
11686
11687         * rootcontext.cs (ResolveCore): Split the struct resolution in
11688         two, so we can load the enumeration underlying types before any
11689         enums are used.
11690
11691         * expression.cs (Is): Bandaid until we fix properly Switch (see
11692         bug #24985 for details).
11693
11694         * typemanager.cs (ImplementsInterface): The hashtable will contain
11695         a null if there are no interfaces implemented.
11696
11697 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
11698
11699         * cs-parser.jay (indexer_declarator): It is fine to have array
11700         parameters
11701
11702 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11703
11704         * typemanager.cs: (RegisterBuilder): New function used to register
11705         TypeBuilders that implement interfaces.  Since
11706         TypeBuilder.GetInterfaces (as usual) does not work with lame
11707         Reflection.Emit. 
11708         (AddUserType): register interfaces.
11709
11710         (ImplementsInterface): Use the builder_to_ifaces hash if we are
11711         dealing with TypeBuilder.  Also, arrays are showing up as
11712         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
11713         methods can not be invoked on them!
11714
11715         * ecore.cs (ExplicitReferenceConversionExists): Made public.
11716         (ImplicitReferenceConversionExists): Split out from
11717         StandardConversionExists. 
11718
11719         * expression.cs (As): We were only implementing one of the three
11720         cases for the as operator.  We now implement them all.
11721         (Is): Implement the various other cases for Is as well.
11722
11723         * typemanager.cs (CACHE): New define used to control if we want or
11724         not the FindMembers cache.  Seems to have a negative impact on
11725         performance currently
11726
11727         (MemberLookup): Nested types have full acess to
11728         enclosing type members
11729
11730         Remove code that coped with instance/static returns for events, we
11731         now catch this in RealFindMembers.
11732
11733         (RealFindMembers): only perform static lookup if the instance
11734         lookup did not return a type or an event.  
11735
11736 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
11737
11738         * assign.cs (CompoundAssign): We pass more semantic information
11739         now to Compound Assignments than we did before: now we have all
11740         the information at hand, and now we resolve the target *before* we
11741         do the expression expansion, which allows the "CacheValue" method
11742         to have the effect we intended (before, a [x] += 1 would generate
11743         two differen ArrayAccess expressions from the ElementAccess,
11744         during the resolution process).
11745
11746         (CompoundAssign.DoResolve): Resolve target and original_source here.
11747
11748 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
11749
11750         * expression.cs (ArrayAccess): dropped debugging information. 
11751
11752         * typemanager.cs: Small bug fix: I was always returning i_members,
11753         instead of one of i_members or s_members (depending on which had
11754         the content).
11755
11756         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
11757         method is invoked before any code generation takes place, and it
11758         is a mechanism to inform that the expression will be invoked more
11759         than once, and that the method should use temporary values to
11760         avoid having side effects
11761
11762         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
11763
11764         * ecore.cs (Expression.CacheTemporaries): Provide empty default
11765         implementation.
11766
11767         * expression.cs (Indirection, ArrayAccess): Add support for
11768         CacheTemporaries in these two bad boys. 
11769
11770         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
11771         ldobj or ldind_ref.  
11772         (StoreFromPtr): Handle stobj as well.
11773
11774         * expression.cs (UnaryMutator): Share more code.
11775
11776         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
11777         down: I was not tracking the Filter function as well, which
11778         was affecting the results of the cache.
11779
11780 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
11781
11782         * attribute.cs: Remove the hack to handle the CharSet property on
11783         StructLayouts. 
11784
11785 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
11786
11787         * attribute.cs (DoResolve): More uglyness, we now only try to
11788         resolve the attribute partially, to extract the CharSet
11789         information (only if we are a StructLayout attribute).  Otherwise 
11790
11791         (GetExtraTypeInfo): Add some code to conditionally kill in the
11792         future this.   I am more and more convinced that the .NET
11793         framework has special code to handle the attribute setting on
11794         certain elements.
11795
11796         * expression.cs (IsParamsMethodApplicable): Revert my previous
11797         foreach change here, it was wrong.
11798
11799 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
11800
11801         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
11802         (pp_expr): do not abort on unknown input, just return.
11803         (eval): abort if there are pending chars.
11804
11805         * attribute.cs (Attribute.Resolve): Positional parameters are
11806         optional.  Deal with that case.
11807
11808         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
11809         the Ansi/Unicode/Auto information for the type.
11810
11811         (TypeContainer.DefineType): instantiate the EmitContext here, as
11812         we will be using it during the type definition (to resolve
11813         attributes) and during the emit phase.
11814
11815         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
11816         to pull type information out of the attributes
11817
11818         (Attribute.Resolve): track the constructor builder, and allow for
11819         multiple invocations (structs and classes will use this).
11820
11821         * ecore.cs (MemberLookupFinal): new version with all the
11822         parameters customizable.
11823
11824         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11825         constructors.  Return if the result value is null (as the error
11826         would have been flagged already by MemberLookupFinal)
11827
11828         Do not allow instances of abstract classes or interfaces to be
11829         created.
11830
11831         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11832         We have to compare the assembly property here when dealing with
11833         FamANDAssem and Assembly access modifiers, because we might be
11834         creating an assembly from *modules* (that means that we are not
11835         getting TypeBuilders for types defined in other modules that are
11836         part of this assembly).
11837
11838         (Method.Emit): If the method is marked abstract and has a body,
11839         emit an error. 
11840
11841         (TypeContainer.DefineMembers): If both the defined member and the
11842         parent name match are methods, then do not emit any warnings: let
11843         the Method.Define routine take care of flagging warnings.  But if
11844         there is a mismatch (method overrides something else, or method is
11845         overriwritten by something, then emit warning).
11846
11847         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11848         set to null, this means `do not check for the return type on the
11849         signature'. 
11850
11851         (Method.Define): set the return type for the method signature to
11852         null, so that we get methods with the same name and parameters and
11853         different return types.  This is used to flag warning 114 (you are
11854         hiding a method, and you probably want to use the new/override
11855         keywords instead).
11856
11857         * typemanager.cs (MemberLookup): Implemented proper access
11858         control, closing a long standing set of bug reports.  The problem
11859         was that the Framework only has two bits: Public and NonPublic,
11860         and NonPublic includes private and protected methods, but we need
11861         to enforce the FamANDAssem, FamOrAssem and Family. 
11862
11863 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11864
11865         * statement.cs (GotoCase): Return true: Ammounts to giving up
11866         knowledge on whether we return or not, and letting the other case
11867         be responsible for it.
11868
11869 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11870
11871         * driver.cs: Do not load directories for each file processed, only
11872         do it if there is a pattern.
11873
11874         * ecore.cs: Report readonly assigns here as well, as we might have
11875         been resolved only by MemberAccess.
11876
11877         (SimpleName.SimpleNameResolve): Also be useful for LValue
11878         resolution.   We need this to propagate assign to local readonly variables
11879
11880         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11881         do not want to reuse potential criteria memory.
11882
11883         * class.cs (MyEventBuilder): Set reflected_type;
11884
11885         * ecore.cs (Constantify): Added support for constifying bools.
11886
11887         (RootContext.LookupType): Added a cache for values looked up in
11888         the declaration space.
11889
11890         * typemanager.cs (FindMembers): Now is a front-end to
11891         RealFindMembers, and provides a two-level hashtable-based cache to
11892         the request.  
11893
11894         15% performance improvement: from 22.5 to 19.2 seconds.
11895
11896         * expression.cs (IsParamsMethodApplicable): use foreach.
11897         (Invocation.DoResolve): ditto.
11898         (New.DoResolve): ditto.
11899         (ArrayCreation.DoResolve): ditto.
11900
11901         * ecore.cs (FindMostEncompassingType): use foreach.
11902
11903         * delegate.cs (NewDelegate.DoResolve): Use foreach
11904
11905         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11906         (RemoveMethods): use foreach.
11907
11908         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11909         nested foreach statements instead of for, and also break out of
11910         the inner loop once a match is found.
11911
11912         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11913
11914 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11915
11916         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11917         we actually unwrap the expression to allow for extra information
11918         to be extracted. 
11919
11920         * expression.cs: Use Shr_Un on unsigned operations. 
11921
11922 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11923
11924         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11925         applicable operators was not being considered correctly. This closes
11926         the bug Miguel reported.
11927
11928 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11929
11930         * attribute.cs: check that the type derives from System.Attribute
11931         and report the correct error in that case (moved the duplicate code to
11932         its own method, too).
11933
11934 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11935
11936         * attribute.cs: lookup attribute type name as the spec says: first the
11937         bare attribute name and then name + "Attribute" (nant compiles with
11938         mcs after this fix).
11939
11940 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11941
11942         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11943         Because of the way we parse things, we should try to see if a
11944         UIntConstant can fit in an integer.
11945
11946 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11947
11948         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11949         when we are in an explicit context.
11950
11951         (ConvertReferenceExplicit): When converting from Iface type S to Class
11952         T make sure the rules are implemented as an OR.
11953
11954         * parameter.cs (ParameterType): Make it a property for now although the
11955         purpose really isn't anything immediate.
11956
11957         * expression.cs (Is*Applicable): Do better checking on the parameter type
11958         of a ref/out parameter. The ones from the system assemblies are already 
11959         marked with the correct type so we don't need to do any correction.
11960
11961         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11962         the object type is standard too so include that.
11963
11964 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11965
11966         * ecore.cs (StandardConversionExists): Augment with missing code:
11967         deal with IntConstant, LongConstants and Enumerations.
11968
11969         * assign.cs: Report the error, instead of failing silently
11970
11971         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11972         typecontainer that they are declared, because the
11973         typecontainer/namespace will have the list of using clauses that
11974         need to be applied.
11975
11976         Assembly Attributes were escaping the normal registration
11977         mechanism. 
11978
11979         (EmitCode): Apply attributes within an EmitContext that represents
11980         the container they were declared on.
11981
11982         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11983
11984 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11985
11986         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11987         Revamp completely - make much cleaner as we now operate only
11988         on a set of Types.
11989
11990         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11991         to implement the logic detailed in the spec more correctly.
11992
11993         (UserDefinedConversion): Update accordingly.
11994
11995 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11996
11997         * statement.cs: Return flow analysis information up.
11998
11999         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
12000         and the default.
12001
12002         (token): Do not consume an extra character before calling
12003         decimal_digits.
12004
12005 2002-05-06  Piers Haken <piersh@friskit.com>
12006
12007         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
12008
12009 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
12010
12011         * class.cs (Constructor.Emit): Set the IsStatic flag in the
12012         EmitContext during the instance constructor initializer
12013         resolution, to stop access to instance variables.
12014
12015         This is mandated by the spec, last paragraph of the `constructor
12016         initializers' section. 
12017
12018 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
12019
12020         * cs-parser.jay, class.cs (Accessor): new class used to represent
12021         an accessor (get or set).  In the past we used `null' to represent
12022         a missing accessor.  But this is ambiguous because there was no
12023         way to tell in abstract indexers/properties if one of them was
12024         specified.
12025
12026         Now there is a way of addressing that.
12027
12028         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
12029         instead of FindMembers.
12030
12031         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
12032         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
12033
12034         * attribute.cs: Treat indexers and properties as the same in terms
12035         of applying attributes
12036
12037         * ecore.cs (FindMostEncompassedType): Use statically initialized
12038         EmptyExpressions()s like we do elsewhere to avoid creating useless
12039         objects (and we take this out of the tight loop).
12040
12041         (GetConversionOperators): Move the code to extract the actual
12042         operators to a separate routine to clean things up.
12043
12044 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
12045
12046         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
12047         events are always registered FieldBuilders.
12048
12049         * class.cs (FieldBase): New class shared by Fields 
12050
12051         * delegate.cs: If we are a toplevel delegate, use our full name.
12052         If we are a nested delegate, then only use our tail name.
12053
12054 2002-05-02  Ravi Pratap  <ravi@ximian.com>
12055
12056         * expression.cs (IsApplicable): Ensure that we add the "&" to
12057         ref/out types before comparing it with the type of the argument.
12058
12059         (IsParamsMethodApplicable): Ditto.
12060
12061         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
12062         silly me ;-)
12063
12064         * delegate.cs : Handle the case when we have more than one applicable
12065         method. Flag an error only when we finish checking all.
12066
12067 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
12068
12069         * expression.cs: Add support for boolean static initializers.
12070
12071 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
12072
12073         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
12074
12075         * parameter.cs (ComputeParameterTypes,
12076         ComputeAndDefineParameterTypes): Better error handling: now we
12077         clear the `types' cache if we fail during any of the type lookups.
12078         We also return the status code correctly to our caller
12079
12080         * delegate.cs: If we fail to define a delegate, abort the extra
12081         steps. 
12082
12083         * expression.cs (Binary.ResolveOperator): for
12084         operator==(object,object) and operator !=(object, object) we also
12085         have to verify that there is an implicit conversion from one to
12086         the other.
12087
12088         (ArrayAccess.DoResolve): Array Access can operate on
12089         non-variables. 
12090
12091 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
12092
12093         * assign.cs (CompoundAssign): A new class used as a "flag" that
12094         the assignment actually is happening as part of a compound
12095         assignment operator.
12096
12097         During compound assignment, a few new rules exist to enable things
12098         like:
12099
12100         byte b |= 1 + 2
12101
12102         From the spec:
12103
12104         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
12105         to the type of x) if y is implicitly convertible to the type of x,
12106         and the operator is a builtin operator and the return type of the
12107         operator is explicitly convertible to the type of x. 
12108
12109         * rootcontext.cs: Reset warning level to 2.  4 catches various
12110         "interesting" features in mcs, we must clean this up at some
12111         point, but currently am trying to kill other bugs ;-)
12112
12113         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
12114         in container classes as well.  
12115
12116         * expression.cs (Binary.ResolveOperator): Handle string case
12117         before anything else (as operator overloading does emit an error
12118         before doing anything else).
12119
12120         This code could go away when we move to a table driven model, but
12121         i could not come up with a good plan last night.
12122
12123 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
12124
12125         * typemanager.cs (CSharpName): reimplementation using regex.
12126         * class.cs: added null check for fields in Emit
12127         * rootcontext.cs: set warninglevel to 4
12128
12129 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
12130
12131         * typemanager.cs (CSharpName): reimplemented with Lupus
12132         suggestion.
12133
12134 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
12135
12136         * statement.cs (If): correclty implement Resolve, because we were
12137         not catching sem errors in there.  The same process is needed
12138         everywhere else. 
12139         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
12140
12141
12142         (Statement.Warning_DeadCodeFound): Factorize code.
12143         (While): Report dead code here too.
12144
12145         (Statement): Added Resolve virtual method to allow
12146         for resolution split from the emit code.
12147
12148 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
12149
12150         * statement.cs (EmitBoolExpression): No longer try to resolve the
12151         expression here.    
12152         (MakeBoolean): New utility function that resolve, implicitly
12153         converts to boolean and tags the expression. 
12154
12155
12156         (If, Do): Implement dead code elimination.
12157         (While): Implement loop inversion
12158
12159         (Do, While, For, If): Resolve the expression prior to calling our
12160         code generation.
12161
12162 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
12163
12164         * class.cs:
12165           - added method Report28 (warning: program has more than one entry point)
12166           - added method IsEntryPoint, implements paragraph 10.1 of the spec
12167           - modified method Method.Define, the part at the end of the method
12168
12169         * rootcontext.cs: added static public Location EntryPointLocation;
12170           
12171         * ../errors/cs0028.cs : Add test case for the above warning.              
12172
12173         * typemanager.cs:
12174           - modified method CSharpName to allow arrays of primitive type to
12175             be printed nicely (e.g. instead of System.Int32[][] it now prints
12176             int[][])
12177           - added method CSharpSignature: returns the signature of a method
12178             in string format to be used in reporting errors, warnings, etc.
12179
12180         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
12181         with String.Empty.
12182
12183 2002-04-26  Ravi Pratap  <ravi@ximian.com>
12184
12185         * delegate.cs (Define): Fix extremely silly bug where I was
12186         setting the type of the 'object' parameter of the BeginInvoke
12187         method to System.IAsyncResult instead of System.Object ;-)
12188
12189 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
12190
12191         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
12192         here. 
12193
12194         (Constructor.Emit): return if we fail to initialize the
12195         constructor.  Another door closed!  
12196
12197         * expression.cs (New.DoResolve): Improve error message (from -6 to
12198         1501).  Use DeclaredOnly lookup to find the exact constructor.
12199
12200         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
12201         loop.  This is useful.
12202
12203         * cs-parser.jay: Adjust the default parameters so that destructors
12204         have the proper signature.
12205
12206 2002-04-26  Martin Baulig  <martin@gnome.org>
12207
12208         * driver.cs (LoadAssembly): If `assembly' contains any characters
12209         which are only valid in path names and not in assembly names
12210         (currently slash, backslash and point), use Assembly.LoadFrom ()
12211         instead of Assembly.Load () on the `assembly' (before iteration
12212         over the link_paths).
12213
12214 2002-04-26  Martin Baulig  <martin@gnome.org>
12215
12216         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
12217
12218 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
12219
12220         * class.cs (Property): use the new typemanager.MemberLookup
12221
12222         (TypeContainer.MemberLookup): Implement using the
12223         TypeManager.MemberLookup now. 
12224
12225         * typemanager.cs: Make MemberLookup a function of the TypeManager,
12226         and return MemberInfos, so that these can be used without an
12227         EmitContext (what we had before).
12228
12229 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
12230
12231         * expression.cs: Fix the case where the argument to params if the
12232         type of the params.  I omitted handling this before.   Fixed
12233
12234 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
12235
12236         * driver.cs: Call BootCorlib_PopulateCoreType
12237
12238         * class.cs (Property.CheckBase): Check for properties only, not
12239         for all members. 
12240
12241         * interface.cs: Temporary hack: try/catch around the
12242         CustomAttributeBuilder, because I am getting an exception that I
12243         do not understand.
12244
12245         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
12246         types whose definitions are required to be there (attributes are
12247         defined before standard types).
12248
12249         Compute definitions as we boot the various types, as they are used
12250         immediately (value_type class will need object_type, but if we do
12251         not initialize object_type, we will pass a null, which will let
12252         the runtime pick the System.Object from the existing corlib, which
12253         is not what we want).
12254
12255 2002-04-22  Patrik Torstensson <totte@labs2.com>
12256
12257         * cs-tokenizer.cs: fixed a number of trim() issues.
12258
12259 2002-04-22  Ravi Pratap  <ravi@ximian.com>
12260
12261         * expression.cs (Argument.Type): Ensure that we return the correct
12262         type when we have out or ref parameters [in which case we 
12263         append a "&"].
12264
12265 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
12266
12267         * class.cs (Property, Indexer): Allow extern modifier in there. 
12268
12269         * typemanager.cs (InitBaseTypes): Initializes object_type and
12270         value_type, since those will be used early on during the bootstrap
12271         process to compile corlib.
12272
12273         (InitCoreTypes): Move code from here to InitBaseTypes.
12274
12275 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
12276
12277         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
12278         single-dimension arrays as using the ldlen opcode.  
12279
12280         Daniel Lewis discovered this optimization.  
12281
12282         * typemanager.cs: Add signature for System.Array::get_Length
12283
12284 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12285
12286         * statement.cs: report the error when the foreach does not apply to an
12287         array nor a collection.
12288
12289 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
12290
12291         * expression.cs: Add implicit conversions to the operator ~.
12292
12293         * constant.cs (DecimalConstant.Emit): Emit decimal value.
12294
12295         * typemanager.cs: Locate the decimal constructor.
12296
12297 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12298
12299         * attribute.cs: use the new property of TypeOf.
12300         * expression.cs: added 'get' property around typearg.
12301
12302         These changes fix a build breaker reported by NickD. Is this the
12303         correct way to fix?  If not, please, revert my changes and make it
12304         work :-).
12305
12306 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
12307
12308         * attribute.cs: Add support for typeof in attribute invocations.
12309         I am not sure that this is right though.
12310
12311 2002-04-14  Duncan Mak  <duncan@ximian.com>
12312
12313         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
12314         Binary.Operator.Division case.
12315
12316 2002-04-13  Ravi Pratap  <ravi@ximian.com>
12317
12318         * class.cs (DefineType): Ensure that we do a proper check on
12319         attribute types and also register it with the TypeManager.
12320
12321         (TypeContainer.Targets): The default for attribute types is
12322         AttributeTargets.All.
12323
12324         * attribute.cs (ApplyAttributes): Registering the attribute type
12325         is done elsewhere, not when we discover we have a Usage attribute.
12326
12327 2002-04-12  Ravi Pratap  <ravi@ximian.com>
12328
12329         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
12330         and get rid of is_delegate parameter.
12331
12332         * everywhere : update.
12333
12334 2002-04-12  Ravi Pratap  <ravi@ximian.com>
12335
12336         * cs-parser.jay (compilation_unit): Revamp completely to use
12337         some new ideas that I got from Rhys' grammar to solve the problems
12338         with assembly level attributes.
12339
12340         (outer_declaration): New grammar production.
12341
12342         (attribute_sections): Add.
12343
12344         (opt_attributes): Base on attribute_sections
12345
12346         (namespace_declaration): Allow opt_attributes to tackle the case
12347         when we have assembly level attributes - we are clever in this
12348         regard now ;-)
12349
12350         * attribute.cs (ApplyAttributes): Do not worry about assembly 
12351         attributes in the non-global context.
12352
12353         * rootcontext.cs (AddGlobalAttributes): Go back to using this
12354         instead of SetGlobalAttributes.
12355
12356         * class.cs, rootcontext.cs : Ensure we define and generate 
12357         attribute types before anything else.
12358
12359         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
12360         and flag the new error -20 for the case when the attribute type
12361         does not have valid targets specified. csc does not catch this.
12362
12363         * ../errors/errors.txt : update for error # -20
12364
12365 2002-04-11  Ravi Pratap  <ravi@ximian.com>
12366
12367         * support.cs (InternalParameters.ParameterModifier): Do some null
12368         checking and return sane values.
12369
12370         * class.cs (Method.Define): If we are a PInvoke method, ensure
12371         that we are static and extern. Report error # 601
12372
12373         * ../errors/cs0601.cs : Add test case for the above error.
12374
12375 2002-04-07  Ravi Pratap  <ravi@ximian.com>
12376
12377         * rootcontext.cs (attribute_types): We need to keep type of
12378         all attribute types separately and emit code for them first.
12379
12380         (RegisterAttribute) : Implement.
12381
12382         * class.cs (DefineType): Check if the current Type is a custom
12383         attribute type and register it accordingly.
12384
12385         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
12386         adding the first attribute twice and rename to
12387
12388         (SetGlobalAttributes): this.
12389
12390         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
12391         lookups.
12392
12393         * attribute.cs (ApplyAttributes): Take an additional argument telling us
12394         if we are processing global arguments. Hmm, I am unsure of this.
12395
12396 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12397
12398         * expression.cs: added static array of strings to avoid calling
12399         Enum.ToString () for Operator in Binary. Significant recover of
12400         performance.
12401
12402 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
12403
12404         * class.cs (FindMembers): Allow the Builders of the various
12405         members to be null.  If they are skip them.  This only happens
12406         during the PInvoke declaration.
12407
12408 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
12409
12410         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
12411         failure, so we do not keep going afterwards.
12412
12413         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
12414         wanted to pass `false' as the `is_delegate' argument.  If this is
12415         the case, why not use delegate_type == null to mean `is_delegate =
12416         false' and anything else as is_delegate = true.
12417
12418 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
12419
12420         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
12421         code for the section, not the beginning of the tests.
12422
12423 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
12424
12425         * cfold.cs: Handle operator + (Enum x, Underlying x) 
12426
12427         * expression.cs (Binary): same.  Warn about errors where we have
12428         Enum/Enum in operator + as well.
12429
12430 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
12431
12432         * statement.cs:
12433                 - added support for switch(bool)
12434                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
12435                 - add TableSwitchEmit() to handle table-based switch statements
12436
12437 2002-04-05  Ravi Pratap  <ravi@ximian.com>
12438
12439         * expression.cs (Invocation.OverloadResolve): Factor out code which
12440         does parameter compatibility checking with arguments so that we can 
12441         re-use the code even from Delegate.VerifyApplicability
12442
12443         (VerifyArgumentsCompat): Move above code here.
12444
12445         * delegate.cs (VerifyApplicability): Get rid of duplicate code
12446         and instead make a call to the above method.
12447
12448 2002-03-31  Ravi Pratap  <ravi@ximian.com>
12449
12450         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
12451         We use it to keep track of classes which are attribute types.
12452
12453 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
12454
12455         * delegate.cs (Delegate.Define): Correctly define the types in the
12456         presence of fixed and array parameters.
12457
12458         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
12459         doing FindMembers.
12460
12461         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
12462         include NonPublic after the first iteration.
12463
12464         * class.cs (Indexer.CheckBase): Only check if both parents are
12465         non-null. 
12466
12467         * cs-parser.jay (accessor_body): If empty, set to null.
12468
12469         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
12470         same code path here to resolve constants names that we did have in
12471         MemberAccess.DoResolve.  There is too much code duplicated here.
12472
12473 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
12474
12475         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
12476
12477         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
12478         to MakeUnionSet.
12479
12480         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
12481         tokens, numbers and strings.
12482
12483         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
12484         parenthesis.
12485
12486         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
12487         asyncronous parameters and the regular parameters.  
12488
12489         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
12490         specify the target directory.
12491
12492         * expression.cs: (This.DoResolve): Simplify
12493         (As.Emit): Optimize, do not generate IsInst if the expression is
12494         always of the given type.
12495
12496         (Is.DoResolve): Bug fix, we were reporting both always/never for
12497         the is expression.
12498
12499         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
12500         creating too many unnecessary arrays.
12501
12502 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
12503
12504         * class.cs (EmitFieldInitializer): Use Assign expression to assign
12505         fields instead of rolling our own initializer.   Takes care of all
12506         implicit conversions, and drops unnecessary static checks/argument.
12507
12508 2002-03-31  Dick Porter  <dick@ximian.com>
12509
12510         * driver.cs: use the GetDirectories() return values properly, and
12511         use "/" as path separator.
12512
12513 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
12514
12515         * expression.cs (Unary): Optimize - - expr into expr.
12516         (Binary): Optimize a + (-b) into a -b.
12517
12518         * codegen.cs (CodeGen): Made all methods static.
12519
12520 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
12521
12522         * rootcontext.cs: 
12523
12524         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
12525         TypeBuilder property.
12526
12527         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
12528         instead. 
12529
12530         * tree.cs: Removed the various RecordXXXX, and replaced with a
12531         single RecordDecl.  Removed all the accessor methods, and just
12532         left a single access point Type 
12533
12534         * enum.cs: Rename DefineEnum to DefineType.
12535
12536         * decl.cs: New abstract method `DefineType' used to unify the
12537         Defines for Enumerations, Interfaces, TypeContainers and
12538         Delegates.
12539
12540         (FindType): Moved LookupInterfaceOrClass here.  Moved the
12541         LookupBaseClasses method that used to live in class.cs and
12542         interface.cs here, and renamed to FindType.
12543
12544         * delegate.cs: Implement DefineType.  Take advantage of the
12545         refactored pattern for locating the parent builder without taking
12546         the parent_builder argument (which we know does not work if we are
12547         nested, and triggering a toplevel definition).
12548
12549 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12550
12551         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
12552         accessibility of a member has changed during override and report
12553         an error if so.
12554
12555         * class.cs (Method.Define, Property.Define): Only complain on
12556         overrides if the method is private, any other accessibility is
12557         fine (and since we just checked the permission is the same, we are
12558         good to go).
12559
12560         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
12561         and elif are processed always.  The other pre-processing
12562         directives are only processed if we are "taking" the path
12563
12564 2002-03-29  Martin Baulig  <martin@gnome.org>
12565
12566         * class.cs (Method.Emit): Only emit symbolic debugging info if the
12567         current location is not Null.
12568
12569         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
12570         a separate method so we can profile it.
12571
12572         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
12573         `span.Seconds' are just seconds, but no minutes or hours.
12574         (MainDriver): Profile the CodeGen.SaveSymbols calls.
12575
12576 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12577
12578         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
12579         Remove the gratuitous set of Final:
12580
12581                                 // If an interface implementation, then we can set Final.
12582                                 if (((flags & MethodAttributes.Abstract) == 0) &&
12583                                     implementing.DeclaringType.IsInterface)
12584                                         flags |= MethodAttributes.Final;
12585
12586         I do not know what I was smoking when I used that.
12587
12588
12589         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
12590         step into fixing the name resolution issues for delegates and
12591         unifying the toplevel name resolution.
12592
12593 2002-03-28  Martin Baulig  <martin@gnome.org>
12594
12595         * class.cs (Method.Emit): If we have a symbol writer, call its
12596         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
12597         tell it about the current method.
12598
12599         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
12600         writer that we're going to emit the first byte of IL code for a new
12601         statement (a new source line).
12602         (EmitContext.EmitTopBlock): If we have a symbol writer, call
12603         EmitContext.Mark() before emitting any code.
12604
12605         * location.cs (SymbolDocument): Return null when we're Null.
12606
12607         * statement.cs (Statement): Moved the `Location loc' variable here.
12608         (Statement.EmitBoolExpression): If we have a symbol writer, call
12609         ec.Mark() before emitting any code to tell it that we're at the
12610         beginning of a new statement.
12611         (StatementExpression): Added `Location' argument to the constructor.
12612         (Block): Added public readonly variable `StartLocation' and public
12613         variable `EndLocation'.  The latter is to be set using SetEndLocation().
12614         (Block): Added constructor which takes a start and end location.
12615         (Block.SetEndLocation): New method. This sets the end location.
12616         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
12617         local variables we create.
12618         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
12619         each statement and do also mark the begin and end of the block.
12620
12621         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
12622         tell it the current lexer.Location, use Location.Null for the end of the
12623         block.
12624         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
12625         current block, set its end location using SetEndLocation().
12626         (statement_expression): StatementExpression constructor now takes the
12627         lexer.Location as additional argument.
12628         (for_statement, declare_local_variables): Likewise.
12629         (declare_local_variables): When creating a new implicit block, use the
12630         new Block constructor and pass it the lexer.Location.
12631
12632 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
12633
12634         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
12635         members also on the parent interfaces recursively.
12636
12637 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
12638
12639         * report.cs: Use new formats, since Gonzalo finished the missing
12640         bits. 
12641
12642         * expression.cs (Binary.ResolveOperator): added missing operator|
12643         operator& and operator^ for bool/bool.
12644
12645         * cs-parser.jay: CheckDef now takes a Location argument that is
12646         used to report errors more precisly (instead of reporting the end
12647         of a definition, we try to track something which is a lot closer
12648         to the source of the problem).
12649
12650         * cs-tokenizer.cs: Track global token use, so we can properly flag
12651         the use of #define/#undef after the first token has been seen.
12652
12653         Also, rename the reportXXXX to Error_DescriptiveName
12654
12655         * decl.cs (DeclSpace.IsTopLevel): Move property here from
12656         TypeContainer, so that Enum and Interface can use this too.
12657
12658         * class.cs (TypeContainer.LookupInterfaceOrClass,
12659         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
12660         `builder' argument.  Typically this was used to pass the parent
12661         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
12662         the definition).  
12663
12664         The problem is that a nested class could trigger the definition of
12665         a toplevel class, and the builder would be obviously wrong in that
12666         case. 
12667
12668         So we drop this argument, and we compute dynamically the
12669         TypeBuilder/ModuleBuilder (the correct information was available
12670         to us anyways from DeclSpace.Parent)
12671
12672         * interface.cs (Interface.DefineInterface): Drop builder
12673         parameter cleanup like class.cs
12674
12675         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
12676         like class.cs
12677
12678         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
12679         values. 
12680
12681         (Try.Emit): Propagate the returns value from the statement.
12682
12683         (Return.Emit): Even if we are leavning 
12684
12685         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
12686
12687         * modifiers.cs: Fix the computation of MethodAttributes flags.
12688
12689 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
12690
12691         * driver.cs: allow compilation of files that start with '/'.
12692         Add a default case when checking the argument of --target.
12693
12694 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
12695
12696         * interface.cs: Implement the same search algorithm for types in
12697         the interface code.
12698
12699         * delegate.cs: Do not allow multiple definition.
12700
12701         * Recovered ChangeLog that got accidentally amputated
12702
12703         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
12704
12705         * rootcontext.cs: Load manually enum to allow core classes to
12706         contain enumerations.
12707
12708         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
12709         Update to new static methods in TypeManager.
12710
12711         * typemanager.cs (GetMethod, GetConstructor): Use our
12712         implementation of FindMembers to find the members, since during
12713         corlib compilation, the types are TypeBuilders and GetMethod and
12714         GetConstructor do not work.
12715
12716         Make all methods in TypeManager static.
12717
12718         (InitCodeHelpers): Split the functionality from
12719         the InitCodeTypes function.
12720
12721         * driver.cs: Call InitCodeHelpers after we have populated the
12722         types. 
12723
12724         * cs-parser.jay (delegate_declaration): we did not used to compute
12725         the delegate name correctly for void delegates.
12726
12727 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
12728
12729         * rootcontext.cs (RootContext): Init the interface_resolve_order
12730         and type_container_resolve_order always.
12731
12732         (ResolveCore, BootstrapCorlib_ResolveClass,
12733         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
12734         compiler when compiling with --nostdlib
12735
12736         * class.cs (TypeContainer.DefineType): Check that our parent is
12737         not null.  This test is most important when we are bootstraping
12738         the core types.
12739
12740         * codegen.cs: Split out the symbol writing code.
12741
12742 2002-03-25  Martin Baulig  <martin@gnome.org>
12743
12744         * driver.cs (-g): Made -g an alias for --debug.
12745
12746 2002-03-24  Martin Baulig  <martin@gnome.org>
12747
12748         * codegen.cs (SymbolWriter): New public variable. Returns the
12749         current symbol writer.
12750         (CodeGen): Added `bool want_debugging_support' argument to the
12751          constructor. If true, tell the ModuleBuild that we want debugging
12752         support and ask it for the ISymbolWriter.
12753         (Save): If we have a symbol writer, call it's Close() method after
12754         saving the assembly.
12755
12756         * driver.c (--debug): New command line argument to create a
12757         debugger information file.
12758
12759         * location.cs (SymbolDocument): New public property. Returns an
12760         ISymbolDocumentWriter object for the current source file or null
12761         if we don't have a symbol writer.
12762
12763 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
12764
12765         * driver.cs (LoadAssembly): Correctly return when all the paths
12766         have been tried and not before.
12767
12768         * statement.cs (Switch.Emit): return the actual coverage for this
12769         statement (returns/not-returns)
12770
12771         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
12772         switch of the statement if we are the last switch section.  That
12773         kills two problems: try/catch problems (we used to emit an empty
12774         nop at the end) and switch statements where all branches would
12775         return. 
12776
12777 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
12778
12779         * driver.cs: Add default assemblies (the equivalent to the
12780         Microsoft CSC.RSP file)
12781
12782         * cs-tokenizer.cs: When updating `cols and setting it to zero,
12783         also update tokens_seen and set it to false.
12784
12785         * driver.cs: Implement --recurse for Mike.
12786
12787         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
12788         correctly splitting out the paths.
12789
12790 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
12791
12792         * interface.cs (Interface.PopulateProperty): Instead of using
12793         `parent' as the declaration space for the set parameters, use
12794         `this' 
12795
12796         * support.cs (InternalParameters): InternalParameters constructor
12797         takes a DeclSpace instead of a TypeContainer.
12798
12799         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
12800         types are being initialized, load the address of it before calling
12801         the function.  
12802
12803         (New): Provide a mechanism to disable the generation of local
12804         value type temporaries when the caller will be providing us with
12805         an address to store it.
12806
12807         (ArrayCreation.EmitDynamicInitializers): Use it.
12808
12809 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
12810
12811         * expression.cs (Invocation.EmitArguments): Only probe for array
12812         property if there is more than one argument.  Sorry about that.
12813
12814         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
12815         empty param arrays.
12816
12817         * class.cs (Method.LabelParameters): Fix incorrect code path that
12818         prevented the `ParamArrayAttribute' from being applied to the
12819         params attribute.
12820
12821 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12822
12823         * support.cs (ReflectionParameters): Correctly compute whether the
12824         last argument is a params array.  Fixes the problem with
12825         string.Split ('a')
12826
12827         * typemanager.cs: Make the assemblies array always be non-null
12828         (empty, but non-null)
12829
12830         * tree.cs (RecordDecl): New function that abstracts the recording
12831         of names.  This reports error 101, and provides a pointer to the
12832         previous declaration.  Fixes a crash in the compiler.
12833
12834         * cs-parser.jay (constructor_declaration): Update to new grammar,
12835         and provide a constructor_body that can be empty.
12836
12837 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12838
12839         * driver.cs: Add support for --resources.
12840
12841         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12842         Make all types for the various array helper methods be integer.
12843
12844         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12845         CheckState to ConvCast.
12846
12847         (ConvCast): Now it takes a `checked' state argument, to avoid
12848         depending on the emit context for the conversion, and just using
12849         the resolve time setting.
12850
12851         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12852         instead of Invocation.EmitArguments.  We do not emit the original
12853         arguments, instead we emit those which have been converted to
12854         unsigned int expressions.
12855
12856         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12857
12858         * codegen.cs: ditto.
12859
12860         * expression.cs (LocalVariableReference): Drop the use of the
12861         Store function that depended on the variable index.
12862
12863         * statement.cs (VariableInfo): Drop the `Idx' property from this
12864         class, as this is not taking into account the indexes for
12865         temporaries tat we generate during the execution, getting the
12866         indexes wrong.
12867
12868         * class.cs: First emit class initializers, then call the parent
12869         constructor. 
12870
12871         * expression.cs (Binary): Fix opcode emision.
12872         (UnaryMutator.EmitCode): Support checked code generation
12873
12874         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12875         matches for events for both the Static and Instance scans,
12876         pointing to the same element.   Fix that.
12877
12878 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12879
12880         * rootcontext.cs (ResolveTree): Always set the
12881         interface_resolve_order, because nested interfaces will be calling
12882         into us.
12883
12884         * class.cs (GetInterfaceOrClass): Track the same resolution
12885         process used by TypeManager.LookupType.  This fixes the nested
12886         type lookups in class declarations (separate path from
12887         LookupType). 
12888
12889         (TypeContainer.DefineType): Also define nested interfaces.
12890         (TypeContainer.RegisterOrder): New public function used to
12891         register the order in which child interfaces need to be closed.
12892
12893         Nested interfaces need to be closed after their parents have been
12894         created. 
12895
12896         * interface.cs (InterfaceAttr): Put all the logic for computing
12897         the interface attribute here. 
12898
12899         (DefineInterface): Register our interface order with the
12900         RootContext or with the TypeContainer depending on the case.
12901
12902 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12903
12904         * cs-parser.jay: rework foreach statement to work with the new
12905         changes to the policy on SimpleNames.
12906
12907         * report.cs: support Stacktrace on warnings as well.
12908
12909         * makefile: drop --unsafe and /unsafe from the compile.
12910
12911 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12912
12913         * ecore.cs (StandardConversionExists): Modify to take an Expression
12914         as the first parameter. Ensure we do null -> reference type conversion
12915         checking.
12916
12917         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12918         temporary Expression objects.
12919
12920 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12921
12922         * interface.cs: workaround bug in method overloading resolution
12923         (there is already a bugzilla bug for it).
12924
12925 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12926
12927         We could also solve this problem by having a separate path for
12928         performing type lookups, instead of DoResolve, we could have a
12929         ResolveType entry point, and only participating pieces of the
12930         production (simplename, deref, array) would implement this. 
12931
12932         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12933         signal SimpleName to only resolve type names and not attempt to
12934         resolve anything else.
12935
12936         * expression.cs (Cast): Set the flag.
12937
12938         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12939
12940         * class.cs: Only report 108 if there is no `new' modifier.
12941
12942         * cs-parser.jay: rework foreach statement to work with the new
12943         changes to the policy on SimpleNames.
12944
12945         * report.cs: support Stacktrace on warnings as well.
12946
12947         * makefile: drop --unsafe and /unsafe from the compile.
12948
12949 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12950
12951         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12952         lookups here, instead of doing that at parse time.  This means
12953         that our grammar will not introduce `LocalVariableReferences' as
12954         expressions at this point.  That solves the problem of code like
12955         this:
12956
12957         class X {
12958            static void Main ()
12959            { int X = 1;
12960             { X x = null }}}
12961
12962         This is only half the fix.  The full fix requires parameters to
12963         also be handled in this way.
12964
12965         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12966         makes the use more obvious of the DeclSpace.  The
12967         ec.TypeContainer.TypeBuilder is now only used to pull the
12968         TypeBuilder for it.
12969
12970         My theory is that I can get rid of the TypeBuilder completely from
12971         the EmitContext, and have typecasts where it is used (from
12972         DeclSpace to where it matters).  
12973
12974         The only pending problem is that the code that implements Aliases
12975         is on TypeContainer, and probably should go in DeclSpace.
12976
12977         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12978         lookups here, instead of doing that at parse time.  This means
12979         that our grammar will not introduce `LocalVariableReferences' as
12980         expressions at this point.  That solves the problem of code like
12981         this:
12982
12983         class X {
12984            static void Main ()
12985            { int X = 1;
12986             { X x = null }}}
12987
12988         This is only half the fix.  The full fix requires parameters to
12989         also be handled in this way.
12990
12991         * class.cs (Property.DefineMethod): When implementing an interface
12992         method, set newslot, when implementing an abstract method, do not
12993         set the flag (before we tried never setting it, or always setting
12994         it, which is the difference).
12995         (Indexer.DefineMethod): same.
12996         (Method.DefineMethod): same.
12997
12998         * ecore.cs: Only set the status used flag if we get back a Field.
12999
13000         * attribute.cs: Temporary hack, so Paolo can keep working.
13001
13002 2002-03-08  Ravi Pratap  <ravi@ximian.com>
13003
13004         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
13005         the unmanaged type in the case we have a MarshalAs attribute.
13006
13007         (Resolve): Handle the case when we are parsing the special MarshalAs
13008         attribute [we need to store the unmanaged type to use later]
13009
13010         * typemanager.cs (marshal_as_attr_type): Built in type for the 
13011         MarshalAs Attribute.
13012
13013         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
13014         on parameters and accordingly set the marshalling info.
13015
13016 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
13017
13018         * class.cs: Optimizing slightly by removing redundant code after
13019         we switched to the `NoTypes' return value.
13020         (Property.DefineMethod): use NoTypes here too.
13021
13022         This fixes the bug I introduced in my last batch of changes.
13023
13024 2002-03-05  Ravi Pratap  <ravi@ximian.com>
13025
13026         * tree.cs (RecordEnum): Add. We now keep track of enums too.
13027
13028         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
13029         Enums since those are types too. 
13030
13031         * cs-parser.jay (enum_declaration): Record enums as we parse them.
13032
13033         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
13034         thanks to a call during the lookup process.
13035
13036 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
13037
13038         * statement.cs (Foreach): Lots of work to accomodate a particular
13039         kind of foreach statement that I had not kept in mind.  It is
13040         possible to have foreachs on classes that provide a GetEnumerator
13041         method that return objects that implement the "pattern" for using
13042         a foreach, there is no need to support GetEnumerator
13043         specifically. 
13044
13045         This is needed to compile nant.
13046
13047         * decl.cs: Only report 114 if the member is not `Finalize' and if
13048         the warning level is at least 2.
13049
13050         * class.cs: Moved the compare function from Method to
13051         MethodSignature. 
13052
13053         (MethodSignature.InheritableMemberSignatureCompare): Add new
13054         filter function that is used to extract inheritable methods from a
13055         class. 
13056
13057         (Method.Define): Use the new `inheritable_method_signature_filter'
13058         delegate
13059
13060         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
13061         command. 
13062
13063 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
13064
13065         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
13066
13067         * cs-parser.jay: Add opt_semicolon to the interface declaration.
13068
13069         * expression.cs: Pass location information to
13070         ConvertImplicitStandard. 
13071
13072         * class.cs: Added debugging code to track return values from
13073         interfaces. 
13074
13075 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
13076
13077         * expression.cs (Is.DoResolve): If either side of the `is' is an
13078         interface, do not flag the warning.
13079
13080         * ecore.cs (ImplicitReferenceConversion): We need a separate test
13081         for interfaces
13082
13083         * report.cs: Allow for --fatal to be used with --probe.
13084
13085         * typemanager.cs (NoTypes): Move the definition for the empty Type
13086         array here. 
13087
13088         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
13089         properties. 
13090         (TypeContainer.DefineProxy): New function used to proxy to parent
13091         implementations when implementing interfaces.
13092         (TypeContainer.ParentImplements): used to lookup if our parent
13093         implements a public function that is required by an interface.
13094         (TypeContainer.VerifyPendingMethods): Hook this up.
13095
13096         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
13097         `modules' and `assemblies' arraylists into arrays.  We only grow
13098         these are the very early start up of the program, so this improves
13099         the speedof LookupType (nicely measured).
13100
13101         * expression.cs (MakeByteBlob): Replaced unsafe code with
13102         BitConverter, as suggested by Paolo.
13103
13104         * cfold.cs (ConstantFold.Binary): Special case: perform constant
13105         folding of string concatenation, but if either side is a string,
13106         and the other is not, then return null, and let the runtime use
13107         the concatenation on the string plus the object (using
13108         `Object.ToString'). 
13109
13110 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
13111
13112         Constant Folding has been implemented now.
13113
13114         * expression.cs (Unary.Reduce): Do not throw an exception, catch
13115         the error instead on types that are not supported in one's
13116         complement. 
13117
13118         * constant.cs (Constant and all children): New set of functions to
13119         perform implict and explicit conversions.
13120
13121         * ecore.cs (EnumConstant): Implement the new functions to perform
13122         conversion by proxying to the child expression.
13123
13124         * codegen.cs: (ConstantCheckState): Constant evaluation has its
13125         own separate setting that can not be turned off from the command
13126         line using --unchecked or --checked and is only controlled using
13127         the checked/unchecked statements and expressions.  This setting is
13128         used by the constant folder to flag errors.
13129
13130         * expression.cs (CheckedExpr, UncheckedExpr): Set the
13131         ConstantCheckState as well.   
13132
13133         During Resolve, they also have to flag the state, because the
13134         constant folder runs completely in the Resolve phase.
13135
13136         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
13137         well.
13138
13139 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
13140
13141         * cfold.cs: New file, this file contains the constant folder.
13142
13143         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
13144         argument to track whether we are using the resulting address to
13145         load or store a value and provide better error messages. 
13146
13147         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
13148         new AddressOf arguments.
13149
13150         * statement.cs (Foreach.EmitCollectionForeach): Update
13151
13152         * expression.cs (Argument.Emit): Call AddressOf with proper
13153         arguments to track usage.
13154
13155         (New.DoEmit): Call AddressOf with new arguments.
13156
13157         (Unary.Emit): Adjust AddressOf call.
13158
13159 2002-03-01  Ravi Pratap  <ravi@ximian.com>
13160
13161         * cs-parser.jay (member_access): Change the case for pre-defined types
13162         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
13163         this suggestion.
13164
13165         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
13166         a method body.
13167
13168         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
13169         essentially like methods and apply attributes like MethodImplOptions to them too.
13170
13171         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
13172         not being null.
13173
13174         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
13175         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
13176         is the DeclSpace.
13177
13178         * Update code everywhere accordingly.
13179
13180         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
13181
13182         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
13183
13184 2002-02-28  Ravi Pratap  <ravi@ximian.com>
13185
13186         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
13187         try performing lookups against those instead of jumping straight into using
13188         the 'using' clauses.
13189
13190         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
13191
13192         (LookupType): Perform lookups in implicit parents too.
13193
13194         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
13195         sequence as RootContext.LookupType. 
13196
13197         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
13198         the various cases of namespace lookups into this method.
13199
13200 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
13201
13202         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
13203         in positional arguments)
13204
13205         * class.cs (Operator): Update the AllowedModifiers to contain
13206         extern. 
13207
13208         * cs-parser.jay: Update operator declaration to allow for the
13209         operator body to be empty.
13210
13211         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
13212         values. 
13213
13214 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
13215
13216         * class.cs (Method.Emit): Label parameters.
13217
13218         * driver.cs: Return 1 or 0 as the program exit code.
13219
13220 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
13221
13222         * expression.cs: Special case the `null' object when trying to
13223         auto-compute the type, as anything can be explicitly converted to
13224         that. 
13225
13226         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
13227         spotting this Paolo.
13228
13229         (Expression.ImplicitNumericConversion): Perform comparissions of
13230         the type using the underlying type in the case of an enumeration
13231         rather than using the enumeration type for the compare.
13232
13233         Cope with the underlying == type case, which is not possible to
13234         catch before. 
13235
13236         (Expression.ConvertNumericExplicit): Perform comparissions of
13237         the type using the underlying type in the case of an enumeration
13238         rather than using the enumeration type for the compare.
13239
13240         * driver.cs: If the user does not supply an extension, assume .exe
13241
13242         * cs-parser.jay (if_statement): Rewrote so that we can track the
13243         location for the if statement.
13244
13245         * expression.cs (Binary.ConstantFold): Only concat strings when
13246         the operation is "+", not everything ;-)
13247
13248         * statement.cs (Statement.EmitBoolExpression): Take a location
13249         argument. 
13250         (If, While, Do): Track location.
13251
13252         * expression.cs (Binary.ResolveOperator): In the object + string
13253         case, I was missing a call to ConvertImplicit
13254
13255 2002-02-25  Ravi Pratap  <ravi@ximian.com>
13256
13257         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
13258         Location arguments. Ensure we use RootContext.LookupType to do our work
13259         and not try to do a direct Type.GetType and ModuleBuilder.GetType
13260
13261         * interface.cs (PopulateMethod): Handle the type of the parameter being
13262         null gracefully.
13263
13264         * expression.cs (Invocation.BetterFunction): Handle the case when we 
13265         have a params method with no fixed arguments and a call is made with no
13266         arguments.
13267
13268 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
13269
13270         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
13271         the verbatim-string-literal
13272
13273         * support.cs (InternalParameters.ParameterModifier): handle null
13274         fixed parameters.
13275         (InternalParameters.ParameterType): ditto.
13276
13277         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
13278         duplicating the name of the variable parameter.
13279         (GetParameterByName): Fix bug where we were not looking up array
13280         paramters if they were the only present (thanks Paolo!).
13281         (GetParameterInfo): We only have an empty set of types if both
13282         fixed and array are set to null.
13283         (GetParameterInfo-idx): Handle FixedParameter == null
13284
13285         * cs-parser.jay: Handle the case where there is no catch
13286         statements (missing null test).
13287
13288 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
13289
13290         * driver.cs (MainDriver): Be conservative on our command line
13291         handling.
13292
13293         Catch DirectoryNotFoundException when calling GetFiles.
13294
13295         (SplitPathAndPattern): Used to split the input specification into
13296         a path and a pattern that we can feed to Directory.GetFiles.
13297
13298 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
13299
13300         * statement.cs (Fixed): Implement the last case of the Fixed
13301         statement (string handling).
13302
13303         * expression.cs (StringPtr): New class used to return a char * to
13304         a string;  Used by the Fixed statement.
13305
13306         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
13307
13308         * expression.cs (Binary.ResolveOperator): Remove redundant
13309         MemberLookup pn parent type.
13310         Optimize union call, we do not need a union if the types are the same.
13311         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
13312         type.
13313
13314         Specialize the use of MemberLookup everywhere, instead of using
13315         the default settings. 
13316
13317         (StackAlloc): Implement stackalloc keyword.
13318
13319         * cs-parser.jay: Add rule to parse stackalloc.
13320
13321         * driver.cs: Handle /h, /help, /?
13322
13323         * expression.cs (MakeByteBlob): Removed the hacks we had in place
13324         before we supported unsafe code.
13325
13326         * makefile: add --unsafe to the self compilation of mcs.
13327
13328 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
13329
13330         * expression.cs (PointerArithmetic): New class that is used to
13331         perform pointer arithmetic.
13332         (Binary.Resolve): Handle pointer arithmetic
13333         Handle pointer comparission.
13334         (ArrayPtr): Utility expression class that is used to take the
13335         address of an array.
13336
13337         (ElementAccess): Implement array access for pointers
13338
13339         * statement.cs (Fixed): Implement fixed statement for arrays, we
13340         are missing one more case before we are done.
13341
13342         * expression.cs (Indirection): Implement EmitAssign and set the
13343         ExprClass to Variable.  This allows pointer dereferences to be
13344         treated as variables, and to have values assigned to them.
13345
13346         * ecore.cs (Expression.StoreFromPtr): New utility function to
13347         store values dereferencing.
13348
13349 2002-02-20  Ravi Pratap  <ravi@ximian.com>
13350
13351         * expression.cs (Binary.ResolveOperator): Ensure that we are
13352         not trying to operate on a void type - this fixes the reported
13353         bug.
13354
13355         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
13356         the parent implementation is sealed.
13357
13358         * ../errors/cs0239.cs : Add.
13359
13360         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
13361
13362         * typemanager.cs (unverifiable_code_type): Corresponds to 
13363         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
13364         which have unsafe code in them.
13365
13366         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
13367         unsafe context.
13368
13369 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
13370
13371         * cs-tokenizer.cs: Add support for @"litreal strings"
13372
13373         Make tokenizer accept pre-processor directives
13374         on any column (remove the old C-like limitation). 
13375
13376         * rootcontext.cs (EmitCode): Emit any global attributes.
13377         (AddGlobalAttributes): Used to keep track of assembly attributes. 
13378
13379         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
13380
13381         * cs-parser.jay: Add support for global attributes.  
13382
13383 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
13384
13385         * expression.cs (Indirection): New helper class.  Unary will
13386         create Indirection classes to be able to implement the
13387         IMemoryLocation interface on it.
13388
13389 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
13390
13391         * cs-parser.jay (fixed_statement): reference the right statement.
13392
13393         * statement.cs (Fixed.Emit): Finish implementing the fixed
13394         statement for the &x case.
13395
13396 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
13397
13398         * class.cs (Property.Define, Method.Define): Remove newslot when
13399         `implementing'.  
13400
13401         * modifiers.cs: My use of NewSlot when `Abstract' was set was
13402         wrong.  NewSlot should only be used if the `new' keyword is present.
13403
13404         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
13405         locating our system dir.  Sorry about this.
13406
13407 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
13408
13409         * driver.cs (GetSystemDir): Compute correctly the location of our
13410         system assemblies.  I was using the compiler directory instead of
13411         the library directory.
13412
13413 2002-02-13  Ravi Pratap  <ravi@ximian.com>
13414
13415         * expression.cs (BetterFunction): Put back in what Miguel commented out
13416         since it is the correct fix. The problem is elsewhere ;-)
13417
13418         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
13419         parameters of the parms method are themselves compatible or not !
13420
13421         (StandardConversionExists): Fix very dangerous bug where we were forgetting
13422         to check that a class implements an interface before saying that an implicit
13423         conversion was allowed. Use ImplementsInterface to do the checking.
13424
13425 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
13426
13427         * class.cs (Method.Define): Track whether we are an explicit
13428         implementation or not.  And only call DefineMethodOverride if we
13429         are an explicit implementation.
13430
13431         (Property.DefineMethod): Ditto.
13432
13433 2002-02-11  Ravi Pratap  <ravi@ximian.com>
13434
13435         * expression.cs (BetterFunction): Catch hideous bug which was
13436          preventing us from detecting ambiguous calls due to implicit casts i.e
13437         cs0121.
13438
13439 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
13440
13441         * support.cs (Pair): Remove un-needed method.  I figured why I was
13442         getting the error in cs-parser.jay, the variable in a foreach loop
13443         is readonly, and the compiler does not really treat this as a variable.
13444
13445         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
13446         instead of EQUALS in grammar.  
13447
13448         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
13449
13450         * expression.cs (Unary.DoResolve): Check whether the argument is
13451         managed or not.
13452
13453 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
13454
13455         * support.cs: Api for Pair to set a value.  Despite the fact that
13456         the variables are public the MS C# compiler refuses to compile
13457         code that accesses the field if the variable is part of a foreach
13458         statement. 
13459
13460         * statement.cs (Fixed): Begin implementation of the fixed
13461         statement.
13462
13463         (Block.AddVariable): Return the VariableInfo on success and null
13464         on failure instead of true/false. 
13465
13466         * cs-parser.jay (foreach): Catch errors on variables already
13467         defined (we were ignoring this value before) and properly unwind
13468         the block hierarchy
13469
13470         (fixed_statement): grammar for the fixed statement.
13471
13472 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
13473
13474         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
13475         pointer types to be incretemented.
13476
13477         (SizeOf): Implement.
13478
13479         * cs-parser.jay (pointer_member_access): Implement
13480         expr->IDENTIFIER production.
13481
13482         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
13483         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
13484         on safe contexts.
13485
13486         (Unary): Implement indirection.
13487
13488         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
13489         use in non-unsafe context).
13490
13491         (SimpleName.DoResolve): Check for pointers in field access on safe
13492         contexts. 
13493
13494         (Expression.LoadFromPtr): Factor the load-indirect code in this
13495         function.  This was duplicated in UnboxCast and ParameterReference
13496
13497 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
13498
13499         * expression.cs (ComposedCast): report an error if a pointer cast
13500         is used in a safe region.
13501
13502         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
13503         pointer type casts in unsafe context.
13504
13505         * codegen.cs (EmitContext): Set up IsUnsafe.
13506
13507         * cs-parser.jay (non_expression_type): Add productions for pointer
13508         casts. 
13509
13510         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
13511         code.  We should not use force into static mode if the method is
13512         not virtual.  Fixes bug in MIS
13513
13514         * statement.cs (Do.Emit, While.Emit, For.Emit,
13515         Statement.EmitBoolExpression): Add support to Do and While to
13516         propagate infinite loop as `I do return' semantics.
13517
13518         Improve the For case to also test for boolean constants.
13519
13520         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
13521         to the list of attributes we can add.
13522
13523         Remove `EmitContext' argument.
13524
13525         * class.cs (Method.Define): Apply parameter attributes.
13526         (Constructor.Define): Apply parameter attributes.
13527         (MethodCore.LabelParameters): Move here the core of labeling
13528         parameters. 
13529
13530         * support.cs (ReflectionParameters.ParameterModifier,
13531         InternalParameters.ParameterModifier): Use IsByRef on the type and
13532         only return the OUT bit for these parameters instead of in/out/ref
13533         flags.
13534
13535         This is because I miss-understood things.  The ParameterInfo.IsIn
13536         and IsOut represent whether the parameter has the [In] and [Out]
13537         attributes set.  
13538
13539 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
13540
13541         * ecore.cs (FieldExpr.Emit): Release temporaries.
13542
13543         * assign.cs (LocalTemporary.Release): new function.
13544
13545         * codegen.cs (EmitContext.GetTemporaryStorage,
13546         EmitContext.FreeTemporaryStorage): Rework the way we deal with
13547         temporary storage.  Now we can "put back" localbuilders when we
13548         are done with them
13549
13550 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
13551
13552         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
13553         need to make a copy of the variable to generate verifiable code.
13554
13555 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
13556
13557         * driver.cs: Compute dynamically the system directory.
13558
13559         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
13560         Slower, but more generally useful.  Used by the abstract
13561         registering implementation. 
13562
13563         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
13564         the rules for the special rule on Type/instances.  First check if
13565         we have the same name, and if so, try that special static path
13566         rather than the instance path.
13567
13568 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
13569
13570         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
13571         for, while and if.
13572
13573         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
13574         Enum, ValueType, Delegate or Array for non-corlib compiles.
13575
13576         * cs-tokenizer.cs: Catch long identifiers (645)
13577
13578         * typemanager.cs (IndexerPropetyName): Ravi never tested this
13579         piece of code.
13580
13581         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
13582         fix, we were returning too early, so we were not registering
13583         pending methods from abstract classes.
13584
13585         Do not register pending methods if the class is abstract.
13586
13587         * expression.cs (Conditional.DoResolve): Report circular implicit
13588         conversions when we neecd to compute it for conditional
13589         expressions. 
13590
13591         (Is.DoResolve): If the expression is always of the provided type,
13592         flag warning 183.  If the expression can not ever be of the
13593         provided type flag warning 184.
13594
13595         * class.cs: Catch 169 as well.
13596
13597         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
13598         read. 
13599
13600 2002-01-18  Nick Drochak  <ndrochak@gol.com>
13601
13602         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
13603
13604 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
13605
13606         * interface.cs: (PopulateMethod): Check for pointers being defined
13607         only if the unsafe context is active.
13608         (PopulateProperty): ditto.
13609         (PopulateIndexer): ditto.
13610
13611         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
13612         specified.  If pointers are present, make sure that they are
13613         present in an unsafe context.
13614         (Constructor, Constructor.Define): ditto.
13615         (Field, Field.Define): ditto.
13616         (Property, Property.Define): ditto.
13617         (Event, Event.Define): ditto.
13618
13619         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
13620         hashtable if there are classes or structs defined.
13621
13622         * expression.cs (LocalVariableReference.DoResolve): Simplify this
13623         code, as the constant resolution moved.
13624
13625         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
13626         the metadata, so we can flag error 133. 
13627
13628         * decl.cs (MemberCore.UnsafeOK): New function to test that a
13629         pointer is being declared in an unsafe context.
13630
13631 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
13632
13633         * modifiers.cs (Modifiers.Check): Require a Location argument.
13634         Report error 227 for Unsafe use.
13635
13636         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
13637
13638         * statement.cs (For.Emit): If the test is null, then report that
13639         we do `return', as we wont reach anything afterwards.
13640
13641         (Switch.SwitchGoverningType): Track the expression that matched
13642         the conversion.
13643
13644         * driver.cs: Allow negative numbers as an error code to flag.
13645
13646         * cs-parser.jay: Handle 1551.
13647
13648         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
13649
13650 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13651
13652         * cs-parser.jay: Report 1518 (type declaration can only contain
13653         class, struct, interface, enum or delegate)
13654
13655         (switch_label): Report 1523 (keywords `case' or `default' must
13656         preced code)
13657
13658         (opt_switch_sections): Report 1522 (empty switch)
13659
13660         * driver.cs: Report 1515 (response file specified multiple times)
13661         Report 1516 (Source file specified multiple times).
13662
13663         * expression.cs (Argument.Resolve): Signal 1510
13664
13665         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
13666         access not allowed in static code)
13667
13668 2002-01-11  Ravi Pratap  <ravi@ximian.com>
13669
13670         * typemanager.cs (IsPointerType): Utility method which we are going
13671         to need a lot.
13672
13673         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
13674         the object type, so we take care of that.
13675
13676         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
13677
13678         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
13679         added to non-params parameters :-)
13680
13681         * typemanager.cs (CSharpName): Include 'void' type too. 
13682
13683         (void_ptr_type): Include in the set of core types.
13684
13685         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
13686         duplicating code.
13687
13688         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
13689         an unsafe context.
13690
13691         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
13692         completely forgotten about it.
13693
13694 2002-01-10  Ravi Pratap  <ravi@ximian.com>
13695
13696         * cs-parser.jay (pointer_type): Add. This begins our implementation
13697         of parsing rules for unsafe code.
13698
13699         (unsafe_statement): Implement.
13700
13701         (embedded_statement): Modify to include the above.
13702
13703         * statement.cs (Unsafe): Implement new class for unsafe blocks.
13704
13705         * codegen.cs (EmitContext.InUnsafe): Add. This determines
13706         if the current context is an unsafe one.
13707
13708         * cs-parser.jay (local_variable_pointer_type): Since local variable types
13709         are handled differently, we need separate rules for them.
13710
13711         (local_variable_declaration): Update to use local_variable_pointer_type
13712         to allow variable declarations of unmanaged pointer types.
13713
13714         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
13715         in unsafe contexts.
13716
13717         * ../errors/cs0214.cs : Add.
13718
13719 2002-01-16  Nick Drochak  <ndrochak@gol.com>
13720
13721         * makefile: remove 'response' file when cleaning.
13722
13723 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
13724
13725         * cs-parser.jay: Report 1524.
13726
13727 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
13728
13729         * typemanager.cs (RegisterMethod): drop checking if we have
13730         registered this from here
13731
13732 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
13733
13734         * class.cs (Method.EmitDestructor): Implement calling our base
13735         destructor. 
13736
13737         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
13738         value of InFinally.
13739
13740         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
13741         this routine and will wrap the call in a try/catch block.  Deal
13742         with the case.
13743
13744 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
13745
13746         * ecore.cs (Expression.MemberLookup): instead of taking a
13747         parameter `same_type' that was used to tell whether we could
13748         access private members we compute our containing type from the
13749         EmitContext.
13750
13751         (FieldExpr): Added partial support for volatile fields.  This does
13752         not work for volatile fields exposed from assemblies, as I can not
13753         figure out how to extract the modreq from it.
13754
13755         Updated all the source files to use this.
13756
13757         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
13758         because it is referenced by MemberLookup very often. 
13759
13760 2002-01-09  Ravi Pratap  <ravi@ximian.com>
13761
13762         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
13763         TypeBuilder.GetCustomAttributes to retrieve what we need.
13764
13765         Get rid of redundant default_member_attr_type as this is the same as
13766         default_member_type which already exists.
13767
13768         * interface.cs, attribute.cs : Update accordingly.
13769
13770 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
13771
13772         * typemanager.cs: Enable IndexerPropertyName again.  It does not
13773         work for TYpeBuilders though.  Ravi, can you please fix this?
13774
13775         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
13776
13777         * expression.cs (Argument.Emit): Handle the case of ref objects
13778         being passed to ref functions;  
13779
13780         (ParameterReference.EmitLoad): Loads the content of the pointer
13781         without dereferencing.
13782
13783 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13784
13785         * cs-tokenizer.cs: Implemented the pre-processing expressions.
13786
13787 2002-01-08  Ravi Pratap  <ravi@ximian.com>
13788
13789         * class.cs (Indexer.DefineMethod): Incorporate the interface
13790         type in the name of the method if we are doing explicit interface
13791         implementation.
13792
13793         * expression.cs (ConversionExists): Remove as it is completely obsolete.
13794
13795         (BetterConversion): Fix extremely trivial bug where we were referring to
13796         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
13797         again !
13798
13799         * ../errors/bug16.cs : Add although we have fixed it.
13800
13801 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
13802
13803         * expression.cs (BaseIndexer): Begin implementation.
13804
13805         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
13806
13807         * cs-parser.jay (indexer_declarator): Use qualified_identifier
13808         production directly to remove a shift/reduce, and implement
13809         explicit interface implementation.
13810
13811         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
13812         after a floating point suffix.
13813
13814         * expression.cs (DoNumericPromotions): Improved the conversion for
13815         uint/uint.  If we have a constant, we avoid doing a typecast to a
13816         larger type.
13817
13818         * class.cs (Indexer): Implement explicit interface implementation
13819         for indexers.
13820
13821 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13822
13823         * class.cs: make the default instance constructor public and hidebysig.
13824
13825 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13826
13827         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13828         so we can call it from elsewhere.
13829
13830         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13831         we emit it internally if the class has a defined indexer; otherwise the user
13832         emits it by decorating the class definition with the DefaultMemberAttribute.
13833
13834         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13835         attribute is not used on a type which defines an indexer.
13836
13837         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13838         character when we skip whitespace.
13839
13840         * ../errors/cs0646.cs : Add.
13841
13842 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13843
13844         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13845         again. 
13846
13847         * makefile: Add practical target `mcs3.exe' which builds the third
13848         generation compiler. 
13849
13850         * expression.cs (New): Fix structures constructor calling.
13851
13852         * class.cs (Property, Method, Indexer): Emit Final flag on the
13853         method if we are an interface implementation and we are not
13854         abstract. 
13855
13856         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13857         whether this property is referencing a `base' method.
13858
13859         * expression.cs (Invocation.EmitCall): take an extra argument:
13860         is_base, this is used to determine whether the `call' or
13861         `callvirt' opcode should be used.
13862
13863
13864         * delegate.cs: update EmitCall.
13865
13866         * class.cs (Method.Define): Set NewSlot for the cases where we are
13867         not implementing an interface method.
13868
13869         (Property.Define): ditto.
13870
13871 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13872
13873         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13874         'r'.  Allows mcs to parse itself fully.
13875
13876 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13877
13878         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13879         of the number of initializers that require the InitializeArray method.
13880
13881         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13882         update the above field where necessary.
13883
13884         (MakeByteBlob): Update accordingly.
13885
13886         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13887         greater than 2.
13888
13889         (EmitDynamicInitializers): Update in accordance with the new optimization.
13890
13891         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13892         same OpCode applies.
13893
13894         * cs-parser.jay : Fix some glaring errors I introduced.
13895
13896 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13897
13898         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13899         so that we can check for name clashes there too.
13900
13901         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13902         for interface indexers.
13903
13904         * interfaces.cs (Define): Emit the default member attribute.
13905
13906         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13907         variable was being referred to while setting the value ;-)
13908
13909 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13910
13911         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13912         byte-by-byte information when we know the data is zero.
13913
13914         Make the block always a multiple of 4, because
13915         DefineInitializedData has a bug.
13916
13917         * assign.cs: Fix, we should assign from the temporary, not from
13918         the source. 
13919
13920         * expression.cs (MakeByteBlob): Fix my incorrect code.
13921
13922 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13923
13924         * typemanager.cs (EnumToUnderlying): This function is used to get
13925         the underlying type from an enumeration, because it does not
13926         always work. 
13927
13928         * constant.cs: Use the I4_S form for values between -128 and 127.
13929
13930         * statement.cs (Block.LookupLabel): Looks up a label.
13931         (Block): Drop support for labeled blocks.
13932
13933         (LabeledStatement): New kind of statement that represents a label
13934         only.
13935
13936         (Goto): Finally implement this bad boy.
13937
13938         * cs-parser.jay: Update to reflect new mechanism to implement
13939         labels.
13940
13941 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13942
13943         * codegen.cs (EmitContext.This): a codegen property that keeps the
13944         a single instance of this instead of creating many different this
13945         instances. 
13946
13947         * delegate.cs (Delegate.DoResolve): Update to use the property;
13948
13949         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13950
13951         * expression.cs (BaseAccess.DoResolve): Ditto.
13952
13953 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13954
13955         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13956         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13957
13958         (InitCoreTypes): Update accordingly.
13959
13960         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13961         so we can quickly store the state.
13962
13963         (ApplyAttributes): Set the correct implementation flags
13964         for InternalCall methods.
13965
13966 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13967
13968         * expression.cs (EmitCall): if a method is not virtual, then do
13969         not use callvirt on it.
13970
13971         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13972         user defined stuff) requires the use of stobj, which takes an
13973         address on the stack instead of an array and an index.  So emit
13974         the Ldelema operation for it.
13975
13976         (EmitStoreOpcode): Use stobj for valuetypes.
13977
13978         (UnaryMutator.EmitCode): Use the right 1 value depending on
13979         whether we are dealing with int64/uint64, float or doubles.
13980
13981         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13982         constructors that I implemented last night.
13983
13984         (Constructor.IsDefault): Fix to work properly for static
13985         constructors.
13986
13987         * cs-parser.jay (CheckDef): report method signature errors.
13988         Update error number 103 to be 132.
13989
13990         * decl.cs: New AdditionResult enumeration value: MethodExists.
13991         Although we do this check for methods later on in the semantic
13992         analysis, catching repeated default constructors is so easy that
13993         we catch these here. 
13994
13995         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13996         promotions code.
13997
13998         (ParameterReference.EmitAssign, Emit): handle
13999         bools as bytes.
14000
14001         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
14002         (ArrayAccess.EmitStoreOpcode): ditto.
14003
14004         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
14005
14006         * expression.cs (MakeByteBlob): Complete all the missing types
14007         (uint, short, ushort, byte, sbyte)
14008
14009         * class.cs: Only init instance field initializers on instance
14010         constructors. 
14011
14012         Rename `constructors' to instance_constructors. 
14013
14014         (TypeContainer.AddConstructor): Only add constructors to the list
14015         if it is not static.
14016
14017         Make sure that we handle default_static_constructor independently
14018         everywhere where we handle instance_constructors
14019
14020 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
14021
14022         * class.cs: Do not lookup or create a base initializer for a
14023         static constructor.
14024
14025         (ConstructorInitializer.Resolve): use the proper type to lookup
14026         for constructors.
14027
14028         * cs-parser.jay: Report error 1585 (modifiers between type and name).
14029
14030         * enum.cs, interface.cs: Remove CloseType, this is taken care by
14031         in DeclSpace. 
14032
14033         * decl.cs: CloseType is now an virtual method, the default
14034         implementation just closes this type.
14035
14036 2001-12-28  Ravi Pratap  <ravi@ximian.com>
14037
14038         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
14039         to PreserveSig by default. Also emit HideBySig on such methods.
14040
14041         Basically, set the defaults to standard values.
14042
14043         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
14044         argument, if candidate is better, it can't be worse than the best !
14045
14046         (Invocation): Re-write bits to differentiate between methods being
14047         applicable in their expanded form and their normal form - for params
14048         methods of course.
14049
14050         Get rid of use_standard everywhere as only standard conversions are allowed
14051         in overload resolution. 
14052
14053         More spec conformance.
14054
14055 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
14056
14057         * driver.cs: Add --timestamp, to see where the compiler spends
14058         most of its time.
14059
14060         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
14061         `this' in static code.
14062
14063         (SimpleName.DoResolve): Implement in terms of a helper function
14064         that allows static-references to be passed upstream to
14065         MemberAccess.
14066
14067         (Expression.ResolveWithSimpleName): Resolve specially simple
14068         names when called by MemberAccess to implement the special
14069         semantics. 
14070
14071         (Expression.ImplicitReferenceConversion): Handle conversions from
14072         Null to reference types before others, as Null's type is
14073         System.Object. 
14074
14075         * expression.cs (Invocation.EmitCall): Handle the special case of
14076         calling methods declared on a reference type from a ValueType
14077         (Base classes System.Object and System.Enum)
14078
14079         (MemberAccess.Resolve): Only perform lookups on Enumerations if
14080         the left hand side is a TypeExpr, not on every enumeration. 
14081
14082         (Binary.Resolve): If types are reference types, then do a cast to
14083         object on operators != and == of both arguments.
14084
14085         * typemanager.cs (FindMembers): Extract instance and static
14086         members if requested.
14087
14088         * interface.cs (PopulateProperty): Use void_type instead of null
14089         as the return type for the setter method.
14090
14091         (PopulateIndexer): ditto.
14092
14093 2001-12-27  Ravi Pratap  <ravi@ximian.com>
14094
14095         * support.cs (ReflectionParameters): Fix minor bug where we
14096         were examining the wrong parameter for the ParamArray attribute.
14097
14098         Cope with requests for the type of the parameter at position
14099         greater than the params parameter's. We now return the element
14100         type of the params array as that makes more sense.
14101
14102         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
14103         accordingly as we no longer have to extract the element type
14104         ourselves.
14105
14106         (Invocation.OverloadResolve): Update.
14107
14108 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
14109
14110         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
14111         against IEnumerator, test whether the return value is a descendant
14112         of the IEnumerator interface.
14113
14114         * class.cs (Indexer.Define): Use an auxiliary method to implement
14115         the other bits of the method definition.  Begin support for
14116         explicit interface implementation.
14117
14118         (Property.DefineMethod): Use TypeManager.void_type instead of null
14119         for an empty return value.
14120
14121 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
14122
14123         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
14124         dealing with a FieldExpr which is composed of a FieldBuilder, in
14125         the code path we did extract the constant, but we should have
14126         obtained the underlying value to be able to cast it (otherwise we
14127         end up in an infinite loop, this is what Ravi was running into).
14128
14129         (ArrayCreation.UpdateIndices): Arrays might be empty.
14130
14131         (MemberAccess.ResolveMemberAccess): Add support for section
14132         14.5.4.1 that deals with the special case of E.I when E is a type
14133         and something else, that I can be a reference to a static member.
14134
14135         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
14136         handle a particular array type to create byte blobs, it is just
14137         something we dont generate byteblobs for.
14138
14139         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
14140         arguments. 
14141
14142         * location.cs (Push): remove the key from the hashtable that we
14143         are about to add.   This happens for empty files.
14144
14145         * driver.cs: Dispose files after we have parsed them.
14146
14147         (tokenize): new function that only runs the tokenizer on its
14148         input, for speed testing.
14149
14150 2001-12-26  Ravi Pratap  <ravi@ximian.com>
14151
14152         * class.cs (Event.Define): Define the private field only if there
14153         are no accessors defined.
14154
14155         * expression.cs (ResolveMemberAccess): If there is no associated
14156         field with the event, that means we have an event defined with its
14157         own accessors and we should flag error cs0070 since transforming
14158         ourselves into a field is not valid in that case.
14159
14160         * ecore.cs (SimpleName.DoResolve): Same as above.
14161
14162         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
14163         and charset to sane values.
14164
14165 2001-12-25  Ravi Pratap  <ravi@ximian.com>
14166
14167         * assign.cs (DoResolve): Perform check on events only if they 
14168         are being accessed outside the declaring type.
14169
14170         * cs-parser.jay (event_declarations): Update rules to correctly
14171         set the type of the implicit parameter etc.
14172
14173         (add_accessor, remove_accessor): Set current local parameters.
14174
14175         * expression.cs (Binary): For delegate addition and subtraction,
14176         cast the return value from the method into the appropriate delegate
14177         type.
14178
14179 2001-12-24  Ravi Pratap  <ravi@ximian.com>
14180
14181         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
14182         of these as the workaround is unnecessary.
14183
14184         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
14185         delegate data - none of that is needed at all.
14186
14187         Re-write bits to extract the instance expression and the delegate method
14188         correctly.
14189
14190         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
14191         on delegates too.
14192
14193         * attribute.cs (ApplyAttributes): New method to take care of common tasks
14194         of attaching attributes instead of duplicating code everywhere.
14195
14196         * everywhere : Update code to do attribute emission using the above method.
14197
14198 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
14199
14200         * expression.cs (IsParamsMethodApplicable): if there are not
14201         parameters, return immediately.
14202
14203         * ecore.cs: The 0 literal can be implicity converted to an enum
14204         type. 
14205
14206         (SimpleName.DoResolve): First lookup the type, then lookup the
14207         members. 
14208
14209         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
14210         want to get its address.  If the InstanceExpression is not
14211         addressable, store the result in a temporary variable, then get
14212         the address of it.
14213
14214         * codegen.cs: Only display 219 errors on warning level or above. 
14215
14216         * expression.cs (ArrayAccess): Make it implement the
14217         IMemoryLocation interface.
14218
14219         (Binary.DoResolve): handle the operator == (object a, object b)
14220         and operator != (object a, object b) without incurring into a
14221         BoxedCast (because 5 != o should never be performed).
14222
14223         Handle binary enumerator operators.
14224
14225         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
14226         value type, otherwise use Ldelem_ref.
14227
14228         Use precomputed names;
14229
14230         (AddressOf): Implement address of
14231
14232         * cs-parser.jay (labeled_statement): Fix recursive block
14233         addition by reworking the production.
14234
14235         * expression.cs (New.DoEmit): New has a special case:
14236                 
14237                  If we are dealing with a ValueType, we have a few
14238                  situations to deal with:
14239                 
14240                     * The target of New is a ValueType variable, that is
14241                       easy, we just pass this as the variable reference
14242                 
14243                     * The target of New is being passed as an argument,
14244                       to a boxing operation or a function that takes a
14245                       ValueType.
14246                 
14247                       In this case, we need to create a temporary variable
14248                       that is the argument of New.
14249
14250
14251 2001-12-23  Ravi Pratap  <ravi@ximian.com>
14252
14253         * rootcontext.cs (LookupType): Check that current_type is not null before
14254         going about looking at nested types.
14255
14256         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
14257         not implement the IAssignMethod interface any more.
14258
14259         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
14260         where we tranform them into FieldExprs if they are being resolved from within
14261         the declaring type.
14262
14263         * ecore.cs (SimpleName.DoResolve): Do the same here.
14264
14265         * assign.cs (DoResolve, Emit): Clean up code considerably. 
14266
14267         * ../errors/bug10.cs : Add.
14268
14269         * ../errors/cs0070.cs : Add.
14270
14271         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
14272
14273         * assign.cs : Get rid of EventIsLocal everywhere.
14274
14275 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
14276
14277         * ecore.cs (ConvertIntLiteral): finished the implementation.
14278
14279         * statement.cs (SwitchLabel): Convert the value we are using as a
14280         key before looking up the table.
14281
14282 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
14283
14284         * codegen.cs (EmitTopBlock): Require a Location argument now.
14285
14286         * cs-parser.jay (constructor_declarator): We need to setup
14287         current_local_parameters before we parse the
14288         opt_constructor_initializer, to allow the variables to be bound
14289         to the constructor arguments.
14290
14291         * rootcontext.cs (LookupType): First lookup nested classes in our
14292         class and our parents before we go looking outside our class.
14293
14294         * expression.cs (ConstantFold): Extract/debox the values at the
14295         beginnning. 
14296
14297         * rootcontext.cs (EmitCode): Resolve the constants first before we
14298         resolve the types.  This is not really needed, but it helps debugging.
14299
14300         * statement.cs: report location.
14301
14302         * cs-parser.jay: pass location to throw statement.
14303
14304         * driver.cs: Small bug fix.
14305
14306         * report.cs: Updated format to be 4-zero filled digits.
14307
14308 2001-12-22  Ravi Pratap  <ravi@ximian.com>
14309
14310         * expression.cs (CheckIndices): Fix minor bug where the wrong
14311         variable was being referred to ;-)
14312
14313         (DoEmit): Do not call EmitStaticInitializers when the 
14314         underlying type is System.Object.
14315
14316 2001-12-21  Ravi Pratap  <ravi@ximian.com>
14317
14318         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
14319         and do the usual workaround for SRE.
14320
14321         * class.cs (MyEventBuilder.EventType): New member to get at the type
14322         of the event, quickly.
14323
14324         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
14325
14326         * assign.cs (Assign.DoResolve): Handle the case when the target
14327         is an EventExpr and perform the necessary checks.
14328
14329         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
14330         interface.
14331
14332         (SimpleName.MemberStaticCheck): Include check for EventExpr.
14333
14334         (EventExpr): Set the type in the constructor itself since we 
14335         are meant to be born fully resolved.
14336
14337         (EventExpr.Define): Revert code I wrote earlier.
14338                 
14339         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
14340         instance expression is null. The instance expression is a This in that case
14341         or a null, depending on whether it is a static method or not.
14342
14343         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
14344         refers to more than one method.
14345
14346         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
14347         and accordingly flag errors.
14348
14349 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
14350
14351         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
14352
14353 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
14354
14355         * location.cs (ToString): Provide useful rutine.
14356
14357 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
14358
14359         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
14360         objects, return the actual integral boxed.
14361
14362         * statement.cs (SwitchLabel): define an ILLabel for each
14363         SwitchLabel. 
14364
14365         (Switch.CheckSwitch): If the value is a Literal, extract
14366         the underlying literal.
14367
14368         Also in the unused hashtable we had, add the SwitchLabel so we can
14369         quickly look this value up.
14370
14371         * constant.cs: Implement a bunch of new constants.  Rewrite
14372         Literal based on this.  Made changes everywhere to adapt to this.
14373
14374         * expression.cs (Expression.MakeByteBlob): Optimize routine by
14375         dereferencing array only once, and also copes with enumrations.
14376
14377         bytes are two bytes wide, not one.
14378
14379         (Cast): Perform constant conversions.
14380
14381         * ecore.cs (TryImplicitIntConversion): Return literals instead of
14382         wrappers to the literals here.
14383
14384         * expression.cs (DoNumericPromotions): long literals can converted
14385         to ulong implicity (this is taken care of elsewhere, but I was
14386         missing this spot).
14387
14388         * ecore.cs (Expression.Literalize): Make the return type Literal,
14389         to improve type checking.
14390
14391         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
14392
14393 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
14394
14395         * literal.cs: Revert code from ravi that checked the bounds.  The
14396         bounds are sane by the definition of the type itself. 
14397
14398         * typemanager.cs: Fix implementation of ImplementsInterface.  We
14399         need to actually look up in our parent hierarchy for interfaces
14400         implemented. 
14401
14402         * const.cs: Use the underlying type for enumerations
14403
14404         * delegate.cs: Compute the basename for the delegate creation,
14405         that should fix the delegate test case, and restore the correct
14406         Type Lookup semantics in rootcontext
14407
14408         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
14409         referencing a nested type with the Reflection API is using the "+"
14410         sign. 
14411
14412         * cs-parser.jay: Do not require EOF token at the end.
14413
14414 2001-12-20  Ravi Pratap  <ravi@ximian.com>
14415
14416         * rootcontext.cs (LookupType): Concatenate type names with
14417         a '.' instead of a '+' The test suite passes again.
14418
14419         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
14420         field of the enumeration.
14421
14422         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
14423         the case when the member is an EventExpr.
14424
14425         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
14426         static has an associated instance expression.
14427
14428         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
14429
14430         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
14431
14432         * class.cs (Event.Define): Register event and perform appropriate checks
14433         for error #111.
14434
14435         We define the Add and Remove methods even if the use provides none because
14436         in that case, we provide default implementations ourselves.
14437
14438         Define a private field of the type of the event. This is done by the CSC compiler
14439         and we should be doing it too ;-)
14440
14441         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
14442         More methods we use in code we generate.
14443
14444         (multicast_delegate_type, delegate_type): Two separate types since the distinction
14445         is important.
14446
14447         (InitCoreTypes): Update accordingly for the above.
14448
14449         * class.cs (Event.Emit): Generate code for default accessors that we provide
14450
14451         (EmitDefaultMethod): Do the job in the above.
14452
14453         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
14454         appropriate place.
14455
14456 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
14457
14458         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
14459         builders even if we were missing one.
14460
14461         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
14462         pass the Basename as our class name instead of the Name.  The
14463         basename will be correctly composed for us.
14464
14465         * parameter.cs (Paramters): Now takes a Location argument.
14466
14467         * decl.cs (DeclSpace.LookupType): Removed convenience function and
14468         make all the code call directly LookupType in RootContext and take
14469         this chance to pass the Location information everywhere.
14470
14471         * Everywhere: pass Location information.
14472
14473 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
14474
14475         * class.cs (Constructor.Define): Updated way of detecting the
14476         length of the parameters.
14477
14478         (TypeContainer.DefineType): Use basename as the type name for
14479         nested types.
14480
14481         (TypeContainer.Define): Do not recursively define types here, as
14482         definition is taken care in order by the RootContext.
14483
14484         * tree.cs: Keep track of namespaces in a per-file basis.
14485
14486         * parameter.cs (Parameter.ComputeSignature): Update to use
14487         DeclSpace. 
14488
14489         (Parameters.GetSignature): ditto.
14490
14491         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
14492         instead of a TypeContainer.
14493
14494         (Interface.SemanticAnalysis): Use `this' instead of our parent to
14495         resolve names.  Because we need to be resolve in our context, not
14496         our parents.
14497
14498         * driver.cs: Implement response files.
14499
14500         * class.cs (TypeContainer.DefineType): If we are defined, do not
14501         redefine ourselves.
14502
14503         (Event.Emit): Emit the code for add/remove handlers.
14504         (Event.Define): Save the MethodBuilders for add/remove.
14505
14506         * typemanager.cs: Use pair here too.
14507
14508         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
14509         DictionaryEntry requires the first argument to be non-null.  
14510
14511         (enum_declaration): Compute full name for registering the
14512         enumeration.
14513
14514         (delegate_declaration): Instead of using
14515         formal_parameter_list, use opt_formal_parameter_list as the list
14516         can be empty.
14517
14518         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
14519         (EventParsing): New property that controls whether `add' and
14520         `remove' are returned as tokens or identifiers (for events);
14521
14522 2001-12-19  Ravi Pratap  <ravi@ximian.com>
14523
14524         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
14525         use MyEventBuilder only and let it wrap the real builder for us.
14526
14527         (MyEventBuilder): Revamp constructor etc.
14528
14529         Implement all operations that we perform on EventBuilder in precisely the same
14530         way here too.
14531
14532         (FindMembers): Update to use the EventBuilder member.
14533
14534         (Event.Emit): Update accordingly.
14535
14536 2001-12-18  Ravi Pratap  <ravi@ximian.com>
14537
14538         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
14539         by calling the appropriate methods.
14540
14541         (GetCustomAttributes): Make stubs as they cannot possibly do anything
14542         useful.
14543
14544         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
14545
14546 2001-12-17  Ravi Pratap  <ravi@ximian.com>
14547
14548         * delegate.cs (Delegate.Populate): Check that the return type
14549         and various parameters types are indeed accessible.
14550
14551         * class.cs (Constructor.Define): Same here.
14552
14553         (Field.Define): Ditto.
14554
14555         (Event.Define): Ditto.
14556
14557         (Operator.Define): Check that the underlying Method defined itself
14558         correctly - so it's MethodBuilder should not be null.
14559
14560         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
14561         expression happens to be null.
14562
14563         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
14564         members but as of now we don't seem to be able to do anything really useful with it.
14565
14566         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
14567         not the EventBuilder.
14568
14569 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
14570
14571         * cs-tokenizer.cs: Add support for defines.
14572         Add support for #if, #elif, #else, #endif
14573
14574         (eval_var): evaluates a variable.
14575         (eval): stubbed for evaluating functions.
14576
14577         * cs-parser.jay: Pass the defines information
14578
14579         * driver.cs: Add --define command line option.
14580
14581         * decl.cs: Move MemberCore here.
14582
14583         Make it the base class for DeclSpace.  This allows us to catch and
14584         report 108 and 109 for everything now.
14585
14586         * class.cs (TypeContainer.Define): Extract all the members
14587         before populating and emit the warning 108 (new keyword required
14588         to override) instead of having each member implement this.
14589
14590         (MemberCore.Define): New abstract method, we will be using this in
14591         the warning reporting engine in Populate.
14592
14593         (Operator.Define): Adjust to new MemberCore protocol. 
14594
14595         * const.cs (Const): This does not derive from Expression, it is a
14596         temporary object we use to create fields, it is a MemberCore. 
14597
14598         * class.cs (Method.Define): Allow the entry point to be in a
14599         specific class.
14600
14601         * driver.cs: Rewrite the argument handler to clean it up a bit.
14602
14603         * rootcontext.cs: Made it just an auxiliary namespace feature by
14604         making everything static.
14605
14606         * driver.cs: Adapt code to use RootContext type name instead of
14607         instance variable.
14608
14609         * delegate.cs: Remove RootContext argument.
14610
14611         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
14612         argument. 
14613
14614         * class.cs (Event.Define): The lookup can fail.
14615
14616         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
14617
14618         * expression.cs: Resolve the this instance before invoking the code.
14619
14620 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
14621
14622         * cs-parser.jay: Add a production in element_access that allows
14623         the thing to become a "type" reference.  This way we can parse
14624         things like "(string [])" as a type.
14625
14626         Note that this still does not handle the more complex rules of
14627         casts. 
14628
14629
14630         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
14631
14632         * ecore.cs: (CopyNewMethods): new utility function used to
14633         assemble the list of methods from running FindMembers.
14634
14635         (MemberLookup): Rework FindMembers so that 
14636
14637 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
14638
14639         * class.cs (TypeContainer): Remove Delegates who fail to be
14640         defined.
14641
14642         * delegate.cs (Populate): Verify that we dont get null return
14643         values.   TODO: Check for AsAccessible.
14644
14645         * cs-parser.jay: Use basename to emit error 574 (destructor should
14646         have the same name as container class), not the full name.
14647
14648         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
14649         possible representation.  
14650
14651         Also implements integer type suffixes U and L.
14652
14653 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
14654
14655         * expression.cs (ArrayCreation.DoResolve): We need to do the
14656         argument resolution *always*.
14657
14658         * decl.cs: Make this hold the namespace.  Hold the root context as
14659         well.
14660         (LookupType): Move here.
14661
14662         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
14663
14664         * location.cs (Row, Name): Fixed the code, it was always returning
14665         references to the first file.
14666
14667         * interface.cs: Register properties defined through interfaces.
14668
14669         * driver.cs: Add support for globbing on the command line
14670
14671         * class.cs (Field): Make it derive from MemberCore as well.
14672         (Event): ditto.
14673
14674 2001-12-15  Ravi Pratap  <ravi@ximian.com>
14675
14676         * class.cs (Event::Define): Check that the type of the event is a delegate
14677         type else flag error #66.
14678
14679         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
14680         same.
14681
14682         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
14683         values of EntryPoint, CharSet etc etc.
14684
14685         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
14686
14687         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
14688         be null and we should ignore this. I am not sure if this is really clean. Apparently,
14689         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
14690         which needs this to do its work.
14691
14692         * ../errors/cs0066.cs : Add.
14693
14694 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
14695
14696         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
14697         helper functions.
14698
14699         * class.cs: (MethodSignature.MethodSignature): Removed hack that
14700         clears out the parameters field.
14701         (MemberSignatureCompare): Cleanup
14702
14703         (MemberCore): New base class used to share code between MethodCore
14704         and Property.
14705
14706         (RegisterRequiredImplementations) BindingFlags.Public requires
14707         either BindingFlags.Instace or Static.  Use instance here.
14708
14709         (Property): Refactored code to cope better with the full spec.
14710
14711         * parameter.cs (GetParameterInfo): Return an empty array instead
14712         of null on error.
14713
14714         * class.cs (Property): Abstract or extern properties have no bodies.
14715
14716         * parameter.cs (GetParameterInfo): return a zero-sized array.
14717
14718         * class.cs (TypeContainer.MethodModifiersValid): Move all the
14719         method modifier validation to the typecontainer so we can reuse
14720         this on properties.
14721
14722         (MethodCore.ParameterTypes): return an empty sized array of types.
14723
14724         (Property.Define): Test property modifier validity.
14725
14726         Add tests for sealed/override too.
14727
14728         (Method.Emit): abstract or extern methods have no bodies.
14729
14730 2001-12-14  Ravi Pratap  <ravi@ximian.com>
14731
14732         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
14733         thing.
14734
14735         (Method::Define, ::Emit): Modify accordingly.
14736
14737         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
14738
14739         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
14740
14741         * makefile: Pass in /unsafe.
14742
14743 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
14744
14745         * class.cs (MakeKey): Kill routine.
14746
14747         * class.cs (TypeContainer.Define): Correctly define explicit
14748         method implementations (they require the full interface name plus
14749         the method name).
14750
14751         * typemanager.cs: Deply the PtrHashtable here and stop using the
14752         lame keys.  Things work so much better.
14753
14754         This of course broke everyone who depended on `RegisterMethod' to
14755         do the `test for existance' test.  This has to be done elsewhere.
14756
14757         * support.cs (PtrHashtable): A hashtable that avoid comparing with
14758         the object stupid Equals method (because, that like fails all over
14759         the place).  We still do not use it.
14760
14761         * class.cs (TypeContainer.SetRequiredInterface,
14762         TypeContainer.RequireMethods): Killed these two routines and moved
14763         all the functionality to RegisterRequiredImplementations.
14764
14765         (TypeContainer.RegisterRequiredImplementations): This routine now
14766         registers all the implementations required in an array for the
14767         interfaces and abstract methods.  We use an array of structures
14768         which can be computed ahead of time to reduce memory usage and we
14769         also assume that lookups are cheap as most classes will not
14770         implement too many interfaces.
14771
14772         We also avoid creating too many MethodSignatures.
14773
14774         (TypeContainer.IsInterfaceMethod): Update and optionally does not
14775         clear the "pending" bit if we find that there are problems with
14776         the declaration.
14777
14778         (TypeContainer.VerifyPendingMethods): Update to report errors of
14779         methods that look like implementations but are not.
14780
14781         (TypeContainer.Define): Add support for explicit interface method
14782         implementation. 
14783
14784 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
14785
14786         * typemanager.cs: Keep track of the parameters here instead of
14787         being a feature of the TypeContainer.
14788
14789         * class.cs: Drop the registration of parameters here, as
14790         InterfaceMethods are also interface declarations.
14791
14792         * delegate.cs: Register methods with the TypeManager not only with
14793         the TypeContainer.  This code was buggy.
14794
14795         * interface.cs: Full registation here.
14796
14797 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
14798
14799         * expression.cs: Remove reducer for binary expressions, it can not
14800         be done this way.
14801
14802         * const.cs: Put here the code that used to go into constant.cs
14803
14804         * constant.cs: Put here the code for constants, this is a new base
14805         class for Literals.
14806
14807         * literal.cs: Make Literal derive from Constant.
14808
14809 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
14810
14811         * statement.cs (Return.Emit): Report error 157 if the user
14812         attempts to return from a finally block.
14813
14814         (Return.Emit): Instead of emitting a return, jump to the end of
14815         the function.
14816
14817         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
14818         LocalBuilder to store the result of the function.  ReturnLabel is
14819         the target where we jump.
14820
14821
14822 2001-12-09  Radek Doulik  <rodo@ximian.com>
14823
14824         * cs-parser.jay: remember alias in current namespace
14825
14826         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14827         namespaces
14828
14829         * class.cs (LookupAlias): lookup alias in my_namespace
14830
14831         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14832         aliases hashtable
14833         (LookupAlias): lookup alias in this and if needed in parent
14834         namespaces
14835
14836 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14837
14838         * support.cs: 
14839
14840         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14841         making things static.  I need this to avoid passing the
14842         TypeContainer when calling ParameterType.
14843
14844         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14845         that did string manipulation to compute the type and then call
14846         GetType.  Use Parameter.ParameterType instead.
14847
14848         * cs-tokenizer.cs: Consume the suffix for floating values.
14849
14850         * expression.cs (ParameterReference): figure out whether this is a
14851         reference parameter or not.  Kill an extra variable by computing
14852         the arg_idx during emission.
14853
14854         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14855         function that returns whether a parameter is an out/ref value or not.
14856
14857         (Parameter.ParameterType): The type of the parameter (base,
14858         without ref/out applied).
14859
14860         (Parameter.Resolve): Perform resolution here.
14861         (Parameter.ExternalType): The full type (with ref/out applied).
14862
14863         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14864         support for expressions on the using statement.
14865
14866 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14867
14868         * statement.cs (Using.EmitLocalVariableDecls): Split the
14869         localvariable handling of the using statement.
14870
14871         (Block.EmitMeta): Keep track of variable count across blocks.  We
14872         were reusing slots on separate branches of blocks.
14873
14874         (Try.Emit): Emit the general code block, we were not emitting it. 
14875
14876         Check the type of the declaration to be an IDisposable or
14877         something that can be implicity converted to it. 
14878
14879         Emit conversions if required.
14880
14881         * ecore.cs (EmptyExpression): New utility class.
14882         (Expression.ImplicitConversionExists): New utility function.
14883
14884 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14885
14886         * statement.cs (Using): Implement.
14887
14888         * expression.cs (LocalVariableReference): Support read only variables.
14889
14890         * statement.cs: Remove the explicit emit for the Leave opcode.
14891         (VariableInfo): Add a readonly field.
14892
14893 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14894
14895         * ecore.cs (ConvCast): new class used to encapsulate the various
14896         explicit integer conversions that works in both checked and
14897         unchecked contexts.
14898
14899         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14900         properly generate the overflow opcodes.
14901
14902 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14903
14904         * statement.cs: The correct type for the EmptyExpression is the
14905         element_type, not the variable type.  Ravi pointed this out.
14906
14907 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14908
14909         * class.cs (Method::Define): Handle PInvoke methods specially
14910         by using DefinePInvokeMethod instead of the usual one.
14911
14912         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14913         above to do the task of extracting information and defining the method.
14914
14915 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14916
14917         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14918         of the condition for string type.
14919
14920         (Emit): Move that here. 
14921
14922         (ArrayCreation::CheckIndices): Keep string literals in their expression
14923         form.
14924
14925         (EmitDynamicInitializers): Handle strings appropriately.
14926
14927 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14928
14929         * codegen.cs (EmitContext): Replace multiple variables with a
14930         single pointer to the current Switch statement.
14931
14932         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14933         EmitContext.
14934
14935 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14936
14937         * statement.cs 
14938
14939         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14940         default'.
14941
14942         (Foreach.Emit): Foreach on arrays was not setting
14943         up the loop variables (for break/continue).
14944
14945         (GotoCase): Semi-implented.
14946
14947 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14948
14949         * attribute.cs (CheckAttribute): Handle system attributes by using
14950         Attribute.GetAttributes to examine information we need.
14951
14952         (GetValidPlaces): Same here.
14953
14954         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14955
14956         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14957
14958         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14959
14960         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14961
14962         (Method::Emit): Handle the case when we are a PInvoke method.
14963
14964 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14965
14966         * expression.cs: Use ResolveWithSimpleName on compound names.
14967
14968 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14969
14970         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14971         before trying to reduce it.
14972
14973         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14974
14975         * constant.cs (LookupConstantValue): Implement.
14976
14977         (EmitConstant): Use the above in emitting the constant.
14978
14979         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14980         that are user-defined by doing a LookupConstantValue on them.
14981
14982         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14983         too, like above.
14984
14985 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14986
14987         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14988
14989         (BaseAccess.DoResolve): Implement.
14990
14991         (MemberAccess.DoResolve): Split this routine into a
14992         ResolveMemberAccess routine that can be used independently
14993
14994 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14995
14996         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14997         As that share bits of the implementation.  Is returns a boolean,
14998         while As returns the Type that is being probed.
14999
15000 2001-12-01  Ravi Pratap  <ravi@ximian.com>
15001
15002         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
15003         instead of a Literal - much easier.
15004
15005         (EnumInTransit): Remove - utterly useless :-)
15006
15007         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
15008
15009         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
15010
15011         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
15012         chain when we have no associated expression.
15013
15014 2001-11-30  Ravi Pratap  <ravi@ximian.com>
15015
15016         * constant.cs (Define): Use Location while reporting the errror.
15017
15018         Also emit a warning when 'new' is used and there is no inherited
15019         member to hide.
15020
15021         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
15022         populated.
15023
15024         (LookupEnumValue): Implement to lookup an enum member's value and define it
15025         if necessary.
15026
15027         (Populate): Re-write accordingly to use the above routine.
15028
15029 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
15030
15031         * expression.cs (This): Fix prototype for DoResolveLValue to
15032         override the base class DoResolveLValue.
15033
15034         * cs-parser.cs: Report errors cs574 and cs575 (destructor
15035         declarations) 
15036
15037         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
15038         (we need to load the address of the field here).  This fixes
15039         test-22. 
15040
15041         (FieldExpr.DoResolveLValue): Call the DoResolve
15042         function to initialize the Instance expression.
15043
15044         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
15045         correctly the GetEnumerator operation on a value type.
15046
15047         * cs-parser.jay: Add more simple parsing error catches.
15048
15049         * statement.cs (Switch): Add support for string switches.
15050         Handle null specially.
15051
15052         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
15053
15054 2001-11-28  Ravi Pratap  <ravi@ximian.com>
15055
15056         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
15057
15058         (declare_local_constant): New helper function.
15059
15060         * statement.cs (AddConstant): Keep a separate record of constants
15061
15062         (IsConstant): Implement to determine if a variable is a constant.
15063
15064         (GetConstantExpression): Implement.
15065
15066         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
15067
15068         * statement.cs (IsVariableDefined): Re-write.
15069
15070 2001-11-27  Ravi Pratap  <ravi@ximian.com>
15071
15072         * class.cs (TypeContainer::FindMembers): Look for constants
15073         in the case when we are looking for MemberTypes.Field
15074
15075         * expression.cs (MemberAccess::DoResolve): Check that in the
15076         case we are a FieldExpr and a Literal, we are not being accessed
15077         by an instance reference.
15078
15079         * cs-parser.jay (local_constant_declaration): Implement.
15080
15081         (declaration_statement): Implement for constant declarations.
15082
15083 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
15084
15085         * statement.cs (Switch): Catch double defaults.
15086
15087         (Switch): More work on the switch() statement
15088         implementation.  It works for integral values now, need to finish
15089         string support.
15090
15091
15092 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
15093
15094         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
15095         integer literals into other integer literals.  To be used by
15096         switch. 
15097
15098 2001-11-24  Ravi Pratap  <ravi@ximian.com>
15099
15100         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
15101         some memory.
15102
15103         (EmitDynamicInitializers): Cope with the above since we extract data
15104         directly from ArrayData now.
15105
15106         (ExpectInitializers): Keep track of whether initializers are mandatory
15107         or not.
15108
15109         (Bounds): Make it a hashtable to prevent the same dimension being 
15110         recorded for every element in that dimension.
15111
15112         (EmitDynamicInitializers): Fix bug which prevented the Set array method
15113         from being found.
15114
15115         Also fix bug which was causing the indices to be emitted in the reverse
15116         order.
15117
15118 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
15119
15120         * expression.cs (ArrayCreation): Implement the bits that Ravi left
15121         unfinished.  They do not work, because the underlying code is
15122         sloppy.
15123
15124 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15125
15126         * cs-parser.jay: Remove bogus fixme.
15127
15128         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
15129         on Switch statement.
15130
15131 2001-11-23  Ravi Pratap  <ravi@ximian.com>
15132
15133         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
15134         the same. 
15135
15136         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
15137         parameter. Apparently, any expression is allowed. 
15138
15139         (ValidateInitializers): Update accordingly.
15140
15141         (CheckIndices): Fix some tricky bugs thanks to recursion.
15142
15143         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
15144         I was being completely brain-dead.
15145
15146         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
15147         and re-write acordingly.
15148
15149         (DelegateInvocation): Re-write accordingly.
15150
15151         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
15152
15153         (MakeByteBlob): Handle types more correctly.
15154
15155         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
15156         initialization from expressions but it is incomplete because I am a complete
15157         Dodo :-|
15158
15159 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15160
15161         * statement.cs (If.Emit): Fix a bug that generated incorrect code
15162         on If.  Basically, we have to return `true' (ie, we do return to
15163         our caller) only if both branches of the if return.
15164
15165         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
15166         short-circuit operators, handle them as short circuit operators. 
15167
15168         (Cast.DoResolve): Resolve type.
15169         (Cast.Cast): Take an expression as the target type.
15170
15171         * cs-parser.jay (cast_expression): Remove old hack that only
15172         allowed a limited set of types to be handled.  Now we take a
15173         unary_expression and we resolve to a type during semantic
15174         analysis.
15175
15176         Use the grammar productions from Rhys to handle casts (this is
15177         not complete like Rhys syntax yet, we fail to handle that corner
15178         case that C# has regarding (-x), but we will get there.
15179
15180 2001-11-22  Ravi Pratap  <ravi@ximian.com>
15181
15182         * class.cs (EmitFieldInitializer): Take care of the case when we have a
15183         field which is an array type.
15184
15185         * cs-parser.jay (declare_local_variables): Support array initialization too.
15186
15187         * typemanager.cs (MakeKey): Implement.
15188
15189         (everywhere): Use the above appropriately.
15190
15191         * cs-parser.jay (for_statement): Update for array initialization while
15192         declaring variables.
15193
15194         * ecore.cs : The error message was correct, it's the variable's names that
15195         were misleading ;-) Make the code more readable.
15196
15197         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
15198         the correct type etc.
15199
15200         (ConvertExplicit): Handle Enum types by examining the underlying type.
15201
15202 2001-11-21  Ravi Pratap  <ravi@ximian.com>
15203
15204         * parameter.cs (GetCallingConvention): Always return
15205         CallingConventions.Standard for now.
15206
15207 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
15208
15209         * expression.cs (Binary.ResolveOperator): Update the values of `l'
15210         and `r' after calling DoNumericPromotions.
15211
15212         * ecore.cs: Fix error message (the types were in the wrong order).
15213
15214         * statement.cs (Foreach.ProbeCollectionType): Need to pass
15215         BindingFlags.Instance as well 
15216
15217         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
15218         implicit int literal conversion in an empty cast so that we
15219         propagate the right type upstream.
15220
15221         (UnboxCast): new class used to unbox value types.
15222         (Expression.ConvertExplicit): Add explicit type conversions done
15223         by unboxing.
15224
15225         (Expression.ImplicitNumericConversion): Oops, forgot to test for
15226         the target type before applying the implicit LongLiterals to ULong
15227         literal cast.
15228
15229 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
15230
15231         * cs-parser.jay (for_statement): Reworked the way For works: now
15232         we declare manually any variables that are introduced in
15233         for_initializer to solve the problem of having out-of-band code
15234         emition (that is what got for broken).
15235
15236         (declaration_statement): Perform the actual variable declaration
15237         that used to be done in local_variable_declaration here.
15238
15239         (local_variable_declaration): Do not declare anything, just pass
15240         the information on a DictionaryEntry
15241
15242 2001-11-20  Ravi Pratap  <ravi@ximian.com>
15243
15244         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
15245         re-write of the logic to now make it recursive.
15246
15247         (UpdateIndices): Re-write accordingly.
15248
15249         Store element data in a separate ArrayData list in the above methods.
15250
15251         (MakeByteBlob): Implement to dump the array data into a byte array.
15252
15253 2001-11-19  Ravi Pratap  <ravi@ximian.com>
15254
15255         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
15256         into CheckIndices.
15257
15258         * constant.cs (Define): Implement.
15259
15260         (EmitConstant): Re-write fully.
15261
15262         Pass in location info.
15263
15264         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
15265         respectively.
15266
15267         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
15268         DictionaryEntry since we need location info too.
15269
15270         (constant_declaration): Update accordingly.
15271
15272         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
15273         code into another method : UpdateIndices.
15274
15275 2001-11-18  Ravi Pratap  <ravi@ximian.com>
15276
15277         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
15278         some type checking etc.
15279
15280 2001-11-17  Ravi Pratap  <ravi@ximian.com>
15281
15282         * expression.cs (ArrayCreation::ValidateInitializers): Implement
15283         bits to provide dimension info if the user skips doing that.
15284
15285         Update second constructor to store the rank correctly.
15286
15287 2001-11-16  Ravi Pratap  <ravi@ximian.com>
15288
15289         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
15290         and try to implement.
15291
15292         * ../errors/cs0150.cs : Add.
15293
15294         * ../errors/cs0178.cs : Add.
15295
15296 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
15297
15298         * statement.cs: Implement foreach on multi-dimensional arrays. 
15299
15300         * parameter.cs (Parameters.GetParameterByName): Also lookup the
15301         name of the params argument.
15302
15303         * expression.cs: Use EmitStoreOpcode to get the right opcode while
15304         initializing the array.
15305
15306         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
15307         we can use this elsewhere.
15308
15309         * statement.cs: Finish implementation of foreach for single
15310         dimension arrays.
15311
15312         * cs-parser.jay: Use an out-of-band stack to pass information
15313         around, I wonder why I need this.
15314
15315         foreach_block: Make the new foreach_block the current_block.
15316
15317         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
15318         function used to return a static Parameters structure.  Used for
15319         empty parameters, as those are created very frequently.
15320
15321         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
15322
15323 2001-11-15  Ravi Pratap  <ravi@ximian.com>
15324
15325         * interface.cs : Default modifier is private, not public. The
15326         make verify test passes again.
15327
15328 2001-11-15  Ravi Pratap  <ravi@ximian.com>
15329
15330         * support.cs (ReflectionParameters): Fix logic to determine
15331         whether the last parameter is a params one. Test 9 passes again.
15332
15333         * delegate.cs (Populate): Register the builders we define with
15334         RegisterParameterForBuilder. Test 19 passes again.
15335
15336         * cs-parser.jay (property_declaration): Reference $6 instead
15337         of $$ to get at the location.
15338
15339         (indexer_declaration): Similar stuff.
15340
15341         (attribute): Ditto.
15342
15343         * class.cs (Property): Register parameters for the Get and Set methods
15344         if they exist. Test 23 passes again.
15345
15346         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
15347         call to EmitArguments as we are sure there aren't any params arguments. 
15348         Test 32 passes again.
15349
15350         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
15351         IndexOutOfRangeException. 
15352
15353         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
15354         Test 33 now passes again.
15355
15356 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
15357
15358         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
15359         broke a bunch of things.  Will have to come up with a better way
15360         of tracking locations.
15361
15362         * statement.cs: Implemented foreach for single dimension arrays.
15363
15364 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15365
15366         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
15367         an error.  This removes the lookup from the critical path.
15368
15369         * cs-parser.jay: Removed use of temporary_loc, which is completely
15370         broken. 
15371
15372 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
15373
15374         * support.cs (ReflectionParameters.ParameterModifier): Report
15375         whether the argument is a PARAMS argument or not.
15376
15377         * class.cs: Set the attribute `ParamArrayAttribute' on the
15378         parameter argument.
15379
15380         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
15381         and cons_param_array_attribute (ConstructorInfo for
15382         ParamArrayAttribute)., 
15383
15384         * codegen.cs: Emit the return using the `Return' statement, that
15385         way we can report the error correctly for missing return values. 
15386
15387         * class.cs (Method.Emit): Clean up.
15388
15389         * expression.cs (Argument.Resolve): Take another argument: the
15390         location where this argument is used.  Notice that this is not
15391         part of the "Argument" class as to reduce the size of the
15392         structure (we know the approximate location anyways).
15393
15394         Test if the argument is a variable-reference, if not, then
15395         complain with a 206.
15396
15397         (Argument.Emit): Emit addresses of variables.
15398
15399         (Argument.FullDesc): Simplify.
15400
15401         (Invocation.DoResolve): Update for Argument.Resolve.
15402
15403         (ElementAccess.DoResolve): ditto.
15404
15405         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
15406         method should be virtual, as this method is always virtual.
15407
15408         (NewDelegate.DoResolve): Update for Argument.Resolve.
15409
15410         * class.cs (ConstructorInitializer.DoResolve): ditto.
15411
15412         * attribute.cs (Attribute.Resolve): ditto.
15413
15414 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
15415
15416         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
15417
15418         * expression.cs (ParameterReference): Drop IStackStorage and implement
15419         IAssignMethod instead. 
15420
15421         (LocalVariableReference): ditto.
15422
15423         * ecore.cs (FieldExpr): Drop IStackStorage and implement
15424         IAssignMethod instead. 
15425
15426 2001-11-13  Miguel de Icaza <miguel@ximian.com>
15427
15428         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
15429         enumerations that are used in heavily used structures derive from
15430         byte in a laughable and pathetic attempt to reduce memory usage.
15431         This is the kind of pre-optimzations that you should not do at
15432         home without adult supervision.
15433
15434         * expression.cs (UnaryMutator): New class, used to handle ++ and
15435         -- separatedly from the other unary operators.  Cleans up the
15436         code, and kills the ExpressionStatement dependency in Unary.
15437
15438         (Unary): Removed `method' and `Arguments' from this class, making
15439         it smaller, and moving it all to SimpleCall, so I can reuse this
15440         code in other locations and avoid creating a lot of transient data
15441         strucutres when not required.
15442
15443         * cs-parser.jay: Adjust for new changes.
15444
15445 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
15446
15447         * enum.cs (Enum.Populate): If there is a failure during
15448         definition, return
15449
15450         * cs-parser.jay (opt_enum_base): we used to catch type errors
15451         here, but this is really incorrect.  The type error should be
15452         catched during semantic analysis.
15453
15454 2001-12-11  Ravi Pratap  <ravi@ximian.com>
15455
15456         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
15457         current_local_parameters as expected since I, in my stupidity, had forgotten
15458         to do this :-)
15459
15460         * attribute.cs (GetValidPlaces): Fix stupid bug.
15461
15462         * class.cs (Method::Emit): Perform check on applicability of attributes.
15463
15464         (Constructor::Emit): Ditto.
15465
15466         (Field::Emit): Ditto.
15467
15468         (Field.Location): Store location information.
15469
15470         (Property, Event, Indexer, Operator): Ditto.
15471
15472         * cs-parser.jay (field_declaration): Pass in location for each field.
15473
15474         * ../errors/cs0592.cs : Add.
15475
15476 2001-11-12  Ravi Pratap  <ravi@ximian.com>
15477
15478         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
15479
15480         (InitCoreTypes): Update accordingly.
15481
15482         (RegisterAttrType, LookupAttr): Implement.
15483
15484         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
15485         info about the same.
15486
15487         (Resolve): Update to populate the above as necessary.
15488
15489         (Error592): Helper.
15490
15491         (GetValidPlaces): Helper to the above.
15492
15493         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
15494
15495         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
15496
15497 2001-11-12  Ravi Pratap  <ravi@ximian.com>
15498
15499         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
15500
15501         * ../errors/cs0617.cs : Add.
15502
15503 2001-11-11  Ravi Pratap  <ravi@ximian.com>
15504
15505         * enum.cs (Emit): Rename to Populate to be more consistent with what
15506         we expect it to do and when exactly it is called.
15507
15508         * class.cs, rootcontext.cs : Update accordingly.
15509
15510         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
15511         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
15512
15513         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
15514
15515         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
15516         of a fieldinfo using the above, when dealing with a FieldBuilder.
15517
15518 2001-11-10  Ravi Pratap  <ravi@ximian.com>
15519
15520         * ../errors/cs0031.cs : Add.
15521
15522         * ../errors/cs1008.cs : Add.
15523
15524         * ../errrors/cs0543.cs : Add.
15525
15526         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
15527         enum type.
15528
15529         (FindMembers): Implement.
15530
15531         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
15532         enums and delegates too.
15533
15534         (enum_types): Rename to builder_to_enum.
15535
15536         (delegate_types): Rename to builder_to_delegate.
15537
15538         * delegate.cs (FindMembers): Implement.
15539
15540 2001-11-09  Ravi Pratap  <ravi@ximian.com>
15541
15542         * typemanager.cs (IsEnumType): Implement.
15543
15544         * enum.cs (Emit): Re-write parts to account for the underlying type
15545         better and perform checking etc.
15546
15547         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
15548         of the underlying type.
15549
15550         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
15551         value
15552
15553         * enum.cs (error31): Helper to report error #31.
15554
15555         * cs-parser.jay (enum_declaration): Store location of each member too.
15556
15557         * enum.cs (member_to_location): New hashtable. 
15558
15559         (AddEnumMember): Update location hashtable.
15560
15561         (Emit): Use the location of each member while reporting errors.
15562
15563 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
15564
15565         * cs-parser.jay: A for_initializer if is a
15566         local_variable_declaration really ammount to have an implicit
15567         block with the variable declaration and no initializer for for.
15568
15569         * statement.cs (For.Emit): Cope with null initializers.
15570
15571         This fixes the infinite loop on for initializers.
15572
15573 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
15574
15575         * enum.cs: More cleanup.
15576
15577         * ecore.cs: Remove dead code.
15578
15579         * class.cs (Property.Emit): More simplification.
15580         (Event.Emit): ditto.
15581
15582         Reworked to have less levels of indentation.
15583
15584 2001-11-08  Ravi Pratap  <ravi@ximian.com>
15585
15586         * class.cs (Property): Emit attributes.
15587
15588         (Field): Ditto.
15589
15590         (Event): Ditto.
15591
15592         (Indexer): Ditto.
15593
15594         (Operator): Ditto.
15595
15596         * enum.cs (Emit): Ditto.
15597
15598         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
15599         Enums too.
15600
15601         * class.cs (Field, Event, etc.): Move attribute generation into the
15602         Emit method everywhere.
15603
15604         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
15605         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
15606         as we had no way of defining nested enums !
15607
15608         * rootcontext.cs : Adjust code accordingly.
15609
15610         * typemanager.cs (AddEnumType): To keep track of enum types separately.
15611
15612 2001-11-07  Ravi Pratap  <ravi@ximian.com>
15613
15614         * expression.cs (EvalConstantExpression): Move into ecore.cs
15615
15616         * enum.cs (Enum): Rename some members and make them public and readonly
15617         according to our convention.
15618
15619         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
15620         nothing else.
15621
15622         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
15623
15624         (Enum::Emit): Write a simple version for now which doesn't try to compute
15625         expressions. I shall modify this to be more robust in just a while.
15626
15627         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
15628
15629         (TypeContainer::CloseType): Create the Enum types too.
15630
15631         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
15632
15633         * expression.cs (EvalConstantExpression): Get rid of completely.
15634
15635         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
15636         user-defined values and other cases.
15637
15638         (IsValidEnumLiteral): Helper function.
15639
15640         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
15641         out there in the case we had a literal FieldExpr.
15642
15643         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
15644
15645         (Literalize): Revamp a bit to take two arguments.
15646
15647         (EnumLiteral): New class which derives from Literal to wrap enum literals.
15648
15649 2001-11-06  Ravi Pratap  <ravi@ximian.com>
15650
15651         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
15652
15653         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
15654
15655         (Resolve): Use the above to ensure we have proper initializers.
15656
15657 2001-11-05  Ravi Pratap  <ravi@ximian.com>
15658
15659         * expression.cs (Expression::EvalConstantExpression): New method to 
15660         evaluate constant expressions.
15661
15662         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
15663
15664 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
15665
15666         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
15667         in an array.
15668
15669         (Binary.ResolveOperator): Handle operator != (object a, object b)
15670         and operator == (object a, object b);
15671
15672         (Binary.DoNumericPromotions): Indicate whether the numeric
15673         promotion was possible.
15674
15675         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
15676         Implement.  
15677
15678         Made the ArrayAccess implement interface IAssignMethod instead of
15679         IStackStore as the order in which arguments are passed reflects
15680         this.
15681
15682         * assign.cs: Instead of using expr.ExprClass to select the way of
15683         assinging, probe for the IStackStore/IAssignMethod interfaces.
15684
15685         * typemanager.cs: Load InitializeArray definition.
15686
15687         * rootcontext.cs (RootContext.MakeStaticData): Used to define
15688         static data that can be used to initialize arrays. 
15689
15690 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
15691
15692         * expression.cs: Handle operator== and operator!= for booleans.
15693
15694         (Conditioal.Reduce): Implement reducer for the ?: operator.
15695
15696         (Conditional.Resolve): Implement dead code elimination.
15697
15698         (Binary.Resolve): Catch string literals and return a new
15699         concatenated string.
15700
15701         (Unary.Reduce): Implement reduction of unary expressions.
15702
15703         * ecore.cs: Split out the expression core handling here.
15704
15705         (Expression.Reduce): New method used to perform constant folding
15706         and CSE.  This is needed to support constant-expressions. 
15707
15708         * statement.cs (Statement.EmitBoolExpression): Pass true and false
15709         targets, and optimize for !x.
15710
15711 2001-11-04  Ravi Pratap  <ravi@ximian.com>
15712
15713         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
15714         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
15715         set custom atttributes.
15716
15717         * literal.cs (Literal::GetValue): New abstract method to return the actual
15718         value of the literal, cast as an object.
15719
15720         (*Literal): Implement GetValue method.
15721
15722         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
15723         expressions to the arraylist but objects of type Argument.
15724
15725         * class.cs (TypeContainer::Emit): Emit our attributes too.
15726
15727         (Method::Emit, Constructor::Emit): Ditto.
15728
15729         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
15730         to be ignoring earlier.
15731
15732 2001-11-03  Ravi Pratap  <ravi@ximian.com>
15733
15734         * attribute.cs (AttributeSection::Define): Implement to do the business
15735         of constructing a CustomAttributeBuilder.
15736
15737         (Attribute): New trivial class. Increases readability of code.  
15738
15739         * cs-parser.jay : Update accordingly.
15740
15741         (positional_argument_list, named_argument_list, named_argument): New rules
15742
15743         (attribute_arguments): Use the above so that we are more correct.
15744
15745 2001-11-02  Ravi Pratap  <ravi@ximian.com>
15746
15747         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
15748         to perform all checks for a method with a params parameter.
15749
15750         (Invocation::OverloadResolve): Update to use the above method and therefore
15751         cope correctly with params method invocations.
15752
15753         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
15754         params too.
15755
15756         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
15757         constructors in our parent too because we can't afford to miss out on 
15758         protected ones ;-)
15759
15760         * attribute.cs (AttributeSection): New name for the class Attribute
15761
15762         Other trivial changes to improve readability.
15763
15764         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
15765         use the new class names.
15766
15767 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15768
15769         * class.cs (Method::Define): Complete definition for params types too
15770
15771         (Indexer::Define): Ditto.
15772
15773         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
15774         Cope everywhere with a request for info about the array parameter.
15775
15776 2001-11-01  Ravi Pratap  <ravi@ximian.com>
15777
15778         * tree.cs (RecordNamespace): Fix up to check for the correct key.
15779
15780         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
15781         local_variable_type to extract the string corresponding to the type.
15782
15783         (local_variable_type): Fixup the action to use the new helper method.
15784
15785         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
15786         go.
15787
15788         * expression.cs : Clean out code which uses the above.
15789
15790 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15791
15792         * typemanager.cs (RegisterMethod): Check if we already have an existing key
15793         and bale out if necessary by returning a false.
15794
15795         (RegisterProperty): Ditto.
15796
15797         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
15798         and print out appropriate error messages.
15799
15800         * interface.cs (everywhere): Ditto.
15801
15802         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
15803         location to constructor.
15804
15805         * class.cs (Property, Event, Indexer): Update accordingly.
15806
15807         * ../errors/cs111.cs : Added.
15808
15809         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
15810         of a method, as laid down by the spec.
15811
15812         (Invocation::OverloadResolve): Use the above method.
15813
15814 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15815
15816         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
15817         now take a TypeContainer and a Parameters object.
15818
15819         (ParameterData): Modify return type of ParameterModifier method to be 
15820         Parameter.Modifier and not a string.
15821
15822         (ReflectionParameters, InternalParameters): Update accordingly.
15823
15824         * expression.cs (Argument::GetParameterModifier): Same here.
15825
15826         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15827         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15828         symbol in it at all so maybe this is only for now.
15829
15830 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15831
15832         * support.cs (InternalParameters): Constructor now takes an extra argument 
15833         which is the actual Parameters class.
15834
15835         (ParameterDesc): Update to provide info on ref/out modifiers.
15836
15837         * class.cs (everywhere): Update call to InternalParameters to pass in
15838         the second argument too.
15839
15840         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15841         to return the modifier info [ref/out etc]
15842
15843         (InternalParameters, ReflectionParameters): Implement the above.
15844
15845         * expression.cs (Argument::ParameterModifier): Similar function to return
15846         info about the argument's modifiers.
15847
15848         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15849         too.
15850
15851         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15852         a new SetFormalParameters object which we pass to InternalParameters.
15853
15854 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15855
15856         * expression.cs (NewArray): Merge into the ArrayCreation class.
15857
15858 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15859
15860         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15861         NewUserdefinedArray into one as there wasn't much of a use in having
15862         two separate ones.
15863
15864         * expression.cs (Argument): Change field's name to ArgType from Type.
15865
15866         (Type): New readonly property which returns the proper type, taking into 
15867         account ref/out modifiers.
15868
15869         (everywhere): Adjust code accordingly for the above.
15870
15871         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15872         whether we are emitting for a ref or out parameter.
15873
15874         * expression.cs (Argument::Emit): Use the above field to set the state.
15875
15876         (LocalVariableReference::Emit): Update to honour the flag and emit the
15877         right stuff.
15878
15879         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15880
15881         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15882
15883         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15884
15885         (ReflectionParameters, InternalParameters): Implement the above method.
15886
15887         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15888         reporting errors.
15889
15890         (Invocation::FullMethodDesc): Ditto. 
15891
15892 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15893
15894         * cs-parser.jay: Add extra production for the second form of array
15895         creation. 
15896
15897         * expression.cs (ArrayCreation): Update to reflect the above
15898         change. 
15899
15900         * Small changes to prepare for Array initialization.
15901
15902 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15903
15904         * typemanager.cs (ImplementsInterface): interface might be null;
15905         Deal with this problem;
15906
15907         Also, we do store negative hits on the cache (null values), so use
15908         this instead of calling t.GetInterfaces on the type everytime.
15909
15910 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15911
15912         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15913
15914         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15915         split functionality out into different classes.
15916
15917         (New::FormArrayType): Move into NewBuiltinArray.
15918
15919         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15920         quite useless.
15921
15922         (NewBuiltinArray): New class to handle creation of built-in arrays.
15923
15924         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15925         account creation of one-dimensional arrays.
15926
15927         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15928
15929         (NewUserdefinedArray::DoResolve): Implement.
15930
15931         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15932
15933         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15934         we maintain inside the TypeManager. This is necessary to perform lookups on the
15935         module builder.
15936
15937         (LookupType): Update to perform GetType on the module builders too.     
15938
15939         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15940
15941         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15942
15943 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15944
15945         * expression.cs (New::DoResolve): Implement guts of array creation.
15946
15947         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15948
15949 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15950
15951         * expression.cs: Fix bug I introduced lsat night that broke
15952         Delegates. 
15953
15954         (Expression.Resolve): Report a 246 error (can not resolve name)
15955         if we find a SimpleName in the stream.
15956
15957         (Expression.ResolveLValue): Ditto.
15958
15959         (Expression.ResolveWithSimpleName): This function is a variant of
15960         ResolveName, this one allows SimpleNames to be returned without a
15961         warning.  The only consumer of SimpleNames is MemberAccess
15962
15963 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15964
15965         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15966         might arrive here.  I have my doubts that this is correct.
15967
15968         * statement.cs (Lock): Implement lock statement.
15969
15970         * cs-parser.jay: Small fixes to support `lock' and `using'
15971
15972         * cs-tokenizer.cs: Remove extra space
15973
15974         * driver.cs: New flag --checked, allows to turn on integer math
15975         checking. 
15976
15977         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15978         Threading.Monitor.Exit 
15979
15980 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15981
15982         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15983         Expression Class to be IndexerAccess.
15984
15985         Notice that Indexer::DoResolve sets the eclass to Value.
15986
15987 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15988
15989         * class.cs (TypeContainer::Emit): Emit code for indexers.
15990
15991         * assign.cs (IAssignMethod): New interface implemented by Indexers
15992         and Properties for handling assignment.
15993
15994         (Assign::Emit): Simplify and reuse code. 
15995
15996         * expression.cs (IndexerAccess, PropertyExpr): Implement
15997         IAssignMethod, clean up old code. 
15998
15999 2001-10-22  Ravi Pratap  <ravi@ximian.com>
16000
16001         * typemanager.cs (ImplementsInterface): New method to determine if a type
16002         implements a given interface. Provides a nice cache too.
16003
16004         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
16005         method.
16006
16007         (ConvertReferenceExplicit): Ditto.
16008
16009         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
16010         various methods, with correct names etc.
16011
16012         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
16013         Operator.UnaryNegation.
16014
16015         * cs-parser.jay (operator_declarator): Be a little clever in the case where
16016         we have a unary plus or minus operator.
16017
16018         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
16019         UnaryMinus.
16020
16021         * everywhere : update accordingly.
16022
16023         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
16024         respectively.
16025
16026         * class.cs (Method::Define): For the case where we are implementing a method
16027         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
16028         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
16029
16030 2001-10-21  Ravi Pratap  <ravi@ximian.com>
16031
16032         * interface.cs (FindMembers): Implement to work around S.R.E
16033         lameness.
16034
16035         * typemanager.cs (IsInterfaceType): Implement.
16036
16037         (FindMembers): Update to handle interface types too.
16038
16039         * expression.cs (ImplicitReferenceConversion): Re-write bits which
16040         use IsAssignableFrom as that is not correct - it doesn't work.
16041
16042         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
16043         and accordingly override EmitStatement.
16044
16045         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
16046         using the correct logic :-)
16047
16048 2001-10-19  Ravi Pratap  <ravi@ximian.com>
16049
16050         * ../errors/cs-11.cs : Add to demonstrate error -11 
16051
16052 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
16053
16054         * assign.cs (Assign::Resolve): Resolve right hand side first, and
16055         then pass this as a hint to ResolveLValue.
16056
16057         * expression.cs (FieldExpr): Add Location information
16058
16059         (FieldExpr::LValueResolve): Report assignment to readonly
16060         variable. 
16061
16062         (Expression::ExprClassFromMemberInfo): Pass location information.
16063
16064         (Expression::ResolveLValue): Add new method that resolves an
16065         LValue. 
16066
16067         (Expression::DoResolveLValue): Default invocation calls
16068         DoResolve. 
16069
16070         (Indexers): New class used to keep track of indexers in a given
16071         Type. 
16072
16073         (IStackStore): Renamed from LValue, as it did not really describe
16074         what this did.  Also ResolveLValue is gone from this interface and
16075         now is part of Expression.
16076
16077         (ElementAccess): Depending on the element access type
16078
16079         * typemanager.cs: Add `indexer_name_type' as a Core type
16080         (System.Runtime.CompilerServices.IndexerNameAttribute)
16081
16082         * statement.cs (Goto): Take a location.
16083
16084 2001-10-18  Ravi Pratap  <ravi@ximian.com>
16085
16086         * delegate.cs (Delegate::VerifyDelegate): New method to verify
16087         if two delegates are compatible.
16088
16089         (NewDelegate::DoResolve): Update to take care of the case when
16090         we instantiate a delegate from another delegate.
16091
16092         * typemanager.cs (FindMembers): Don't even try to look up members
16093         of Delegate types for now.
16094
16095 2001-10-18  Ravi Pratap  <ravi@ximian.com>
16096
16097         * delegate.cs (NewDelegate): New class to take care of delegate
16098         instantiation.
16099
16100         * expression.cs (New): Split the delegate related code out into 
16101         the NewDelegate class.
16102
16103         * delegate.cs (DelegateInvocation): New class to handle delegate 
16104         invocation.
16105
16106         * expression.cs (Invocation): Split out delegate related code into
16107         the DelegateInvocation class.
16108
16109 2001-10-17  Ravi Pratap  <ravi@ximian.com>
16110
16111         * expression.cs (New::DoResolve): Implement delegate creation fully
16112         and according to the spec.
16113
16114         (New::DoEmit): Update to handle delegates differently.
16115
16116         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
16117         because of which we were printing out arguments in reverse order !
16118
16119         * delegate.cs (VerifyMethod): Implement to check if the given method
16120         matches the delegate.
16121
16122         (FullDelegateDesc): Implement.
16123
16124         (VerifyApplicability): Implement.
16125
16126         * expression.cs (Invocation::DoResolve): Update to accordingly handle
16127         delegate invocations too.
16128
16129         (Invocation::Emit): Ditto.
16130
16131         * ../errors/cs1593.cs : Added.
16132
16133         * ../errors/cs1594.cs : Added.
16134
16135         * delegate.cs (InstanceExpression, TargetMethod): New properties.
16136
16137 2001-10-16  Ravi Pratap  <ravi@ximian.com>
16138
16139         * typemanager.cs (intptr_type): Core type for System.IntPtr
16140
16141         (InitCoreTypes): Update for the same.
16142
16143         (iasyncresult_type, asynccallback_type): Ditto.
16144
16145         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
16146         correct.
16147
16148         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
16149         too.
16150
16151         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
16152         the builders for the 4 members of a delegate type :-)
16153
16154         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
16155         type.
16156
16157         * expression.cs (New::DoResolve): Implement guts for delegate creation.
16158
16159         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
16160
16161 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
16162
16163         * statement.cs (Break::Emit): Implement.   
16164         (Continue::Emit): Implement.
16165
16166         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16167         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16168         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
16169         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
16170         end loop
16171
16172         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
16173         properties that track the label for the current loop (begin of the
16174         loop and end of the loop).
16175
16176 2001-10-15  Ravi Pratap  <ravi@ximian.com>
16177
16178         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
16179         use of emitting anything at all.
16180
16181         * class.cs, rootcontext.cs : Get rid of calls to the same.
16182
16183         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
16184
16185         (Populate): Define the constructor correctly and set the implementation
16186         attributes.
16187
16188         * typemanager.cs (delegate_types): New hashtable to hold delegates that
16189         have been defined.
16190
16191         (AddDelegateType): Implement.
16192
16193         (IsDelegateType): Implement helper method.
16194
16195         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
16196
16197         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
16198         and accordingly handle it.
16199
16200         * delegate.cs (Populate): Take TypeContainer argument.
16201         Implement bits to define the Invoke method. However, I still haven't figured out
16202         how to take care of the native int bit :-(
16203
16204         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
16205         Qualify the name of the delegate, not its return type !
16206
16207         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
16208         conversion.
16209
16210         (StandardConversionExists): Checking for array types turns out to be recursive.
16211
16212         (ConvertReferenceExplicit): Implement array conversion.
16213
16214         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
16215
16216 2001-10-12  Ravi Pratap  <ravi@ximian.com>
16217
16218         * cs-parser.jay (delegate_declaration): Store the fully qualified
16219         name as it is a type declaration.
16220
16221         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
16222         readonly.
16223
16224         (DefineDelegate): Renamed from Define. Does the same thing essentially,
16225         as TypeContainer::DefineType.
16226
16227         (Populate): Method in which all the definition of the various methods (Invoke)
16228         etc is done.
16229
16230         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
16231         see.
16232
16233         (CloseDelegate): Finally creates the delegate.
16234
16235         * class.cs (TypeContainer::DefineType): Update to define delegates.
16236         (Populate, Emit and CloseType): Do the same thing here too.
16237
16238         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
16239         delegates in all these operations.
16240
16241 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
16242
16243         * expression.cs: LocalTemporary: a new expression used to
16244         reference a temporary that has been created.
16245
16246         * assign.cs: Handle PropertyAccess back here, so that we can
16247         provide the proper semantic access to properties.
16248
16249         * expression.cs (Expression::ConvertReferenceExplicit): Implement
16250         a few more explicit conversions. 
16251
16252         * modifiers.cs: `NEW' modifier maps to HideBySig.
16253
16254         * expression.cs (PropertyExpr): Make this into an
16255         ExpressionStatement, and support the EmitStatement code path. 
16256
16257         Perform get/set error checking, clean up the interface.
16258
16259         * assign.cs: recognize PropertyExprs as targets, and if so, turn
16260         them into toplevel access objects.
16261
16262 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
16263
16264         * expression.cs: PropertyExpr::PropertyExpr: use work around the
16265         SRE.
16266
16267         * typemanager.cs: Keep track here of our PropertyBuilders again to
16268         work around lameness in SRE.
16269
16270 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
16271
16272         * expression.cs (LValue::LValueResolve): New method in the
16273         interface, used to perform a second resolution pass for LValues. 
16274
16275         (This::DoResolve): Catch the use of this in static methods.
16276
16277         (This::LValueResolve): Implement.
16278
16279         (This::Store): Remove warning, assigning to `this' in structures
16280         is 
16281
16282         (Invocation::Emit): Deal with invocation of
16283         methods on value types.  We need to pass the address to structure
16284         methods rather than the object itself.  (The equivalent code to
16285         emit "this" for structures leaves the entire structure on the
16286         stack instead of a pointer to it). 
16287
16288         (ParameterReference::DoResolve): Compute the real index for the
16289         argument based on whether the method takes or not a `this' pointer
16290         (ie, the method is static).
16291
16292         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
16293         value types returned from functions when we need to invoke a
16294         method on the sturcture.
16295
16296
16297 2001-10-11  Ravi Pratap  <ravi@ximian.com>
16298
16299         * class.cs (TypeContainer::DefineType): Method to actually do the business of
16300         defining the type in the Modulebuilder or Typebuilder. This is to take
16301         care of nested types which need to be defined on the TypeBuilder using
16302         DefineNestedMethod.
16303
16304         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
16305         methods in RootContext, only ported to be part of TypeContainer.
16306
16307         (TypeContainer::GetInterfaceOrClass): Ditto.
16308
16309         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
16310
16311         * interface.cs (Interface::DefineInterface): New method. Does exactly
16312         what RootContext.CreateInterface did earlier, only it takes care of nested types 
16313         too.
16314
16315         (Interface::GetInterfaces): Move from RootContext here and port.
16316
16317         (Interface::GetInterfaceByName): Same here.
16318
16319         * rootcontext.cs (ResolveTree): Re-write.
16320
16321         (PopulateTypes): Re-write.
16322
16323         * class.cs (TypeContainer::Populate): Populate nested types too.
16324         (TypeContainer::Emit): Emit nested members too.
16325
16326         * typemanager.cs (AddUserType): Do not make use of the FullName property,
16327         instead just use the name argument passed in as it is already fully
16328         qualified.
16329
16330         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
16331         to TypeContainer mapping to see if a type is user-defined.
16332
16333         * class.cs (TypeContainer::CloseType): Implement. 
16334
16335         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
16336         the default constructor.
16337
16338         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
16339         twice.
16340
16341         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
16342
16343         * interface.cs (CloseType): Create the type here.
16344
16345         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
16346         the hierarchy.
16347
16348         Remove all the methods which are now in TypeContainer.
16349
16350 2001-10-10  Ravi Pratap  <ravi@ximian.com>
16351
16352         * delegate.cs (Define): Re-write bits to define the delegate
16353         correctly.
16354
16355 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
16356
16357         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
16358
16359         * expression.cs (ImplicitReferenceConversion): handle null as well
16360         as a source to convert to any reference type.
16361
16362         * statement.cs (Return): Perform any implicit conversions to
16363         expected return type.  
16364
16365         Validate use of return statement.  
16366
16367         * codegen.cs (EmitContext): Pass the expected return type here.
16368
16369         * class.cs (Method, Constructor, Property): Pass expected return
16370         type to EmitContext.
16371
16372 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
16373
16374         * expression.cs: Make DoResolve take an EmitContext instead of a
16375         TypeContainer.
16376
16377         Replaced `l' and `location' for `loc', for consistency.
16378
16379         (Error, Warning): Remove unneeded Tc argument.
16380
16381         * assign.cs, literal.cs, constant.cs: Update to new calling
16382         convention. 
16383
16384         * codegen.cs: EmitContext now contains a flag indicating whether
16385         code is being generated in a static method or not.
16386
16387         * cs-parser.jay: DecomposeQI, new function that replaces the old
16388         QualifiedIdentifier.  Now we always decompose the assembled
16389         strings from qualified_identifier productions into a group of
16390         memberaccesses.
16391
16392 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
16393
16394         * rootcontext.cs: Deal with field-less struct types correctly now
16395         by passing the size option to Define Type.
16396
16397         * class.cs: Removed hack that created one static field. 
16398
16399 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
16400
16401         * statement.cs: Moved most of the code generation here. 
16402
16403 2001-10-09  Ravi Pratap  <ravi@ximian.com>
16404
16405         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
16406         seem very right.
16407
16408         (ElementAccess): Remove useless bits for now - keep checks as the spec
16409         says.
16410
16411 2001-10-08  Ravi Pratap  <ravi@ximian.com>
16412
16413         * expression.cs (ElementAccess::DoResolve): Remove my crap code
16414         and start performing checks according to the spec.
16415
16416 2001-10-07  Ravi Pratap  <ravi@ximian.com>
16417
16418         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
16419         rank_specifiers instead.
16420
16421         (rank_specifiers): Change the order in which the rank specifiers are stored
16422
16423         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
16424
16425         * expression.cs (ElementAccess): Implement the LValue interface too.
16426
16427 2001-10-06  Ravi Pratap  <ravi@ximian.com>
16428
16429         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
16430         except that user defined conversions are not included.
16431
16432         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
16433         perform the conversion of the return type, if necessary.
16434
16435         (New::DoResolve): Check whether we are creating an array or an object
16436         and accordingly do the needful.
16437
16438         (New::Emit): Same here.
16439
16440         (New::DoResolve): Implement guts of array creation.
16441
16442         (New::FormLookupType): Helper function.
16443
16444 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
16445
16446         * codegen.cs: Removed most of the code generation here, and move the
16447         corresponding code generation bits to the statement classes. 
16448
16449         Added support for try/catch/finalize and throw.
16450
16451         * cs-parser.jay: Added support for try/catch/finalize.
16452
16453         * class.cs: Catch static methods having the flags override,
16454         virtual or abstract.
16455
16456         * expression.cs (UserCast): This user cast was not really doing
16457         what it was supposed to do.  Which is to be born in fully resolved
16458         state.  Parts of the resolution were being performed at Emit time! 
16459
16460         Fixed this code.
16461
16462 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
16463
16464         * expression.cs: Implicity convert the result from UserCast.
16465
16466 2001-10-05  Ravi Pratap  <ravi@ximian.com>
16467
16468         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
16469         prevented it from working correctly. 
16470
16471         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
16472         merely ConvertImplicit.
16473
16474 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
16475
16476         * typemanager.cs: Make the LookupTypeContainer function static,
16477         and not per-instance.  
16478
16479         * class.cs: Make static FindMembers (the one that takes a Type
16480         argument). 
16481
16482         * codegen.cs: Add EmitForeach here.
16483
16484         * cs-parser.jay: Make foreach a toplevel object instead of the
16485         inline expansion, as we need to perform semantic analysis on it. 
16486
16487 2001-10-05  Ravi Pratap  <ravi@ximian.com>
16488
16489         * expression.cs (Expression::ImplicitUserConversion): Rename to
16490         UserDefinedConversion.
16491
16492         (Expression::UserDefinedConversion): Take an extra argument specifying 
16493         whether we look for explicit user conversions too.
16494
16495         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
16496
16497         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
16498
16499         (ExplicitUserConversion): Make it a call to UserDefinedConversion
16500         with the appropriate arguments.
16501
16502         * cs-parser.jay (cast_expression): Record location too.
16503
16504         * expression.cs (Cast): Record location info.
16505
16506         (Expression::ConvertExplicit): Take location argument.
16507
16508         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
16509         to determine if we are doing explicit conversions.
16510
16511         (UserCast::Emit): Update accordingly.
16512
16513         (Expression::ConvertExplicit): Report an error if everything fails.
16514
16515         * ../errors/cs0030.cs : Add.
16516
16517 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
16518
16519         * modifiers.cs: If the ABSTRACT keyword is present, also set the
16520         virtual and newslot bits. 
16521
16522         * class.cs (TypeContainer::RegisterRequiredImplementations):
16523         Record methods we need.
16524
16525         (TypeContainer::MakeKey): Helper function to make keys for
16526         MethodBases, since the Methodbase key is useless.
16527
16528         (TypeContainer::Populate): Call RegisterRequiredImplementations
16529         before defining the methods.   
16530
16531         Create a mapping for method_builders_to_methods ahead of time
16532         instead of inside a tight loop.
16533
16534         (::RequireMethods):  Accept an object as the data to set into the
16535         hashtable so we can report interface vs abstract method mismatch.
16536
16537 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16538
16539         * report.cs: Make all of it static.
16540
16541         * rootcontext.cs: Drop object_type and value_type computations, as
16542         we have those in the TypeManager anyways.
16543
16544         Drop report instance variable too, now it is a global.
16545
16546         * driver.cs: Use try/catch on command line handling.
16547
16548         Add --probe option to debug the error reporting system with a test
16549         suite. 
16550
16551         * report.cs: Add support for exiting program when a probe
16552         condition is reached.
16553
16554 2001-10-03  Ravi Pratap  <ravi@ximian.com>
16555
16556         * expression.cs (Binary::DoNumericPromotions): Fix the case when
16557         we do a forcible conversion regardless of type, to check if 
16558         ForceConversion returns a null.
16559
16560         (Binary::error19): Use location to report error.
16561
16562         (Unary::error23): Use location here too.
16563
16564         * ../errors/cs0019.cs : Check in.
16565
16566         * ../errors/cs0023.cs : Check in.
16567
16568         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
16569         case of a non-null MethodInfo object with a length of 0 !
16570
16571         (Binary::ResolveOperator): Flag error if overload resolution fails to find
16572         an applicable member - according to the spec :-)
16573         Also fix logic to find members in base types.
16574
16575         (Unary::ResolveOperator): Same here.
16576
16577         (Unary::report23): Change name to error23 and make first argument a TypeContainer
16578         as I was getting thoroughly confused between this and error19 :-)
16579
16580         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
16581         (::FindMostEncompassedType): Implement.
16582         (::FindMostEncompassingType): Implement.
16583         (::StandardConversionExists): Implement.
16584
16585         (UserImplicitCast): Re-vamp. We now need info about most specific
16586         source and target types so that we can do the necessary conversions.
16587
16588         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
16589         mathematical union with no duplicates.
16590
16591 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
16592
16593         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
16594         in order from base classes to child classes, so that we can in
16595         child classes look up in our parent for method names and
16596         attributes (required for handling abstract, virtual, new, override
16597         constructs: we need to instrospect our base class, and if we dont
16598         populate the classes in order, the introspection might be
16599         incorrect.  For example, a method could query its parent before
16600         the parent has any methods and would determine that the parent has
16601         no abstract methods (while it could have had them)).
16602
16603         (RootContext::CreateType): Record the order in which we define the
16604         classes.
16605
16606 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
16607
16608         * class.cs (TypeContainer::Populate): Also method definitions can
16609         fail now, keep track of this.
16610
16611         (TypeContainer::FindMembers): Implement support for
16612         DeclaredOnly/noDeclaredOnly flag.
16613
16614         (Constructor::Emit) Return the ConstructorBuilder.
16615
16616         (Method::Emit) Return the MethodBuilder. 
16617         Check for abstract or virtual methods to be public.
16618
16619         * rootcontext.cs (RootContext::CreateType): Register all the
16620         abstract methods required for the class to be complete and the
16621         interface methods that must be implemented. 
16622
16623         * cs-parser.jay: Report error 501 (method requires body if it is
16624         not marked abstract or extern).
16625
16626         * expression.cs (TypeOf::Emit): Implement.
16627
16628         * typemanager.cs: runtime_handle_type, new global type.
16629
16630         * class.cs (Property::Emit): Generate code for properties.
16631
16632 2001-10-02  Ravi Pratap  <ravi@ximian.com>
16633
16634         * expression.cs (Unary::ResolveOperator): Find operators on base type
16635         too - we now conform exactly to the spec.
16636
16637         (Binary::ResolveOperator): Same here.
16638
16639         * class.cs (Operator::Define): Fix minor quirk in the tests.
16640
16641         * ../errors/cs0215.cs : Added.
16642
16643         * ../errors/cs0556.cs : Added.
16644
16645         * ../errors/cs0555.cs : Added.
16646
16647 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16648
16649         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
16650         single integer which is really efficient
16651
16652 2001-10-01  Ravi Pratap  <ravi@ximian.com>
16653
16654         *  expression.cs (Expression::ImplicitUserConversion): Use location
16655         even in the case when we are examining True operators.
16656  
16657         * class.cs (Operator::Define): Perform extensive checks to conform
16658         with the rules for operator overloading in the spec.
16659
16660         * expression.cs (Expression::ImplicitReferenceConversion): Implement
16661         some of the other conversions mentioned in the spec.
16662
16663         * typemanager.cs (array_type): New static member for the System.Array built-in
16664         type.
16665
16666         (cloneable_interface): For System.ICloneable interface.
16667
16668         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
16669         we start resolving the tree and populating types.
16670
16671         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
16672  
16673 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
16674
16675         * expression.cs (Expression::ExprClassFromMemberInfo,
16676         Expression::Literalize): Create literal expressions from
16677         FieldInfos which are literals.
16678
16679         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
16680         type casts, because they were wrong.  The test suite in tests
16681         caught these ones.
16682
16683         (ImplicitNumericConversion): ushort to ulong requires a widening
16684         cast. 
16685
16686         Int32 constant to long requires widening cast as well.
16687
16688         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
16689         for integers because the type on the stack is not i4.
16690
16691 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
16692
16693         * expression.cs (report118): require location argument. 
16694
16695         * parameter.cs: Do not dereference potential null value.
16696
16697         * class.cs: Catch methods that lack the `new' keyword when
16698         overriding a name.  Report warnings when `new' is used without
16699         anything being there to override.
16700
16701         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
16702
16703         * class.cs: Only add constructor to hashtable if it is non-null
16704         (as now constructors can fail on define).
16705
16706         (TypeManager, Class, Struct): Take location arguments.
16707
16708         Catch field instance initialization in structs as errors.
16709
16710         accepting_filter: a new filter for FindMembers that is static so
16711         that we dont create an instance per invocation.
16712
16713         (Constructor::Define): Catch errors where a struct constructor is
16714         parameterless 
16715
16716         * cs-parser.jay: Pass location information for various new
16717         constructs. 
16718
16719         * delegate.cs (Delegate): take a location argument.
16720
16721         * driver.cs: Do not call EmitCode if there were problesm in the
16722         Definition of the types, as many Builders wont be there. 
16723
16724         * decl.cs (Decl::Decl): Require a location argument.
16725
16726         * cs-tokenizer.cs: Handle properly hex constants that can not fit
16727         into integers, and find the most appropiate integer for it.
16728
16729         * literal.cs: Implement ULongLiteral.
16730
16731         * rootcontext.cs: Provide better information about the location of
16732         failure when CreateType fails.
16733
16734 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
16735
16736         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
16737         as well.
16738
16739         * expression.cs (Binary::CheckShiftArguments): Add missing type
16740         computation.
16741         (Binary::ResolveOperator): Add type to the logical and and logical
16742         or, Bitwise And/Or and Exclusive Or code paths, it was missing
16743         before.
16744
16745         (Binary::DoNumericPromotions): In the case where either argument
16746         is ulong (and most signed types combined with ulong cause an
16747         error) perform implicit integer constant conversions as well.
16748
16749 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16750
16751         * expression.cs (UserImplicitCast): Method should always be
16752         non-null. 
16753         (Invocation::BetterConversion): Simplified test for IntLiteral.
16754
16755         (Expression::ImplicitNumericConversion): Split this routine out.
16756         Put the code that performs implicit constant integer conversions
16757         here. 
16758
16759         (Expression::Resolve): Become a wrapper around DoResolve so we can
16760         check eclass and type being set after resolve.
16761
16762         (Invocation::Badness): Remove this dead function
16763
16764         (Binary::ResolveOperator): Do not compute the expensive argumnets
16765         unless we have a union for it.
16766
16767         (Probe::Emit): Is needs to do an isinst and then
16768         compare against null.
16769
16770         (::CanConvert): Added Location argument.  If the Location argument
16771         is null (Location.Null), then we do not report errors.  This is
16772         used by the `probe' mechanism of the Explicit conversion.  We do
16773         not want to generate an error for something that the user
16774         explicitly requested to be casted.  But the pipeline for an
16775         explicit cast first tests for potential implicit casts.
16776
16777         So for now, if the Location is null, it means `Probe only' to
16778         avoid adding another argument.   Might have to revise this
16779         strategy later.
16780
16781         (ClassCast): New class used to type cast objects into arbitrary
16782         classes (used in Explicit Reference Conversions).
16783
16784         Implement `as' as well.
16785
16786         Reverted all the patches from Ravi below: they were broken:
16787
16788                 * The use of `level' as a mechanism to stop recursive
16789                   invocations is wrong.  That was there just to catch the
16790                   bug with a strack trace but not as a way of addressing
16791                   the problem.
16792
16793                   To fix the problem we have to *understand* what is going
16794                   on and the interactions and come up with a plan, not
16795                   just get things going.
16796
16797                 * The use of the type conversion cache that I proposed
16798                   last night had an open topic: How does this work across
16799                   protection domains.  A user defined conversion might not
16800                   be public in the location where we are applying the
16801                   conversion, a different conversion might be selected
16802                   (ie, private A->B (better) but public B->A (worse),
16803                   inside A, A->B applies, but outside it, B->A will
16804                   apply).
16805
16806                 * On top of that (ie, even if the above is solved),
16807                   conversions in a cache need to be abstract.  Ie, `To
16808                   convert from an Int to a Short use an OpcodeCast', not
16809                   `To convert from an Int to a Short use the OpcodeCast on
16810                   the variable 5' (which is what this patch was doing).
16811
16812 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16813
16814         * expression.cs (Invocation::ConversionExists): Re-write to use
16815         the conversion cache
16816
16817         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
16818         cache all conversions done, not just user-defined ones.
16819
16820         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16821         to determine if a conversion exists instead of acutually trying to 
16822         perform the conversion. It's faster too.
16823
16824         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16825         and only then attempt the implicit conversion.
16826
16827 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16828
16829         * expression.cs (ConvertImplicit): Use a cache for conversions
16830         already found. Check level of recursion and bail out if necessary.
16831
16832 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16833
16834         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16835         Export standard methods that we expect for string operations.
16836
16837         * statement.cs (Block::UsageWarning): Track usage of variables and
16838         report the errors for not used variables.
16839
16840         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16841         operator. 
16842
16843 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16844
16845         * codegen.cs: remove unnneded code 
16846
16847         * expression.cs: Removed BuiltinTypeAccess class
16848
16849         Fix the order in which implicit conversions are
16850         done.  
16851
16852         The previous fixed dropped support for boxed conversions (adding a
16853         test to the test suite now)
16854
16855         (UserImplicitCast::CanConvert): Remove test for source being null,
16856         that code is broken.  We should not feed a null to begin with, if
16857         we do, then we should track the bug where the problem originates
16858         and not try to cover it up here.
16859
16860         Return a resolved expression of type UserImplicitCast on success
16861         rather than true/false.  Ravi: this is what I was talking about,
16862         the pattern is to use a static method as a "constructor" for
16863         objects. 
16864
16865         Also, do not create arguments until the very last minute,
16866         otherwise we always create the arguments even for lookups that
16867         will never be performed. 
16868
16869         (UserImplicitCast::Resolve): Eliminate, objects of type
16870         UserImplicitCast are born in a fully resolved state. 
16871
16872         * typemanager.cs (InitCoreTypes): Init also value_type
16873         (System.ValueType). 
16874
16875         * expression.cs (Cast::Resolve): First resolve the child expression.
16876
16877         (LValue): Add new method AddressOf to be used by
16878         the `&' operator.  
16879
16880         Change the argument of Store to take an EmitContext instead of an
16881         ILGenerator, because things like FieldExpr need to be able to call
16882         their children expression to generate the instance code. 
16883
16884         (Expression::Error, Expression::Warning): Sugar functions for
16885         reporting errors.
16886
16887         (Expression::MemberLookup): Accept a TypeContainer instead of a
16888         Report as the first argument.
16889
16890         (Expression::ResolvePrimary): Killed.  I still want to improve
16891         this as currently the code is just not right.
16892
16893         (Expression::ResolveMemberAccess): Simplify, but it is still
16894         wrong. 
16895
16896         (Unary::Resolve): Catch errors in AddressOf operators.
16897
16898         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16899         index to a byte for the short-version, or the compiler will choose
16900         the wrong Emit call, which generates the wrong data.
16901
16902         (ParameterReference::Emit, ::Store): same.
16903
16904         (FieldExpr::AddressOf): Implement.
16905
16906         * typemanager.cs: TypeManager: made public variable instead of
16907         property.
16908
16909         * driver.cs: document --fatal.
16910
16911         * report.cs (ErrorMessage, WarningMessage): new names for the old
16912         Error and Warning classes.
16913
16914         * cs-parser.jay (member_access): Turn built-in access to types
16915         into a normal simplename
16916
16917 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16918
16919         * expression.cs (Invocation::BetterConversion): Fix to cope
16920         with q being null, since this was introducing a bug.
16921
16922         * expression.cs (ConvertImplicit): Do built-in conversions first.
16923
16924 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16925
16926         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16927
16928 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16929
16930         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16931         I had introduced long ago (what's new ?).
16932
16933         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16934         the work of all the checking. 
16935         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16936         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16937
16938         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16939         that is the right way. 
16940
16941         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16942         overloading resolution. Use everywhere instead of cutting and pasting code.
16943
16944         (Binary::ResolveOperator): Use MakeUnionSet.
16945
16946         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16947         we have to convert to bool types. Not complete yet.
16948
16949 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16950
16951         * typemanager.cs (TypeManager::CSharpName): support ushort.
16952
16953         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16954         to provide an expression that performsn an implicit constant int
16955         conversion (section 6.1.6).
16956         (Expression::ConvertImplicitRequired): Reworked to include
16957         implicit constant expression conversions.
16958
16959         (Expression::ConvertNumericExplicit): Finished.
16960
16961         (Invocation::Emit): If InstanceExpression is null, then it means
16962         that we perform a call on this.
16963
16964 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16965
16966         * expression.cs (Unary::Emit): Remove some dead code.
16967         (Probe): Implement Resolve and Emit for `is'.
16968         (Expression::ConvertImplicitRequired): Attempt to do constant
16969         expression conversions here.  Maybe should be moved to
16970         ConvertImplicit, but I am not sure.
16971         (Expression::ImplicitLongConstantConversionPossible,
16972         Expression::ImplicitIntConstantConversionPossible): New functions
16973         that tell whether is it possible to apply an implicit constant
16974         expression conversion.
16975
16976         (ConvertNumericExplicit): Started work on explicit numeric
16977         conversions.
16978
16979         * cs-parser.jay: Update operator constants.
16980
16981         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16982         (Parameters::GetSignature): Hook up VerifyArgs here.
16983         (Parameters::VerifyArgs): Verifies that no two arguments have the
16984         same name. 
16985
16986         * class.cs (Operator): Update the operator names to reflect the
16987         ones that the spec expects (as we are just stringizing the
16988         operator names).
16989
16990         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16991         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16992         previous usage did only work for our methods.
16993         (Expression::ConvertImplicit): Handle decimal implicit numeric
16994         conversions as well.
16995         (Expression::InternalTypeConstructor): Used to invoke constructors
16996         on internal types for default promotions.
16997
16998         (Unary::Emit): Implement special handling for the pre/post
16999         increment/decrement for overloaded operators, as they need to have
17000         the same semantics as the other operators.
17001
17002         (Binary::ResolveOperator): ditto.
17003         (Invocation::ConversionExists): ditto.
17004         (UserImplicitCast::Resolve): ditto.
17005
17006 2001-09-26  Ravi Pratap  <ravi@ximian.com>
17007
17008         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
17009         operator, return after emitting body. Regression tests pass again !
17010
17011         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
17012         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
17013         (Invocation::OverloadResolve): Ditto.
17014         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
17015
17016         * everywhere : update calls to the above methods accordingly.
17017
17018 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
17019
17020         * assign.cs (Assign): Make it inherit from ExpressionStatement.
17021
17022         * expression.cs (ExpressionStatement): New base class used for
17023         expressions that can appear in statements, so that we can provide
17024         an alternate path to generate expression that do not leave a value
17025         on the stack.
17026
17027         (Expression::Emit, and all the derivatives): We no longer return
17028         whether a value is left on the stack or not.  Every expression
17029         after being emitted leaves a single value on the stack.
17030
17031         * codegen.cs (EmitContext::EmitStatementExpression): Use the
17032         facilties of ExpressionStatement if possible.
17033
17034         * cs-parser.jay: Update statement_expression.
17035
17036 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
17037
17038         * driver.cs: Change the wording of message
17039
17040 2001-09-25  Ravi Pratap  <ravi@ximian.com>
17041
17042         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
17043         the type of the expression to the return type of the method if
17044         we have an overloaded operator match ! The regression tests pass again !
17045         (Unary::ResolveOperator): Ditto.
17046
17047         * expression.cs (Invocation::ConversionExists): Correct the member lookup
17048         to find "op_Implicit", not "implicit" ;-)
17049         (UserImplicitCast): New class to take care of user-defined implicit conversions.
17050         (ConvertImplicit, ForceConversion): Take TypeContainer argument
17051
17052         * everywhere : Correct calls to the above accordingly.
17053
17054         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
17055         (ConvertImplicit): Do user-defined conversion if it exists.
17056
17057 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
17058
17059         * assign.cs: track location.
17060         (Resolve): Use implicit conversions on assignment.
17061
17062         * literal.cs: Oops.  Not good, Emit of short access values should
17063         pass (Bytes) or the wrong argument will be selected.
17064
17065         * expression.cs (Unary::Emit): Emit code for -expr.
17066
17067         (Unary::ResolveOperator): Handle `Substract' for non-constants
17068         (substract from zero from the non-constants).
17069         Deal with Doubles as well. 
17070
17071         (Expression::ConvertImplicitRequired): New routine that reports an
17072         error if no implicit conversion exists. 
17073
17074         (Invocation::OverloadResolve): Store the converted implicit
17075         expressions if we make them
17076
17077 2001-09-24  Ravi Pratap  <ravi@ximian.com>
17078
17079         * class.cs (ConstructorInitializer): Take a Location argument.
17080         (ConstructorBaseInitializer): Same here.
17081         (ConstructorThisInitializer): Same here.
17082
17083         * cs-parser.jay : Update all calls accordingly.
17084
17085         * expression.cs (Unary, Binary, New): Take location argument.
17086         Update accordingly everywhere.
17087
17088         * cs-parser.jay : Update all calls to the above to take a location
17089         argument.
17090
17091         * class.cs : Ditto.
17092
17093 2001-09-24  Ravi Pratap  <ravi@ximian.com>
17094
17095         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
17096         (Invocation::BetterConversion): Same here
17097         (Invocation::ConversionExists): Ditto.
17098
17099         (Invocation::ConversionExists): Implement.
17100
17101 2001-09-22  Ravi Pratap  <ravi@ximian.com>
17102
17103         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
17104         Also take an additional TypeContainer argument.
17105
17106         * All over : Pass in TypeContainer as argument to OverloadResolve.
17107
17108         * typemanager.cs (CSharpName): Update to check for the string type and return
17109         that too.
17110
17111         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
17112         a given method.
17113
17114 2001-09-21  Ravi Pratap  <ravi@ximian.com>
17115
17116         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
17117         (Invocation::BetterFunction): Implement.
17118         (Invocation::BetterConversion): Implement.
17119         (Invocation::ConversionExists): Skeleton, no implementation yet.
17120
17121         Okay, things work fine !
17122
17123 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
17124
17125         * typemanager.cs: declare and load enum_type, delegate_type and
17126         void_type. 
17127
17128         * expression.cs (Expression::Emit): Now emit returns a value that
17129         tells whether a value is left on the stack or not.  This strategy
17130         might be reveted tomorrow with a mechanism that would address
17131         multiple assignments.
17132         (Expression::report118): Utility routine to report mismatches on
17133         the ExprClass.
17134
17135         (Unary::Report23): Report impossible type/operator combination
17136         utility function.
17137
17138         (Unary::IsIncrementableNumber): Whether the type can be
17139         incremented or decremented with add.
17140         (Unary::ResolveOperator): Also allow enumerations to be bitwise
17141         complemented. 
17142         (Unary::ResolveOperator): Implement ++, !, ~,
17143
17144         (Invocation::Emit): Deal with new Emit convetion.
17145
17146         * All Expression derivatives: Updated their Emit method to return
17147         whether they leave values on the stack or not.
17148
17149         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
17150         stack for expressions that are statements. 
17151
17152 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
17153
17154         * expression.cs (LValue): New interface.  Must be implemented by
17155         LValue objects.
17156         (LocalVariableReference, ParameterReference, FieldExpr): Implement
17157         LValue interface.
17158
17159         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
17160         interface for generating code, simplifies the code.
17161
17162 2001-09-20  Ravi Pratap  <ravi@ximian.com>
17163
17164         * expression.cs (everywhere): Comment out return statements in ::Resolve
17165         methods to avoid the warnings.
17166
17167 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
17168
17169         * driver.cs (parse): Report error 2001 if we can not open the
17170         source file.
17171
17172         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
17173         not resolve it.
17174
17175         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
17176         object. 
17177
17178         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
17179         otherwise nested blocks end up with the same index.
17180
17181         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
17182
17183         * expression.cs:  Instead of having FIXMEs in the Resolve
17184         functions, throw exceptions so it is obvious that we are facing a
17185         bug. 
17186
17187         * cs-parser.jay (invocation_expression): Pass Location information.
17188
17189         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
17190         Use a basename for those routines because .NET does not like paths
17191         on them. 
17192
17193         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
17194         already defined.
17195
17196 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
17197
17198         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
17199         are loading the correct data types (throws an exception if not).
17200         (TypeManager::InitCoreTypes): Use CoreLookupType
17201
17202         * expression.cs (Unary::ResolveOperator): return the child
17203         expression for expressions which are just +expr.
17204         (Unary::ResolveOperator): Return negative literals for -LITERAL
17205         expressions (otherwise they are Unary {Literal}).
17206         (Invocation::Badness): Take into account `Implicit constant
17207         expression conversions'.
17208
17209         * literal.cs (LongLiteral): Implement long literal class.
17210         (IntLiteral): export the `Value' of the intliteral. 
17211
17212 2001-09-19  Ravi Pratap  <ravi@ximian.com>
17213
17214         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
17215
17216         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
17217         instead of 'Operator'
17218
17219         * expression.cs (Binary::ResolveOperator): Update accordingly.
17220         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
17221         and 'Minus'
17222
17223         * cs-parser.jay (unary_expression): Update to use the new names.
17224
17225         * gen-treedump.cs (GetUnary): Same here.
17226
17227         * expression.cs (Unary::Resolve): Implement.
17228         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
17229         operators are found instead of making noise ;-)
17230         (Unary::ResolveOperator): New method to do precisely the same thing which
17231         Binary::ResolveOperator does for Binary expressions.
17232         (Unary.method, .Arguments): Add.
17233         (Unary::OperName): Implement.   
17234         (Unary::ForceConversion): Copy and Paste !
17235
17236         * class.cs (Operator::Define): Fix a small bug for the case when we have 
17237         a unary operator.
17238
17239         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
17240         for the inbuilt operators. Only overloading works for now ;-)
17241
17242 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
17243
17244         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
17245         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
17246
17247         * expression.cs (This::Emit): Implement. 
17248         (This::Resolve): Implement.
17249         (TypeOf:Resolve): Implement.
17250         (Expression::ResolveSimpleName): Add an implicit this to instance
17251         field references. 
17252         (MemberAccess::Resolve): Deal with Parameters and Fields. 
17253         Bind instance variable to Field expressions.
17254         (FieldExpr::Instance): New field used to track the expression that
17255         represents the object instance.
17256         (FieldExpr::Resolve): Track potential errors from MemberLookup not
17257         binding 
17258         (FieldExpr::Emit): Implement.
17259
17260         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
17261         the last instruction contains a return opcode to avoid generating
17262         the last `ret' instruction (this generates correct code, and it is
17263         nice to pass the peverify output).
17264
17265         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
17266         initializer for static and instance variables.
17267         (Constructor::Emit): Allow initializer to be null in the case of
17268         static constructors.  Only emit initializer for instance
17269         constructors. 
17270
17271         (TypeContainer::FindMembers): Return a null array if there are no
17272         matches.
17273
17274         Also fix the code for the MemberTypes.Method branch, as it was not
17275         scanning that for operators (or tried to access null variables before).
17276
17277         * assign.cs (Assign::Emit): Handle instance and static fields. 
17278
17279         * TODO: Updated.
17280
17281         * driver.cs: Stop compilation if there are parse errors.
17282
17283         * cs-parser.jay (constructor_declaration): Provide default base
17284         initializer for non-static constructors.
17285         (constructor_declarator): Do not provide a default base
17286         initializers if none was specified.
17287         Catch the fact that constructors should not have parameters.
17288
17289         * class.cs: Do not emit parent class initializers for static
17290         constructors, that should be flagged as an error.
17291
17292 2001-09-18  Ravi Pratap  <ravi@ximian.com>
17293
17294         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
17295         Move back code into TypeContainer::Populate.
17296
17297 2001-09-18  Ravi Pratap  <ravi@ximian.com>
17298
17299         * class.cs (TypeContainer::AddConstructor): Fix the check to
17300         compare against Name, not Basename. 
17301         (Operator::OpType): Change Plus and Minus to Add and Subtract.
17302
17303         * cs-parser.jay : Update accordingly.
17304
17305         * class.cs (TypeContainer::FindMembers): For the case where we are searching
17306         for methods, don't forget to look into the operators too.
17307         (RegisterMethodBuilder): Helper method to take care of this for
17308         methods, constructors and operators.
17309         (Operator::Define): Completely revamp.
17310         (Operator.OperatorMethod, MethodName): New fields.
17311         (TypeContainer::Populate): Move the registering of builders into
17312         RegisterMethodBuilder.
17313         (Operator::Emit): Re-write.
17314
17315         * expression.cs (Binary::Emit): Comment out code path to emit method
17316         invocation stuff for the case when we have a user defined operator. I am
17317         just not able to get it right !
17318
17319 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
17320
17321         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
17322         argument. 
17323
17324         (Expression::MemberLookup): Provide a version that allows to
17325         specify the MemberTypes and BindingFlags. 
17326
17327         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
17328         so it was not fetching variable information from outer blocks.
17329
17330         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
17331         Beforefieldinit as it was buggy.
17332
17333         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
17334         that Ravi put here.  
17335
17336         * class.cs (Constructor::Emit): Only emit if block is not null.
17337         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
17338         deal with this by semantically definining it as if the user had
17339         done it.
17340
17341         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
17342         constructors as we now "emit" them at a higher level.
17343
17344         (TypeContainer::DefineDefaultConstructor): Used to define the
17345         default constructors if none was provided.
17346
17347         (ConstructorInitializer): Add methods Resolve and Emit. 
17348
17349         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
17350
17351 2001-09-17  Ravi Pratap  <ravi@ximian.com>
17352
17353         * class.cs (TypeContainer::EmitDefaultConstructor): Register
17354         the default constructor builder with our hashtable for methodbuilders
17355         to methodcores.
17356
17357         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
17358         and argument_count is 0 in which case we have a match.
17359         (Binary::ResolveOperator): More null checking and miscellaneous coding
17360         style cleanup.
17361
17362 2001-09-17  Ravi Pratap  <ravi@ximian.com>
17363
17364         * rootcontext.cs (IsNameSpace): Compare against null.
17365
17366         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
17367
17368         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
17369         and Unary::Operator.
17370
17371         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
17372         accordingly.
17373
17374         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
17375         we have overloaded operators.
17376         (Binary::ResolveOperator): Implement the part which does the operator overload
17377         resolution.
17378
17379         * class.cs (Operator::Emit): Implement.
17380         (TypeContainer::Emit): Emit the operators we have too.
17381
17382         * expression.cs (Binary::Emit): Update to emit the appropriate code for
17383         the case when we have a user-defined operator.
17384
17385 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
17386
17387         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
17388
17389 2001-09-16  Ravi Pratap  <ravi@ximian.com>
17390
17391         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
17392         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
17393         (Constructor::Emit): Implement.
17394         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
17395         if we have no work to do. 
17396         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
17397         Emit method.
17398
17399         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
17400         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
17401
17402         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
17403         of parent.parent.
17404
17405 2001-09-15  Ravi Pratap  <ravi@ximian.com>
17406
17407         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
17408         in the source.
17409         (Tree::RecordNamespace): Method to do what the name says ;-)
17410         (Tree::Namespaces): Property to get at the namespaces hashtable.
17411
17412         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
17413         keep track.
17414
17415         * rootcontext.cs (IsNamespace): Fixed it :-)
17416
17417 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
17418
17419         * class.cs (TypeContainer::FindMembers): Add support for
17420         constructors. 
17421         (MethodCore): New class that encapsulates both the shared aspects
17422         of a Constructor and a Method.  
17423         (Method, Constructor): Factored pieces into MethodCore.
17424
17425         * driver.cs: Added --fatal which makes errors throw exceptions.
17426         Load System assembly as well as part of the standard library.
17427
17428         * report.cs: Allow throwing exceptions on errors for debugging.
17429
17430         * modifiers.cs: Do not use `parent', instead use the real type
17431         container to evaluate permission settings.
17432
17433         * class.cs: Put Ravi's patch back in.  He is right, and we will
17434         have to cope with the
17435
17436 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17437
17438         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
17439         FamORAssem, not FamANDAssem.
17440
17441 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
17442
17443         * driver.cs: Added --parse option that only parses its input files
17444         and terminates.
17445
17446         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
17447         incorrect.  IsTopLevel is not used to tell whether an object is
17448         root_types or not (that can be achieved by testing this ==
17449         root_types).  But to see if this is a top-level *class* (not
17450         necessarly our "toplevel" container). 
17451
17452 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17453
17454         * enum.cs (Enum::Define): Modify to call the Lookup method on the
17455         parent instead of a direct call to GetType.
17456
17457 2001-09-14  Ravi Pratap  <ravi@ximian.com>
17458
17459         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
17460         Modifiers.TypeAttr. This should just be a call to that method.
17461
17462         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
17463         object so that we can determine if we are top-level or not.
17464
17465         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
17466         TypeContainer too.
17467
17468         * enum.cs (Enum::Define): Ditto.
17469
17470         * modifiers.cs (FieldAttr): Re-write.
17471
17472         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
17473         (TypeContainer::HaveStaticConstructor): New property to provide access
17474         to precisely that info.
17475
17476         * modifiers.cs (MethodAttr): Re-write.
17477         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
17478
17479         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
17480         of top-level types as claimed.
17481
17482 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17483
17484         * expression.cs (MemberLookup): Fruitless attempt to lookup
17485         constructors.  Maybe I need to emit default constructors?  That
17486         might be it (currently .NET emits this for me automatically).
17487         (Invocation::OverloadResolve): Cope with Arguments == null.
17488         (Invocation::EmitArguments): new function, shared by the new
17489         constructor and us.
17490         (Invocation::Emit): Handle static and instance methods.  Emit
17491         proper call instruction for virtual or non-virtual invocations.
17492         (New::Emit): Implement.
17493         (New::Resolve): Implement.
17494         (MemberAccess:Resolve): Implement.
17495         (MethodGroupExpr::InstanceExpression): used conforming to the spec
17496         to track instances.
17497         (FieldExpr::Resolve): Set type.
17498
17499         * support.cs: Handle empty arguments.
17500                 
17501         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
17502         SimpleLookup): Auxiliary routines to help parse a qualifier
17503         identifier.  
17504
17505         Update qualifier_identifier rule.
17506
17507         * codegen.cs: Removed debugging messages.
17508
17509         * class.cs: Make this a global thing, this acts just as a "key" to
17510         objects that we might have around.
17511
17512         (Populate): Only initialize method_builders_to_methods once.
17513
17514         * expression.cs (PropertyExpr): Initialize type from the
17515         PropertyType. 
17516
17517         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
17518         Resolve pattern.  Attempt to implicitly convert value to boolean.
17519         Emit code.
17520
17521         * expression.cs: Set the type for the int32/int32 argument case.
17522         (Binary::ResolveOperator): Set the return type to boolean for
17523         comparission operators
17524
17525         * typemanager.cs: Remove debugging print code.
17526
17527         (Invocation::Resolve): resolve type.
17528
17529         * class.cs: Allocate a MemberInfo of the correct size, as the code
17530         elsewhere depends on the test to reflect the correct contents.
17531
17532         (Method::) Keep track of parameters, due to System.Reflection holes
17533
17534         (TypeContainer::Populate): Keep track of MethodBuilders to Method
17535         mapping here.
17536
17537         (TypeContainer::FindMembers): Use ArrayList and then copy an array
17538         of the exact size and return that.
17539
17540         (Class::LookupMethodByBuilder): New function that maps
17541         MethodBuilders to its methods.  Required to locate the information
17542         on methods because System.Reflection bit us again.
17543
17544         * support.cs: New file, contains an interface ParameterData and
17545         two implementations: ReflectionParameters and InternalParameters
17546         used to access Parameter information.  We will need to grow this
17547         as required.
17548
17549         * expression.cs (Invocation::GetParameterData): implement a cache
17550         and a wrapper around the ParameterData creation for methods. 
17551         (Invocation::OverloadResolve): Use new code.
17552
17553 2001-09-13  Ravi Pratap  <ravi@ximian.com>
17554
17555         * class.cs (TypeContainer::EmitField): Remove and move into 
17556         (Field::Define): here and modify accordingly.
17557         (Field.FieldBuilder): New member.
17558         (TypeContainer::Populate): Update accordingly.
17559         (TypeContainer::FindMembers): Implement.
17560
17561 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
17562
17563         * statement.cs: (VariableInfo::VariableType): New field to be
17564         initialized with the full type once it is resolved. 
17565
17566 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
17567
17568         * parameter.cs (GetParameterInfo): Use a type cache to compute
17569         things only once, and to reuse this information
17570
17571         * expression.cs (LocalVariableReference::Emit): Implement.
17572         (OpcodeCast::Emit): fix.
17573
17574         (ParameterReference::Resolve): Implement.
17575         (ParameterReference::Emit): Implement.
17576
17577         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
17578         that are expressions need to stay as Expressions.
17579
17580         * typemanager.cs (CSharpName): Returns the C# name of a type if
17581         possible. 
17582
17583         * expression.cs (Expression::ConvertImplicit): New function that
17584         implements implicit type conversions.
17585
17586         (Expression::ImplicitReferenceConversion): Implements implicit
17587         reference conversions.
17588
17589         (EmptyCast): New type for transparent casts.
17590
17591         (OpcodeCast): New type for casts of types that are performed with
17592         a sequence of bytecodes.
17593
17594         (BoxedCast): New type used for casting value types into reference
17595         types.  Emits a box opcode.
17596
17597         (Binary::DoNumericPromotions): Implements numeric promotions of
17598         and computation of the Binary::Type.
17599
17600         (Binary::EmitBranchable): Optimization.
17601
17602         (Binary::Emit): Implement code emission for expressions.
17603
17604         * typemanager.cs (TypeManager): Added two new core types: sbyte
17605         and byte.
17606
17607 2001-09-12  Ravi Pratap  <ravi@ximian.com>
17608
17609         * class.cs (TypeContainer::FindMembers): Method which does exactly
17610         what Type.FindMembers does, only we don't have to use reflection. No
17611         implementation yet.
17612
17613         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
17614         typecontainer objects as we need to get at them.
17615         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
17616
17617         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
17618         typecontainer object.
17619
17620         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
17621         of just a Report object.
17622
17623 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17624
17625         * class.cs (Event::Define): Go back to using the prefixes "add_" and
17626         "remove_"
17627         (TypeContainer::Populate): Now define the delegates of the type too.
17628         (TypeContainer.Delegates): Property to access the list of delegates defined
17629         in the type.
17630
17631         * delegates.cs (Delegate::Define): Implement partially.
17632
17633         * modifiers.cs (TypeAttr): Handle more flags.
17634
17635 2001-09-11  Ravi Pratap  <ravi@ximian.com>
17636
17637         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
17638         and not <=
17639         (Operator::Define): Re-write logic to get types by using the LookupType method
17640         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
17641         (Indexer::Define): Ditto.
17642         (Event::Define): Ditto.
17643         (Property::Define): Ditto.
17644
17645 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17646
17647         * class.cs (TypeContainer::Populate): Now define operators too. 
17648         (TypeContainer.Operators): New property to access the list of operators
17649         in a type.
17650         (Operator.OperatorMethodBuilder): New member to hold the method builder
17651         for the operator we are defining.
17652         (Operator::Define): Implement.
17653
17654 2001-09-10  Ravi Pratap  <ravi@ximian.com>
17655
17656         * class.cs (Event::Define): Make the prefixes of the accessor methods
17657         addOn_ and removeOn_ 
17658
17659         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
17660         of the location being passed in too. Ideally, this should go later since all
17661         error reporting should be done through the Report object.
17662
17663         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
17664         (Populate): Iterate thru the indexers we have and define them too.
17665         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
17666         for the get and set accessors.
17667         (Indexer::Define): Implement.
17668
17669 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
17670
17671         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
17672         my previous implementation, did not work.
17673
17674         * typemanager.cs: Add a couple of missing types (the longs).
17675
17676         * literal.cs: Use TypeManager.bool_type instead of getting it.
17677
17678         * expression.cs (EventExpr): New kind of expressions.
17679         (Expressio::ExprClassFromMemberInfo): finish
17680
17681 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
17682
17683         * assign.cs: Emit stores to static fields differently.
17684
17685 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17686
17687         * Merge in changes and adjust code to tackle conflicts. Backed out my
17688         code in Assign::Resolve ;-) 
17689
17690 2001-09-08  Ravi Pratap  <ravi@ximian.com>
17691
17692         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
17693         instead Report.Error and also pass in the location.
17694         (CSharpParser::Lexer): New readonly property to return the reference
17695         to the Tokenizer object.
17696         (declare_local_variables): Use Report.Error with location instead of plain 
17697         old error.
17698         (CheckDef): Ditto.
17699
17700         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
17701         (Operator.CheckBinaryOperator): Ditto.
17702
17703         * cs-parser.jay (operator_declarator): Update accordingly.
17704
17705         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
17706         (CheckBinaryOperator): Same here.
17707
17708         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
17709         on the name without any prefixes of namespace names etc. This is because we
17710         already might have something already fully qualified like 
17711         'System.Console.WriteLine'
17712
17713         * assign.cs (Resolve): Begin implementation. Stuck ;-)
17714
17715 2001-09-07  Ravi Pratap  <ravi@ximian.com>
17716
17717         * cs-tokenizer.cs (location): Return a string which also contains
17718         the file name.
17719
17720         * expression.cs (ElementAccess): New class for expressions of the
17721         type 'element access.'
17722         (BaseAccess): New class for expressions of the type 'base access.'
17723         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
17724         respectively.
17725
17726         * cs-parser.jay (element_access): Implement action.
17727         (base_access): Implement actions.
17728         (checked_expression, unchecked_expression): Implement.
17729
17730         * cs-parser.jay (local_variable_type): Correct and implement.
17731         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
17732
17733         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
17734
17735         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
17736         name and the specifiers.
17737
17738         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
17739
17740         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
17741         making them all public ;-)
17742
17743         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
17744         class anyways.
17745
17746 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
17747
17748         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
17749         PropertyExprs.
17750         (FieldExpr, PropertyExprs): New resolved expressions.
17751         (SimpleName::MemberStaticCheck): Perform static checks for access
17752         to non-static fields on static methods. Maybe this should be
17753         generalized for MemberAccesses. 
17754         (SimpleName::ResolveSimpleName): More work on simple name
17755         resolution. 
17756
17757         * cs-parser.jay (primary_expression/qualified_identifier): track
17758         the parameter index.
17759
17760         * codegen.cs (CodeGen::Save): Catch save exception, report error.
17761         (EmitContext::EmitBoolExpression): Chain to expression generation
17762         instead of temporary hack.
17763         (::EmitStatementExpression): Put generic expression code generation.
17764
17765         * assign.cs (Assign::Emit): Implement variable assignments to
17766         local variables, parameters and fields.
17767
17768 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
17769
17770         * statement.cs (Block::GetVariableInfo): New method, returns the
17771         VariableInfo for a variable name in a block.
17772         (Block::GetVariableType): Implement in terms of GetVariableInfo
17773
17774         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
17775         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
17776
17777 2001-09-06  Ravi Pratap  <ravi@ximian.com>
17778
17779         * cs-parser.jay (operator_declaration): Continue on my quest : update
17780         to take attributes argument.
17781         (event_declaration): Ditto.
17782         (enum_declaration): Ditto.
17783         (indexer_declaration): Ditto.
17784
17785         * class.cs (Operator::Operator): Update constructor accordingly.
17786         (Event::Event): Ditto.
17787
17788         * delegate.cs (Delegate::Delegate): Same here.
17789
17790         * enum.cs (Enum::Enum): Same here.
17791
17792 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17793
17794         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
17795
17796         * ../tests/cs0658.cs : New file to demonstrate error 0658.
17797
17798         * attribute.cs (Attributes): New class to encapsulate all attributes which were
17799         being passed around as an arraylist.
17800         (Attributes::AddAttribute): Method to add attribute sections.
17801
17802         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
17803         (struct_declaration): Update accordingly.
17804         (constant_declaration): Update.
17805         (field_declaration): Update.
17806         (method_header): Update.
17807         (fixed_parameter): Update.
17808         (parameter_array): Ditto.
17809         (property_declaration): Ditto.
17810         (destructor_declaration): Ditto.
17811
17812         * class.cs (Struct::Struct): Update constructors accordingly.
17813         (Class::Class): Ditto.
17814         (Field::Field): Ditto.
17815         (Method::Method): Ditto.
17816         (Property::Property): Ditto.
17817         (TypeContainer::OptAttribute): update property's return type.
17818
17819         * interface.cs (Interface.opt_attributes): New member.
17820         (Interface::Interface): Update to take the extra Attributes argument.
17821
17822         * parameter.cs (Parameter::Parameter): Ditto.
17823
17824         * constant.cs (Constant::Constant): Ditto.
17825
17826         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17827         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17828         the attributes as a parameter.
17829         (InterfaceProperty): Update constructor call.
17830         (InterfaceEvent): Ditto.
17831         (InterfaceMethod): Ditto.
17832         (InterfaceIndexer): Ditto.
17833
17834         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17835         pass the attributes too.
17836         (interface_event_declaration): Ditto.
17837         (interface_property_declaration): Ditto.
17838         (interface_method_declaration): Ditto.
17839         (interface_declaration): Ditto.
17840
17841 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17842
17843         * class.cs (Method::Define): Track the "static Main" definition to
17844         create an entry point. 
17845
17846         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17847         EntryPoint if we find it. 
17848
17849         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17850         (EmitContext::ig): Make this variable public.
17851
17852         * driver.cs: Make the default output file be the first file name
17853         with the .exe extension.  
17854
17855         Detect empty compilations
17856
17857         Handle various kinds of output targets.  Handle --target and
17858         rename -t to --dumper.
17859
17860         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17861         methods inherited from Expression return now an Expression.  This
17862         will is used during the tree rewriting as we resolve them during
17863         semantic analysis.
17864
17865         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17866         the spec.  Missing entirely is the information about
17867         accessability of elements of it.
17868
17869         (Expression::ExprClassFromMemberInfo): New constructor for
17870         Expressions that creates a fully initialized Expression based on
17871         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17872         a Type.
17873
17874         (Invocation::Resolve): Begin implementing resolution of invocations.
17875
17876         * literal.cs (StringLiteral):  Implement Emit.
17877
17878 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17879
17880         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17881         member.
17882
17883 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17884
17885         * cs-parser.jay (attribute_arguments): Implement actions.
17886         (attribute): Fix bug in production. Implement action.
17887         (attribute_list): Implement.
17888         (attribute_target): Implement.
17889         (attribute_target_specifier, opt_target_specifier): Implement
17890         (CheckAttributeTarget): New method to check if the attribute target
17891         is valid.
17892         (attribute_section): Implement.
17893         (opt_attributes): Implement.
17894
17895         * attribute.cs : New file to handle attributes.
17896         (Attribute): Class to hold attribute info.
17897
17898         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17899         (attribute_section): Modify production to use 2 different rules to 
17900         achieve the same thing. 1 s/r conflict down !
17901         Clean out commented, useless, non-reducing dimension_separator rules.
17902
17903         * class.cs (TypeContainer.attributes): New member to hold list
17904         of attributes for a type.
17905         (Struct::Struct): Modify to take one more argument, the attribute list.
17906         (Class::Class): Ditto.
17907         (Field::Field): Ditto.
17908         (Method::Method): Ditto.
17909         (Property::Property): Ditto.
17910
17911         * cs-parser.jay (struct_declaration): Update constructor call to
17912         pass in the attributes too.
17913         (class_declaration): Ditto.
17914         (constant_declaration): Ditto.
17915         (field_declaration): Ditto.
17916         (method_header): Ditto.
17917         (fixed_parameter): Ditto.
17918         (parameter_array): Ditto.
17919         (property_declaration): Ditto.
17920
17921         * constant.cs (Constant::Constant): Update constructor similarly.
17922         Use System.Collections.
17923
17924         * parameter.cs (Parameter::Parameter): Update as above.
17925
17926 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17927
17928         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17929         (TypeContainer.delegates): New member to hold list of delegates.
17930
17931         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17932         this time as I seem to be on crack ;-)
17933
17934 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17935
17936         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17937         tell whether an identifier represents a namespace.
17938
17939         * expression.cs (NamespaceExpr): A namespace expression, used only
17940         temporarly during expression resolution.
17941         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17942         utility functions to resolve names on expressions.
17943
17944 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17945
17946         * codegen.cs: Add hook for StatementExpressions. 
17947
17948         * class.cs: Fix inverted test for static flag in methods.
17949
17950 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17951
17952         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17953         to make it coincide with MS' number.
17954         (Operator::CheckBinaryOperator): Ditto.
17955
17956         * ../errors/errors.txt : Remove error numbers added earlier.
17957
17958         * ../errors/cs1019.cs : Test case for error # 1019
17959
17960         * ../errros/cs1020.cs : Test case for error # 1020
17961
17962         * cs-parser.jay : Clean out commented cruft.
17963         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17964         used anywhere - non-reducing rule.
17965         (namespace_declarations): Non-reducing rule - comment out.
17966
17967         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17968         with TypeContainer::AddEnum.
17969
17970         * delegate.cs : New file for delegate handling classes.
17971         (Delegate): Class for declaring delegates.
17972
17973         * makefile : Update.
17974
17975         * cs-parser.jay (delegate_declaration): Implement.
17976
17977 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17978
17979         * class.cs (Event::Define): Implement.
17980         (Event.EventBuilder): New member.
17981
17982         * class.cs (TypeContainer::Populate): Update to define all enums and events
17983         we have.
17984         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17985         readonly fields for all these cases ?
17986
17987 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17988
17989         * class.cs (Property): Revamp to use the convention of making fields readonly.
17990         Accordingly modify code elsewhere.
17991
17992         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17993         the Define method of the Property class.
17994
17995         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17996         trivial bug.
17997         (TypeContainer::Populate): Update to define all the properties we have. Also
17998         define all enumerations.
17999
18000         * enum.cs (Define): Implement.
18001
18002 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
18003
18004         * cs-parser.jay (overloadable_operator): The semantic value is an
18005         enum of the Operator class.
18006         (operator_declarator): Implement actions.
18007         (operator_declaration): Implement.
18008
18009         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
18010         validity of definitions.
18011         (Operator::CheckBinaryOperator): Static method to check for binary operators
18012         (TypeContainer::AddOperator): New method to add an operator to a type.
18013
18014         * cs-parser.jay (indexer_declaration): Added line to actually call the
18015         AddIndexer method so it gets added ;-)
18016
18017         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
18018         already taken care of by the MS compiler ?  
18019
18020 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
18021
18022         * class.cs (Operator): New class for operator declarations.
18023         (Operator::OpType): Enum for the various operators.
18024
18025 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
18026
18027         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
18028         ostensibly handle this in semantic analysis.
18029
18030         * cs-parser.jay (general_catch_clause): Comment out
18031         (specific_catch_clauses, specific_catch_clause): Ditto.
18032         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
18033         (catch_args, opt_catch_args): New productions.
18034         (catch_clause): Rewrite to use the new productions above
18035         (catch_clauses): Modify accordingly.
18036         (opt_catch_clauses): New production to use in try_statement
18037         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
18038         and re-write the code in the actions to extract the specific and
18039         general catch clauses by being a little smart ;-)
18040
18041         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
18042         Hooray, try and catch statements parse fine !
18043
18044 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18045
18046         * statement.cs (Block::GetVariableType): Fix logic to extract the type
18047         string from the hashtable of variables.
18048
18049         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
18050         I end up making that mistake ;-)
18051         (catch_clauses): Fixed gross error which made Key and Value of the 
18052         DictionaryEntry the same : $1 !!
18053
18054 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18055
18056         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
18057
18058         * cs-parser.jay (event_declaration): Correct to remove the semicolon
18059         when the add and remove accessors are specified. 
18060
18061 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
18062
18063         * cs-parser.jay (IndexerDeclaration): New helper class to hold
18064         information about indexer_declarator.
18065         (indexer_declarator): Implement actions.
18066         (parsing_indexer): New local boolean used to keep track of whether
18067         we are parsing indexers or properties. This is necessary because 
18068         implicit_parameters come into picture even for the get accessor in the 
18069         case of an indexer.
18070         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
18071
18072         * class.cs (Indexer): New class for indexer declarations.
18073         (TypeContainer::AddIndexer): New method to add an indexer to a type.
18074         (TypeContainer::indexers): New member to hold list of indexers for the
18075         type.
18076
18077 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
18078
18079         * cs-parser.jay (add_accessor_declaration): Implement action.
18080         (remove_accessor_declaration): Implement action.
18081         (event_accessors_declaration): Implement
18082         (variable_declarators): swap statements for first rule - trivial.
18083
18084         * class.cs (Event): New class to hold information about event
18085         declarations.
18086         (TypeContainer::AddEvent): New method to add an event to a type
18087         (TypeContainer::events): New member to hold list of events.
18088
18089         * cs-parser.jay (event_declaration): Implement actions.
18090
18091 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
18092
18093         * cs-parser.jay (dim_separators): Implement. Make it a string
18094         concatenating all the commas together, just as they appear.
18095         (opt_dim_separators): Modify accordingly
18096         (rank_specifiers): Update accordingly. Basically do the same
18097         thing - instead, collect the brackets here.
18098         (opt_rank_sepcifiers): Modify accordingly.
18099         (array_type): Modify to actually return the complete type string
18100         instead of ignoring the rank_specifiers.
18101         (expression_list): Implement to collect the expressions
18102         (variable_initializer): Implement. We make it a list of expressions
18103         essentially so that we can handle the array_initializer case neatly too.
18104         (variable_initializer_list): Implement.
18105         (array_initializer): Make it a list of variable_initializers
18106         (opt_array_initializer): Modify accordingly.
18107
18108         * expression.cs (New::NType): Add enumeration to help us
18109         keep track of whether we have an object/delegate creation
18110         or an array creation.
18111         (New:NewType, New::Rank, New::Indices, New::Initializers): New
18112         members to hold data about array creation.
18113         (New:New): Modify to update NewType
18114         (New:New): New Overloaded contructor for the array creation
18115         case.
18116
18117         * cs-parser.jay (array_creation_expression): Implement to call
18118         the overloaded New constructor.
18119
18120 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
18121
18122         * class.cs (TypeContainer::Constructors): Return member
18123         constructors instead of returning null.
18124
18125 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
18126
18127         * typemanager.cs (InitCoreTypes): Initialize the various core
18128         types after we have populated the type manager with the user
18129         defined types (this distinction will be important later while
18130         compiling corlib.dll)
18131
18132         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
18133         on Expression Classification.  Now all expressions have a method
18134         `Resolve' and a method `Emit'.
18135
18136         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
18137         generation from working.     Also add some temporary debugging
18138         code. 
18139
18140 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
18141
18142         * codegen.cs: Lots of code generation pieces.  This is only the
18143         beginning, will continue tomorrow with more touches of polish.  We
18144         handle the fundamentals of if, while, do, for, return.  Others are
18145         trickier and I need to start working on invocations soon.
18146
18147         * gen-treedump.cs: Bug fix, use s.Increment here instead of
18148         s.InitStatement. 
18149
18150         * codegen.cs (EmitContext): New struct, used during code
18151         emission to keep a context.   Most of the code generation will be
18152         here. 
18153
18154         * cs-parser.jay: Add embedded blocks to the list of statements of
18155         this block.  So code generation proceeds in a top down fashion.
18156
18157 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
18158
18159         * statement.cs: Add support for multiple child blocks.
18160
18161 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
18162
18163         * codegen.cs (EmitCode): New function, will emit the code for a
18164         Block of code given a TypeContainer and its ILGenerator. 
18165
18166         * statement.cs (Block): Standard public readonly optimization.
18167         (Block::Block constructors): Link children. 
18168         (Block::Child): Child Linker.
18169         (Block::EmitVariables): Emits IL variable declarations.
18170
18171         * class.cs: Drop support for MethodGroups here, delay until
18172         Semantic Analysis.
18173         (Method::): Applied the same simplification that I did before, and
18174         move from Properties to public readonly fields.
18175         (Method::ParameterTypes): Returns the parameter types for the
18176         function, and implements a cache that will be useful later when I
18177         do error checking and the semantic analysis on the methods is
18178         performed.
18179         (Constructor::GetCallingConvention): Renamed from CallingConvetion
18180         and made a method, optional argument tells whether this is a class
18181         or a structure to apply the `has-this' bit.
18182         (Method::GetCallingConvention): Implement, returns the calling
18183         convention. 
18184         (Method::Define): Defines the type, a second pass is performed
18185         later to populate the methods.
18186
18187         (Constructor::ParameterTypes): implement a cache similar to the
18188         one on Method::ParameterTypes, useful later when we do semantic
18189         analysis. 
18190
18191         (TypeContainer::EmitMethod):  New method.  Emits methods.
18192
18193         * expression.cs: Removed MethodGroup class from here.
18194
18195         * parameter.cs (Parameters::GetCallingConvention): new method.
18196
18197 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
18198
18199         * class.cs (TypeContainer::Populate): Drop RootContext from the
18200         argument. 
18201
18202         (Constructor::CallingConvention): Returns the calling convention.
18203         (Constructor::ParameterTypes): Returns the constructor parameter
18204         types. 
18205
18206         (TypeContainer::AddConstructor): Keep track of default constructor
18207         and the default static constructor.
18208
18209         (Constructor::) Another class that starts using `public readonly'
18210         instead of properties. 
18211
18212         (Constructor::IsDefault): Whether this is a default constructor. 
18213
18214         (Field::) use readonly public fields instead of properties also.
18215
18216         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
18217         track of static constructors;  If none is used, turn on
18218         BeforeFieldInit in the TypeAttributes. 
18219
18220         * cs-parser.jay (opt_argument_list): now the return can be null
18221         for the cases where there are no arguments. 
18222
18223         (constructor_declarator): If there is no implicit `base' or
18224         `this', then invoke the default parent constructor. 
18225
18226         * modifiers.cs (MethodAttr): New static function maps a set of
18227         modifiers flags into a MethodAttributes enum
18228         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
18229         MethodAttr, TypeAttr to represent the various mappings where the
18230         modifiers are used.
18231         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
18232
18233 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
18234
18235         * parameter.cs (GetParameterInfo): Fix bug where there would be no
18236         method arguments.
18237
18238         * interface.cs (PopulateIndexer): Implemented the code generator
18239         for interface indexers.
18240
18241 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
18242
18243         * interface.cs (InterfaceMemberBase): Now we track the new status
18244         here.  
18245
18246         (PopulateProperty): Implement property population.  Woohoo!  Got
18247         Methods and Properties going today. 
18248
18249         Removed all the properties for interfaces, and replaced them with
18250         `public readonly' fields. 
18251
18252 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
18253
18254         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
18255         initialize their hashtables/arraylists only when they are needed
18256         instead of doing this always.
18257
18258         * parameter.cs: Handle refs and out parameters.
18259
18260         * cs-parser.jay: Use an ArrayList to construct the arguments
18261         instead of the ParameterCollection, and then cast that to a
18262         Parameter[] array.
18263
18264         * parameter.cs: Drop the use of ParameterCollection and use
18265         instead arrays of Parameters.
18266
18267         (GetParameterInfo): Use the Type, not the Name when resolving
18268         types. 
18269
18270 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
18271
18272         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
18273         and instead use public readonly fields.
18274
18275         * class.cs: Put back walking code for type containers.
18276
18277 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
18278
18279         * class.cs (MakeConstant): Code to define constants.
18280
18281         * rootcontext.cs (LookupType): New function.  Used to locate types 
18282
18283
18284 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
18285
18286         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
18287         this System.Reflection code is.  Kudos to Microsoft
18288
18289         * typemanager.cs: Implement a type cache and avoid loading all
18290         types at boot time.  Wrap in LookupType the internals.  This made
18291         the compiler so much faster.  Wow.  I rule!
18292
18293         * driver.cs: Make sure we always load mscorlib first (for
18294         debugging purposes, nothing really important).
18295
18296         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
18297         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
18298
18299         * rootcontext.cs: Lookup types on their namespace;  Lookup types
18300         on namespaces that have been imported using the `using' keyword.
18301
18302         * class.cs (TypeContainer::TypeAttr): Virtualize.
18303         (Class::TypeAttr): Return attributes suitable for this bad boy.
18304         (Struct::TypeAttr): ditto.
18305         Handle nested classes.
18306         (TypeContainer::) Remove all the type visiting code, it is now
18307         replaced with the rootcontext.cs code
18308
18309         * rootcontext.cs (GetClassBases): Added support for structs. 
18310
18311 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
18312
18313         * interface.cs, statement.cs, class.cs, parameter.cs,
18314         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
18315         Drop use of TypeRefs, and use strings instead.
18316
18317 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
18318
18319         * rootcontext.cs: 
18320
18321         * class.cs (Struct::Struct): set the SEALED flags after
18322         checking the modifiers.
18323         (TypeContainer::TypeAttr): new property, returns the
18324         TypeAttributes for a class.  
18325
18326         * cs-parser.jay (type_list): Oops, list production was creating a
18327         new list of base types.
18328
18329         * rootcontext.cs (StdLib): New property.
18330         (GetInterfaceTypeByName): returns an interface by type name, and
18331         encapsulates error handling here.
18332         (GetInterfaces): simplified.
18333         (ResolveTree): Encapsulated all the tree resolution here.
18334         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
18335         types. 
18336
18337         * driver.cs: Add support for --nostdlib, to avoid loading the
18338         default assemblies.
18339         (Main): Do not put tree resolution here. 
18340
18341         * rootcontext.cs: Beginning of the class resolution.
18342
18343 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
18344
18345         * rootcontext.cs: Provide better error reporting. 
18346
18347         * cs-parser.jay (interface_base): set our $$ to be interfaces.
18348
18349         * rootcontext.cs (CreateInterface): Handle the case where there
18350         are no parent interfaces.
18351
18352         (CloseTypes): Routine to flush types at the end.
18353         (CreateInterface): Track types.
18354         (GetInterfaces): Returns an array of Types from the list of
18355         defined interfaces.
18356
18357         * typemanager.c (AddUserType): Mechanism to track user types (puts
18358         the type on the global type hash, and allows us to close it at the
18359         end). 
18360
18361 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
18362
18363         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
18364         RecordInterface instead.
18365
18366         * cs-parser.jay: Updated to reflect changes above.
18367
18368         * decl.cs (Definition): Keep track of the TypeBuilder type that
18369         represents this type here.  Not sure we will use it in the long
18370         run, but wont hurt for now.
18371
18372         * driver.cs: Smaller changes to accomodate the new code.
18373
18374         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
18375         when done. 
18376
18377         * rootcontext.cs (CreateInterface):  New method, used to create
18378         the System.TypeBuilder type for interfaces.
18379         (ResolveInterfaces): new entry point to resolve the interface
18380         hierarchy. 
18381         (CodeGen): Property, used to keep track of the code generator.
18382
18383 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
18384
18385         * cs-parser.jay: Add a second production for delegate_declaration
18386         with `VOID'.
18387
18388         (enum_body): Put an opt_comma here instead of putting it on
18389         enum_body or enum_member_declarations so we can handle trailing
18390         commas on enumeration members.  Gets rid of a shift/reduce.
18391
18392         (type_list): Need a COMMA in the middle.
18393
18394         (indexer_declaration): Tell tokenizer to recognize get/set
18395
18396         * Remove old targets.
18397
18398         * Re-add the parser target.
18399
18400 2001-07-13  Simon Cozens <simon@simon-cozens.org>
18401
18402         * cs-parser.jay: Add precendence rules for a number of operators
18403         ot reduce the number of shift/reduce conflicts in the grammar.
18404
18405 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
18406
18407         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
18408         and put it here.
18409
18410         Get rid of old crufty code.
18411
18412         * rootcontext.cs: Use this to keep track of the parsed
18413         representation and the defined types available to the program. 
18414
18415         * gen-treedump.cs: adjust for new convention.
18416
18417         * type.cs: Split out the type manager, and the assembly builder
18418         from here. 
18419
18420         * typemanager.cs: the type manager will live here now.
18421
18422         * cil-codegen.cs: And the code generator here. 
18423
18424 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
18425
18426         * makefile: Fixed up for easy making.
18427
18428 2001-07-13  Simon Cozens <simon@simon-cozens.org>
18429
18430         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
18431         the 
18432
18433         (unary_expression): Expand pre_increment_expression and
18434         post_decrement_expression to reduce a shift/reduce.
18435
18436 2001-07-11  Simon Cozens
18437
18438         * cs-tokenizer.cs: Hex numbers should begin with a 0.
18439
18440         Improve allow_keyword_as_indent name.
18441
18442 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
18443
18444         * Adjustments for Beta2. 
18445
18446 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
18447
18448         * decl.cs: Added `Define' abstract method.
18449         (InTransit): new property, used to catch recursive definitions. 
18450
18451         * interface.cs: Implement `Define'. 
18452
18453         * modifiers.cs: Map Modifiers.constants to
18454         System.Reflection.TypeAttribute flags.
18455
18456         * class.cs: Keep track of types and user-defined types.
18457         (BuilderInit): New method for creating an assembly
18458         (ResolveType): New function to launch the resolution process, only
18459         used by interfaces for now.
18460
18461         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
18462         that are inserted into the name space. 
18463
18464 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
18465
18466         * ARGH.  I have screwed up my tree so many times due to the use of
18467         rsync rather than using CVS.  Going to fix this at once. 
18468
18469         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
18470         load types.
18471
18472 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
18473
18474         * Experiment successful: Use System.Type rather that our own
18475         version of Type.  
18476
18477 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
18478
18479         * cs-parser.jay: Removed nsAliases from here.
18480
18481         Use new namespaces, handle `using XXX;' 
18482
18483         * namespace.cs: Reimplemented namespace handling, use a recursive
18484         definition of the class.  Now we can keep track of using clauses
18485         and catch invalid using clauses.
18486
18487 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
18488
18489         * gen-treedump.cs: Adapted for all the renaming.
18490
18491         * expression.cs (Expression): this class now has a Type property
18492         which returns an expression Type.
18493
18494         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
18495         `Type', as this has a different meaning now in the base
18496
18497 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
18498
18499         * interface.cs, class.cs: Removed from all the sources the
18500         references to signature computation, as we can not do method
18501         signature computation during the parsing time, as we are not
18502         trying to solve at that point distinguishing:
18503
18504         class X {
18505                 void a (Blah x) {}
18506                 void a (NS.Blah x) {}
18507         }
18508
18509         Which depending on the context might be valid or not, as we do not
18510         know if Blah is the same thing as NS.Blah at that point.
18511
18512         * Redid everything so the code uses TypeRefs now instead of
18513         Types.  TypeRefs are just temporary type placeholders, that need
18514         to be resolved.  They initially have a pointer to a string and the
18515         current scope in which they are used.  This is used later by the
18516         compiler to resolve the reference to an actual Type. 
18517
18518         * DeclSpace is no longer a CIR.Type, and neither are
18519         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
18520         are all DeclSpaces, but no Types. 
18521
18522         * type.cs (TypeRefManager): This implements the TypeRef manager,
18523         which keeps track of all the types that need to be resolved after
18524         the parsing has finished. 
18525
18526 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
18527
18528         * ARGH.  We are going to have to store `foreach' as a class rather
18529         than resolving it, as we need to verify error 1579 after name
18530         resolution.   *OR* we could keep a flag that says `This request to
18531         IEnumerator comes from a foreach statement' which we can then use
18532         to generate the error.
18533
18534 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
18535
18536         * class.cs (TypeContainer.AddMethod): we now add methods to the
18537         MethodGroup instead of the method hashtable.  
18538
18539         * expression.cs: Add MethodGroup abstraction, which gets us one
18540         step closer to the specification in the way we handle method
18541         declarations.  
18542
18543         * cs-parser.jay (primary_expression): qualified_identifier now
18544         tried to match up an identifier to a local variable reference or
18545         to a parameter reference.
18546
18547         current_local_parameters is now a parser global variable that
18548         points to the current parameters for the block, used during name
18549         lookup.
18550
18551         (property_declaration): Now creates an implicit `value' argument to
18552         the set accessor.
18553
18554 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
18555
18556         * parameter.cs: Do not use `param' arguments as part of the
18557         signature, per the spec.
18558
18559 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
18560
18561         * decl.cs: Base class for classes, structs and interfaces.  This
18562         is the "Declaration Space" 
18563
18564         * cs-parser.jay: Use CheckDef for checking declaration errors
18565         instead of having one on each function.
18566
18567         * class.cs: Factor out some code for handling error handling in
18568         accordance to the "Declarations" section in the "Basic Concepts"
18569         chapter in the ECMA C# spec.
18570
18571         * interface.cs: Make all interface member classes derive from
18572         InterfaceMemberBase.
18573
18574 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
18575
18576         * Many things: all interfaces are parsed and generated in
18577         gen-treedump.  Support for member variables, constructors,
18578         destructors, properties, constants is there.
18579
18580         Beginning of the IL backend, but very little done, just there for
18581         testing purposes. 
18582
18583 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
18584
18585         * cs-parser.jay: Fix labeled statement.
18586
18587         * cs-tokenizer.cs (escape): Escape " and ' always.
18588         ref_line, ref_name: keep track of the line/filename as instructed
18589         by #line by the compiler.
18590         Parse #line.
18591
18592 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
18593
18594         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
18595         to match the values in System.CodeDOM.
18596
18597         Divid renamed to Divide.
18598
18599         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
18600         statements. 
18601         (Statements.set): remove.
18602
18603         * System.CodeDOM/CodeCatchClause.cs: always have a valid
18604         statements. 
18605
18606         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
18607         falseStatements always have valid values. 
18608
18609         * cs-parser.jay: Use System.CodeDOM now.
18610