4cdacb0ce18cf97112bed44e69b9d5cc938c5aa9
[mono.git] / mcs / gmcs / ChangeLog
1 2005-01-19  Raja R Harinath  <rharinath@novell.com>
2
3         * cs-parser.jay: Fix several infelicities.
4         - Avoid assigning to the parser value stack.  Code like 
5           '$3 = null' is unclean.  Synthesize a value for the code block
6           instead. 
7         - Avoid using oob_stack for storing location information.  Use ...
8         (_mark_): ... this.  New (empty) rule.  Saves the current location
9         in $$.
10         (foreach_statement): Avoid using oob_stack for current_block
11         handling.  Use technique used in for_statement and
12         using_statement.  Synthesize a value for the code block to store
13         additional intermediate information.
14
15 2005-01-13  Miguel de Icaza  <miguel@ximian.com>
16
17         * ecore.cs (IsAccessorAccessible): Accessibility to private fields
18         of a different type is only allowed to private fields of a
19         containing type, not on fields of a base class.
20
21         See test-174.cs and error cs0122-9.cs
22
23 2005-01-13  Raja R Harinath  <rharinath@novell.com>
24
25         Fix test-335.cs (bug #58126).
26         * cs-parser.jay (argument): Split out non-expression parts of the
27         rule into 'non_simple_argument'.
28         (invocation_expression): Support parenthesized invocations with
29         multiple arguments, and with single non-simple arguments.
30
31 2005-01-13  Raja R Harinath  <rharinath@novell.com>
32
33         * cs-tokenizer.cs (xtoken): Reset 'comments_seen' in a couple more
34         places.
35
36 2005-01-12  Raja R Harinath  <rharinath@novell.com>
37
38         Fix cs0038-1.cs, cs1640-6.cs.
39         * ecore.cs (Expression.Resolve): Remove special-case for
40         SimpleName in error-handling.
41         (Expression.almostMatchedMembers): Relax access permission to
42         protected.
43         (Expression.MemberLookupFailed): Handle duplicates in
44         almostMatchedMembers list.
45         (SimpleName.DoSimpleNameResolve): Catch CS0038 errors earlier.
46         * expression.cs (New.DoResolve): Report CS1540 for more cases.
47         * typemanager.cs (GetFullNameSignature): Use the MethodBase
48         overload if the passed in MemberInfo is a MethodBase.
49
50 2005-01-25  Martin Baulig  <martin@ximian.com>
51
52         * doc.cs
53         (DocUtil.emptyParamList): Removed; use `Type.EmptyTypes' instead.
54
55 2005-01-12  Marek Safar  <marek.safar@seznam.cz>
56
57         Fix #70749
58         * attribute.cs (ExtractSecurityPermissionSet): Don't report error
59         for non-CAS & merge permission sets properly.
60
61 2005-01-11  Raja R Harinath  <rharinath@novell.com>
62
63         Improve standard-compliance of simple name and member access 
64         resolution.  Fixes bugs #52697, #57200, #67520, #69519.
65         * ecore.cs (FullNamedExpression): New abstract base class 
66         for Namespaces and TypeExpressions.
67         (ResolveFlags.SimpleName): Remove.
68         (SimpleName): Remove support for dotted names.
69         (SimpleName.ResolveAsTypeStep): Simplify.  Now just a wrapper to 
70         DeclSpace.FindType and DeclSpace.LookupType.
71         (SimpleName.DoSimpleNameResolve): Remove support for dotted names.
72         (Expression.ExprClassName): Make member function.
73         * expression.cs (MemberAccess.ResolveAsTypeStep): Support LHS being
74         a namespace.  Remove creation of dotted "SimpleName"s.
75         (MemberAccess.DoResolve): Likewise.
76         * decl.cs (DeclSpace.Cache): Make private.
77         (DeclSpace.LookupInterfaceOrClass): Return a FullNamedExpression.
78         (DeclSpace.FindType): Update.
79         (DeclSpace.LookupType): Move here from RootContext.  Return a 
80         FullNamedExpression.
81         * namespace.cs (Namespace): Derive from FullNamedExpression
82         so that it can be part of expression resolution.
83         (Namespace.Lookup): Return an FullNamedExpression.
84         (NamespaceEntry.LookupAlias): Lookup aliases only in current
85         namespace.
86         * rootcontext.cs (NamespaceLookup): Remove.
87         (LookupType): Move to DeclSpace.
88         * attribute.cs (CheckAttributeType): Update.
89         * doc.cs (FindDocumentedType): Remove allowAlias argument.
90         (FindDocumentedTypeNonArray): Likewise.
91
92 2005-01-11  Raja R Harinath  <rharinath@novell.com>
93
94         Fix cs0509.cs, cs1632.cs.
95         * class.cs (TypeContainer.GetNormalBases): Don't assume !IsClass
96         is the same as IsInterface.
97         (TypeContainer.GetClassBases): Likewise.
98         * statement.cs (LabeledStatement.ig): New field.
99         (LabeledStatement.LabelTarget): Save ILGenerator which created the
100         label.
101         (LabeledStatement.DoEmit): Check that the label was created with
102         the same ILGenerator.
103
104 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
105
106         Fix #71058
107         * attribute.cs (GetMethodObsoleteAttribute): Need to transform
108         accessors to its properties.
109
110         * ecore.cs (PropertyExpr): Add AccessorTable to help track back
111         from accessors to property.
112         
113 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
114
115         Fix #70722
116         * class.cs (MethodCore.CheckBase): Test base method obsoleteness
117         only for overrides.
118         
119 2005-01-08  Miguel de Icaza  <miguel@ximian.com>
120
121         * attribute.cs: Check for null and empty strings.  
122
123         I have lost another battle to Paolo.
124
125 2005-01-07  Marek Safar  <marek.safar@seznam.cz>
126
127         Fix #70942
128         * class.cs (PropertyMethod): Set Parent field in ctors.
129         (SetMethod.InternalParameters): Add unsafe switch hack.
130         Override MarkForDuplicationCheck where it is appropriate.
131
132         * decl.cs (MemberCore.MarkForDuplicationCheck): New method.
133         It says whether container allows members with the same name.
134         Base default is no.
135         (DeclSpace.AddToContainer): Use MarkForDuplicationCheck.
136         Removed is_method parameter.
137
138 2005-01-06  Duncan Mak  <duncan@ximian.com>
139
140         * cs-tokenizer.cs (xtoken): Redo the work for signaling CS1040
141         because the previous change led to incorrect reporting of CS1032
142         ("Cannot define/undefine preprocessor symbols after first token in
143         file"). Instead of using `tokens_seen' as the only flag that
144         triggers CS1040, introduce `comments_seen'. This new flag is used
145         to signify having seen comments on the current line, so it is
146         unset after a newline.
147
148 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
149
150         * doc.cs : When searching for a type, find nested type too.
151           This fixes bug #71040.
152
153 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
154
155         * doc.cs :
156           - Warn missing member comment on those classes which also does not
157             have doc comments. Fixed bug #71041.
158           - Don't warn missing doc comment on default constructor.
159             Fixed bug #71042.
160
161 2005-01-06  Duncan Mak  <duncan@ximian.com>
162
163         * cs-tokenizer.cs (xtoken): After handling traditional C-style
164         comments, set `tokens_seen' to true. This allows us to detect
165         misplaced preprocessor directives (i.e. not at the beginning of
166         the a line, nor after whitespaces). In that case, report error
167         CS1040. This fixes bug #56460.
168
169         * cs-parser.jay (interface_member_declaration): Add checks for
170         IsExplicitImpl, and report CS0541 error if an interface member is
171         defined as an explicit interface declaration.
172
173 2005-01-06  Marek Safar  <marek.safar@seznam.cz>
174
175         Fix #70817
176         * class.cs (PropertyMethod): Set Parent field in ctors.
177         (SetMethod.InternalParameters): Add unsafe switch hack.
178         
179         * decl.cs (MemberCore.Parent): Cannot be readonly.
180
181 2005-01-06  Raja R Harinath  <rharinath@novell.com>
182
183         * decl.cs (DeclSpace.ResolveType): Remove.
184         (DeclSpace.ResolveBaseTypeExpr): Rename from ResolveTypeExpr.
185         Merge in code from ...
186         (DeclSpace.GetTypeResolvingEmitContext): ... here.  Remove.
187         * class.cs, enum.cs: Update to changes.
188
189 2005-01-06  Miguel de Icaza  <miguel@ximian.com>
190
191         * anonymous.cs: Ensure that we init the scope of our parent if it
192         has not been initialized yet.
193
194 2004-12-30  Duncan Mak  <duncan@ximian.com>
195
196         * typemanager.cs (TypeManager.CheckStructCycles): Don't crash here
197         if field.FieldBuilder is null. Fixes #70758.
198
199         * convert.cs: Fixed some typos and updated some of the comments.
200         (ImplicitStandardConversionExists):
201         (TryImplicitIntConversion): If `target_type' is an interface and
202         the type of `ic' implements this interface, return true or a new
203         BoxedCast instead of null. This fixes #70468.
204
205 2004-12-29  Duncan Mak  <duncan@ximian.com>
206
207         * expression.cs (Argument.Emit): Check that Expr is
208         IMemoryLocation before casting to it, and report CS1510 otherwise.
209
210         This fixes #70402.
211
212 2004-12-21  Ben Maurer  <bmaurer@ximian.com>
213
214         * statement.cs (Block.ThisVariable): remove the recursion here, to
215         make the --profile more sane.
216
217 2004-12-17  Carlos Cortez <calberto.cortez@gmail.com>
218
219         * driver.cs: Patch to handle a xsp bug that prevents to reference an .exe
220         assembly, by JB Evain.
221
222 2004-12-17  Raja R Harinath  <rharinath@novell.com>
223
224         * class.cs, decl.cs, ecore.cs, iterators.cs, pending.cs, 
225           rootcontext.cs, typemanager.cs: Make nomenclature consistent.
226         "parent" refers to enclosing type/class.  "base" refers to superclass.
227
228 2004-12-17  Raja R Harinath  <rharinath@novell.com>
229
230         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
231         Ensure that we only have GlobalAttributes.
232         * attribute.cs (Attribute.Emit): Make non-virtual.
233         (GlobalAttribute.Emit): Remove.
234         (Attribute.Resolve): Make virtual.
235         (GlobalAttribute.Resolve): New.  Set Rootcontext.Tree.Types.NamespaceEntry.
236         (Attribute.GetConditionalAttributeValue): Take an EmitContext as
237         the argument. Don't create one.
238         (Attribute.GetObsoleteAttribute): Likewise.
239         (Attribute.GetClsCompliantAttributeValue): Likewise.
240         * class.cs, decl.cs: Update to changes.
241
242 2004-12-17  Marek Safar  <marek.safar@seznam.cz>
243
244         * delegate.cs (NewDelegate.DoResolve): Add error 149 report.
245         
246         * ecore.cs (Expression.MemberLookupFailed): Fixed error 143.
247         
248         * statement.cs (Foreach.Resolve): Add error 186 report.
249
250 2004-12-16  Marek Safar  <marek.safar@seznam.cz>
251
252         * expression.cs (Conditional.DoResolve): Add warning 429.
253         
254         * statement.cs (If.Resolve): Add warning 665.
255
256 2004-12-16  Raja R Harinath  <rharinath@novell.com>
257
258         New invariant: RootContext.Tree.Types.NamespaceEntry == null
259         except when in the parser, and in GlobalAttribute.
260         * driver.cs (MainDriver): Reset RootContext.Tree.Types.NamespaceEntry.
261         * attribute.cs (GlobalAttribute.CheckAttributeType): Reset
262         RootContext.Tree.Types.NamespaceEntry once work is done.
263         (GlobalAttribute.Emit): New.  Wrapper for Attribute.Emit, but sets
264         and resets RootContext.Tree.Types.NamespaceEntry.
265
266 2004-12-15  Marek Safar  <marek.safar@seznam.cz>
267
268         * cs-parser.jay: Don't create a block for every variable.
269
270 2004-12-14  Miguel de Icaza  <miguel@ximian.com>
271
272         * location.cs: Provide extra information.
273
274         * statement.cs: The instance is not `ldarg_0.THIS' when accessing
275         variables from the captured environment, it is the ldarg_0.
276
277 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
278
279         * cs-parser.jay: Changed warning level for 642 to 4 until Miguel
280         find a conclusion.
281         
282         * class.cs: Changed warning level for 169 to avoid developer
283         displeasure from warning flooding. It will be changed back when they
284         fix most of current BCL warnings.
285         
286         * RootContext.cs: Pushed default WarningLevel to 3.
287         
288         * statement.cs: Removed unused variable.
289
290 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
291
292         * class.cs (TypeContainer.GetClassBases): Add error 1521 report.
293         (TypeContainer.MethodModifiersValid): Refactored to use MemberCore.
294         Add error 502 report.
295         (StaticClass.DefineType): Add error 441 report.
296         (Class.AllowedModifiersProp): New virtual property as temporary
297         extension to AllowedModifiers.
298         (Class.DefineType): Add error 418 report. Moved ModFlags check here
299         to share implementation with StaticClass and don't call virtual
300         methods from ctor.
301         
302         * driver.cs (MainDriver): Add error 1558 test.
303
304         * parameter.cs (Parameter.ApplyAttributeBuilder): Add error 662
305         report. Moved error 36 test here.
306
307         * statement.cs (Throw.Resolve): Add error 724 report.
308
309         * typemanager.cs: Add out_attribute_type core type.
310         
311 2004-12-13  Marek Safar  <marek.safar@seznam.cz>
312
313         * class.cs (TypeContainer.VerifyClsCompliance): Add error
314         3018 report.
315         (PropertyBase.VerifyClsCompliance): Add errror 3025 report.
316
317         * codegen.cs (ModuleClass.ApplyAttributeBuilder): Add error
318         3017 report.
319         
320         * decl.cs (MemberCore.VerifyClsCompliance): Add warning 3021.
321
322         * parameter.cs (ReturnParameter.ApplyAttributeBuilder): 
323         Add error 3023 report.
324         (Parameter.ApplyAttributeBuilder): Add error 3022 report.
325
326         * tree.cs (RootTypes.IsClsCompliaceRequired): Add fake
327         implementation.
328
329 2004-12-12  John Luke  <john.luke@gmail.com>
330
331         * driver.cs (AddArgs): take -- into account when
332         adding arguments, fixes bug 65710 
333
334 2004-12-12  Martin Baulig  <martin@ximian.com>
335
336         * expression.cs (Unary.TryReduceNegative): Added support for
337         SByteConstant and ByteConstant.
338         (Unary.Reduce): Check error values from TryReduceNegative().
339
340 2004-12-10  Marek Safar  <marek.safar@seznam.cz>
341
342         * attributes.cs (Attribute.Resolve): Avoid multiple error report
343         and report exception as error 182.
344
345 2004-12-10  Raja R Harinath  <rharinath@novell.com>
346
347         * driver.cs (Main): Fix message when there are warnings.
348
349 2004-12-09  Miguel de Icaza  <miguel@ximian.com>
350
351         * delegate.cs: Fixed my fix from yesterday, sorry about that.
352
353 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
354
355         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
356         Reduced number of warnings.
357         
358         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
359
360 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
361
362         * driver.cs: Removed message.
363
364         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
365
366 2004-12-08    <vargaz@freemail.hu>
367
368         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
369
370 2004-12-08  Martin Baulig  <martin@ximian.com>
371
372         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
373         instead of a CS3002 for properties and indexer.
374
375 2004-12-08  Martin Baulig  <martin@ximian.com>
376
377         * decl.cs (MemberName.ToString): Make this work again.
378
379 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
380
381         * attribute.cs (Resolve): Add error 591 detection.
382
383         * class.cs (FieldMember.Define): Add error 1547 detection.
384         (Indexer.Define): Add error 620 detection.
385         (Operator.Define): Add error 590 detection.
386
387         * ecore.cs: Missing argument for error 79.
388
389         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
390         detection.
391
392 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
393
394         Fix #70106
395         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
396         only.
397
398 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
399
400         * cs-parser.jay : handle doc comments on implicit/explicit operators.
401           Some operator comments were suppressed.
402         * doc.cs : Implicit/explicit operator name in doc comments are like
403           "op_Explicit(type)~returnType", so added suffix handling.
404
405 2005-01-21  Alp Toker  <alp@atoker.com>
406
407         * cs-parser.jay: destructor_declaration's container is PartialContainer
408         not Class when partial types are used, so use Kind prop instead of 'is'.
409
410 2004-12-12  Martin Baulig  <martin@ximian.com>
411
412         * expression.cs (Unary.TryReduceNegative): Added support for
413         SByteConstant and ByteConstant.
414         (Unary.Reduce): Check error values from TryReduceNegative().
415
416 2004-12-11  Martin Baulig  <martin@ximian.com>
417
418         * support.cs (ReflectionParameters.ParameterName): If we have a
419         `gpd', call `ParameterName' on it.
420
421         * parameter.cs (Parameter.GetParameterAttributes): New static method.
422
423         * pending.cs (PendingImplementation.DefineProxy): Call
424         DefineParameter() for all of the MethodBuilder's arguments.
425
426 2004-12-09  Martin Baulig  <martin@ximian.com>
427
428         * doc.cs (DocUtil): Make this a static class.
429
430 2004-12-09  Martin Baulig  <martin@ximian.com>
431
432         * expression.cs (Invocation.InferType): Moved the type inference
433         implementation into TypeManager.
434
435         * generics.cs (TypeManager): Moved the type inference
436         implementation here.
437
438 2004-12-09  Martin Baulig  <martin@ximian.com>
439
440         * typemanager.cs (TypeManager): Make this a partial class.
441
442         * generics.cs
443         (TypeManager): Move the generics part of `TypeManager' here.
444
445 2004-12-08  Martin Baulig  <martin@ximian.com>
446
447         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
448         instead of a CS3002 for properties and indexer.  Added CS3024
449         check for generic interfaces.
450
451         * attributes.cs (AttributeTester.AnalyzeTypeCompliance): Generic
452         instances are not CLS-compliant.
453
454 2004-12-08  Martin Baulig  <martin@ximian.com>
455
456         * cs-parser.jay
457         (void_pointer_expression): New rule for `void*', `void**' etc.
458         (typeof_expression): Add `void_pointer_expression'; fixes #66846.       
459
460 2004-12-08  Martin Baulig  <martin@ximian.com>
461
462         * expression.cs (Invocation.InferType): Removed the hack for
463         MethodCore.MayUnify().  
464
465         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Make
466         this actually work.
467
468         * class.cs (MethodCore.MayUnify): Use
469         TypeManager.MayBecomeEqualGenericTypes().       
470
471 2004-12-08  Martin Baulig  <martin@ximian.com>
472
473         * expression.cs (Is.DoResolve, As.DoResolve): If we're a type
474         parameter, box it.  Fixes #69233.
475
476 2004-12-08  Martin Baulig  <martin@ximian.com>
477
478         * generic.cs (ConstructedType.CheckConstraints): Valuetypes always
479         have the ctor constraint.  Fixes #68326.
480
481 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
482
483         * cs-parser.jay : interface comment was not consumed because of
484           extra opt_semicolon before doc handling.
485
486 2004-12-03  Raja R Harinath  <rharinath@novell.com>
487
488         Fix test-327.cs, test-328.cs, and put in early infrastructure
489         for eventually fixing #52697.
490         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
491         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
492         from other methods.
493         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
494         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
495         (VerifyUsing, error246): Update.
496         * rootcontext.cs (RootContext.NamespaceLookup): Just use
497         'NamespaceEntry.LookupNamespaceOrType'.
498
499 2004-12-07  Martin Baulig  <martin@ximian.com>
500
501         * driver.cs: Call it "BETA SOFTWARE" :-)
502
503 2004-12-06  Raja R Harinath  <rharinath@novell.com>
504
505         Fix crash on cs0657-17.cs.
506         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
507         Use RootContext.Tree.Types, not 'new RootTypes ()'.
508         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
509         the case where the NamespaceEntry gets overwritten.
510
511 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
512
513         Fixed #69195, #56821
514         * ecore.cs (ResolveBoolean): Tiny refactoring.
515
516         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
517         of right expression resolving when left is false constant and
518         operator is LogicalAnd OR true constant and operator is LogicalOr.
519
520         * statement.cs (ResolveUnreachable): Always reports warning.
521
522 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
523
524         * class.cs: Distinguish between 1721 and 1722 (just a little help
525         for the programmer).
526
527 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
528
529         * delegate.cs: Only allow this on new versions of the language. 
530
531 2004-12-02  Duncan Mak  <duncan@ximian.com>
532
533         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
534         Expression class.
535         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
536         here as a static method. Take an additional bool out parameter
537         `must_do_cs1540_check' for signaling to InstanceResolve.
538         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
539         member field from PropertyExpr class and made it an argument of
540         the method instead.
541         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
542         check for MarshalByRefObject, and report CS0122 instead of CS1540.
543         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
544         and `remove_accessor' as well as InstanceResolve: report CS0122
545         where applicable.
546
547         Fixes #70129.
548
549 2004-12-07  Martin Baulig  <martin@ximian.com>
550
551         * decl.cs (DeclSpace.AddToContainer): Report correct errors CS0694
552         and CS0692 where appropriate.
553
554 2004-12-06  Martin Baulig  <martin@ximian.com>
555
556         * class.cs (MethodCore.MayUnify): Moved the CS0408 check here from
557         IsDuplicateImplementation() and improved it.
558
559         * expression.cs (Invocation.InferTypeArguments): Added
560         `Type[] inferred_class_types' argument (for MethodCore.MayUnify)
561         and removed the "ref" modifier from `infered_types'.
562
563         * decl.cs (MemberName.ToString): Removed the exception.
564
565 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
566
567         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
568           comments are allowed.
569
570 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
571
572         * delegate.cs: Add checks for subtypes in paramaters and return values
573         in VerifyMethod () to add support for Covariance/Contravariance
574         in delegates.
575         
576 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
577
578         * report.cs: Remove extra closing parenthesis.
579
580         * convert.cs (Error_CannotImplicitConversion): If the name of the
581         types are the same, provide some extra information.
582
583 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
584
585         Fix bug #70102
586         * attribute.cs (Resolve): Improved implementation of params
587         attribute arguments.
588
589         * support.cs (ParameterData): Add HasParams to be faster.
590
591 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
592
593         all things are for /doc support:
594
595         * doc.cs: new file that supports XML documentation generation.
596         * mcs.exe.sources: added doc.cs.
597         * driver.cs:
598           Handle /doc command line option.
599           Report error 2006 instead of 5 for missing file name for /doc.
600           Generate XML documentation when required, after type resolution.
601         * cs-tokenizer.cs:
602           Added support for picking up documentation (/// and /** ... */),
603           including a new XmlCommentState enumeration.
604         * cs-parser.jay:
605           Added lines to fill Documentation element for field, constant,
606           property, indexer, method, constructor, destructor, operator, event
607           and class, struct, interface, delegate, enum.
608           Added lines to warn incorrect comment.
609         * rootcontext.cs :
610           Added Documentation field (passed only when /doc was specified).
611         * decl.cs:
612           Added DocComment, DocCommentHeader, GenerateDocComment() and
613           OnGenerateDocComment() and some supporting private members for
614           /doc feature to MemberCore.
615         * class.cs:
616           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
617         * delegate.cs:
618           Added overriden DocCommentHeader.
619         * enum.cs:
620           Added overriden DocCommentHeader and GenerateDocComment().
621
622 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
623
624         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
625         unwrapping the enumeration values, chain to
626         DoConstantNumericPromotions again, so we can promote things to the
627         fundamental types (takes care of enums that are bytes, sbytes).
628
629         Fixes bug #62054.
630
631 2004-12-01  Raja R Harinath  <rharinath@novell.com>
632
633         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
634         Fix long-standing bug in type-lookup.  Use FindType instead of
635         LookupType when ec.ResolvingTypeTree.
636         (Attribute.ResolveType, Attribute.Resolve)
637         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
638         Update to changes.
639         (Attributes.Search): Remove internal version.  Update.
640         (Attributes.SearchMulti): Update.
641         (Attributes.GetClsCompliantAttribute): Remove.
642         (Attributes.GetIndexerNameAttribute): Remove.
643         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
644         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
645         * class.cs (Indexer.Define): Likewise.
646
647 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
648
649         Fix bug #68790
650         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
651         MarshallByReference members access.
652
653         * expression.cs: Use CheckMarshallByRefAccess;
654         Better error CS0197 message.
655
656         * report.cs: Print whole related error message.
657
658 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
659
660         * class (GetClassBases): Better error 60 report.
661         (EventProperty): Disabled warning 67 detection.
662
663 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
664
665         Fix bug #60324
666         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
667
668         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
669         precise values.
670
671 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
672
673         Fix bug #49488
674         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
675
676         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
677
678 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
679
680         * attribute.cs (Attribute.Resolve): Refine error reporting and
681         report a cs0117 if the identifier does not exist, to distinguish
682         from 0617 which is a miss-use of the actual identifier.
683
684         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
685         between cs0070 and cs0079.
686
687         * class.cs (MemberBase.DoDefine): When reporting a wrong
688         accessibility level, we use MethodCore to compare instead of
689         Method (this was a regression in some refactoring effort).
690
691         So now we correctly report cs0056 again.
692
693         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
694         testing the target_type (which was known to be object_type) and
695         not the source type (which is anonymous_method).
696
697         Fixed reporting of error cs1660.
698
699         * expression.cs (UserCast.Source): Expose the underlying cast.
700
701         * statement.cs (Switch.SwitchGoverningType): Sort the list of
702         allowed types to find a match to int32 first (most common).
703
704         In addition, it ignores any ImplicitUserConversions that did an
705         internal implicit conversion (as the switch statement allows only
706         one integral conversion to exist).
707
708         * class.cs (PartialContainer.Create): rename `name' to
709         `member_name' for clarity.  Then replace the string calls with a
710         call to MemberName.GetPartialName, as now using
711         MemberName.ToString is an error (this is due to the side effects
712         it had, that were fixed in the past).
713
714         This will restore the error reporting on a number of partial class
715         errors that were missusing this (and getting an exception as a
716         results, which is now just a plain textual warning, because
717         yyparse debug output would crash otherwise).
718
719 2004-11-26  Raja R Harinath  <rharinath@novell.com>
720
721         * Makefile (PROGRAM_INSTALL_DIR): Remove.
722
723 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
724
725         * rootcontext.cs (LookupType): Make sure to cache lookups that
726         don't give us a negative result. This saves about 5% of corlib
727         compilation time.
728
729 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
730
731         * report.cs (AbstractMessage.Print): messages are sent to stderr
732
733         * class.cs (TypeContainer.GetClassBases): It is an error to have a
734         non-interface in the list of interfaces (at this point, either
735         parent was properly set, or a base class is being listed in the
736         interfaces section).
737
738         This flags error 1722, and resolves the crash from bug 69259.
739
740 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
741
742         * statement.cs (Using.EmitExpressionFinally): make this work right
743         for valuetypes. Fixes 69926.
744
745 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
746
747         * const.cs (Const.ChangeType): Cope with the "0 literal can be
748         converted to an enum" here, before we try to change the underlying
749         type.  This code exists, but it is a different code path than the
750         one used while encoding constants.
751
752         (ImplicitReferenceConversionExists): In addition, resynchronized
753         the code here, so it matches the same code in
754         ImplicitReferenceConversionExists for the `from any class-type S
755         to any interface-type T'.       
756
757 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
758
759         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
760
761 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
762
763         * cs-parser.jay: Use verbosity accordingly. 
764
765 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
766
767         * expression.cs (Unary.ResolveOperator): Do not report warning;
768         AddressOf reads from variable.
769         
770         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
771
772 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
773
774         Fix bug #69462
775
776         * attribute.cs (Attributable): Removed CheckTargets.
777         (Attributes.Emit): Explicit attribute targets are tested here.
778
779         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
780         not enabled for interfaces.
781
782         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
783         (GetAssemblyName): Ouch next bug there.
784
785 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
786
787         * expression.cs: Error 275 added.
788         
789 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
790
791         Fix bug #69177 (Implemented decimal constant support)
792
793         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
794         (BinaryFold): Add DecimalConstant.
795
796         * const.cs (Define): Decimal constant 
797         (is not constant.
798         (ChangeType): Add decimal type handling.
799         (LookupConstantValue): Don't set value for decimal type but
800         emit DecimalConstantAttribute. Needed for constant optimization.
801
802         * constant.cs (ToDecimal): New method.
803         (ConvertToDecimal): New method.
804         (IntConstant): Implemented ConvertToDecimal.
805         (DecimalConstant.Emit): Emit optimized version for decimals in
806         int range.
807
808         * expression.cs (ResolveOperator): Changed order of constant
809         reduction to work correctly with native types which have
810         overloaded operators.
811         (ResolveMemberAccess): Extract constant value from attribute
812         for decimal type.
813
814         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
815
816         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
817         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
818         (ChangeType): Decimal is special.
819         (TypeToCoreType): Add decimal type.
820
821 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
822
823         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
824         decimal types.
825
826 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
827
828         * class.cs (EventField.ApplyAttributeBuilder): Fix error
829         test cs1667-5.cs.
830
831 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
832
833         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
834
835         * pending.cs (PendingImplementation): Grab only interfaces.
836
837 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
838
839         * statement.cs (ForeachHelperMethods): Add location member and
840         error 202 detection.
841
842 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
843
844         * expression.cs (DoResolveBase): Fixed wrong warning for out
845         variables.
846
847 2004-12-04  Martin Baulig  <martin@ximian.com>
848
849         * convert.cs (Convert.TypeParameter_to_Null): Use the constraints
850         to check whether the conversion is ok.
851
852         * typemanager.cs (TypeManager.GetTypeArguments): Just return
853         `Type.EmptyTypes' if we're not a generic TypeContainer.
854
855 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
856
857         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
858         old bug: when converting from the null literal to a pointer,
859         return an EmptyCast, not the NullLiteral.
860
861         This fixes #69921, the recent null_type changes probably made this
862         bug more prominent.
863
864 2004-12-03  Martin Baulig  <martin@ximian.com>
865
866         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
867         method as our child, call AnonymousMethod.Compatible() on it.
868
869 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
870
871         * class.cs (FieldBase): Use an unused bit field from the field to
872         encode the `has_offset' property from the FieldMember.  This saves
873         a couple of Ks on bootstrap compilation.
874
875         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
876         method as our child, return the AnonymousMethod resolved
877         expression.
878
879         * expression.cs (New.DoResolve): Allow return values from
880         NewDelegate to also include AnonymousMethods.
881
882         Fixes #70150.
883
884 2004-11-29  Raja R Harinath  <rharinath@novell.com>
885
886         * decl.cs (MemberCore.MemberName): Remove readonly to fix an error
887         cs1648 report.
888         * rootcontext.cs (ResolveCore::interfaces_first_stage): Add
889         System.Runtime.InteropServices._Exception, since it's a base
890         interface of the core type System.Exception in the net_2_0 profile.
891
892 2004-11-27  Martin Baulig  <martin@ximian.com>
893
894         * ecore.cs (Expression.StoreFromPtr): Use `stobj' for generic parameters.
895
896 2004-11-26  Raja R Harinath  <rharinath@novell.com>
897
898         * Makefile: Convert to use executable.make.
899         * gmcs.exe.sources: New.
900
901 2004-11-25  Martin Baulig  <martin@ximian.com>
902
903         * expression.cs (Invocation.InferType): Added support for byref types.
904
905 2004-11-25  Martin Baulig  <martin@ximian.com>
906
907         * statement.cs (Foreach.FetchMethodMoveNext): Wrap `mi.ReturnType'
908         in TypeManager.TypeToCoreType().
909
910 2004-11-25  Martin Baulig  <martin@ximian.com>
911
912         * iterators.cs (Iterator.DoDefineMembers): Override and lookup the
913         "Dispose" method from the `current_type'.
914         (Iterator.EmitMoveNext): Use the `dispose_method' we looked up in
915         DoDefineMembers() instead of using the MethodBuilder; this is
916         required for generic iterators.
917
918         * class.cs (TypeContainer.DoDefineMembers): Make this virtual.
919
920 2004-11-24  Martin Baulig  <martin@ximian.com>
921
922         * ecore.cs (Expression.LoadFromPtr): Use `ldobj' for generic parameters.
923
924 2004-11-20  Martin Baulig  <martin@ximian.com>
925
926         * expression.cs (Invocation.InferType): Correctly infer generic
927         instances; see gen-103.cs.
928         (Invocation.InferTypeArguments): If a generic method doesn't have
929         any unbound type parameters, we don't need to infer anything.
930
931 2004-11-19  Raja R Harinath  <rharinath@novell.com>
932
933         * Makefile (gmcs.exe): Update to new location of bootstrap mcs.exe.
934
935 2004-11-17  Raja R Harinath  <rharinath@novell.com>
936
937         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
938         (TypeHandle.GetMemberCache): New.
939         (TypeHandle.TypeHandle): Update.
940         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
941         (TypeManager.LookupParentInterfacesCache):
942         Rename from LookupInterfaceCache.  Optimize slightly.
943         (TypeManager.MemberLookup_FindMembers): Update.
944         * decl.cs (MemberCache.MemberCache): Set Container to null in the
945         multi-type variant.
946         (AddCacheContents): Rename from AddHashtable.
947         * class.cs (TypeContainer.parent_container): Remove.
948         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
949         (TypeContainer.DoDefineMembers): Don't initialize it.
950         Update to name changes.
951         
952 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
953
954         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
955         that factors the code to check access modifiers on override.  
956
957         (PropertyBase): Use the code here.
958
959         Patch from Lluis S'anchez, fixes bug #69361.
960
961 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
962
963         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
964         routine that is used to report the use of a captured variable
965         whose address has been taken.
966
967         There are two checks: one when variables are being captured and
968         the other check is when the address of a variable is taken. 
969         
970         (because an anonymous methods might be resolved before *or* after
971         the address has been taken) and 
972
973         * expression.cs (Conditional.DoResolve): Remove the special
974         casing that Martin added to trueExpr and falseExpr being both
975         NullLiteral.  We get the right behavior now just by introducing
976         the null_type into the compiler. 
977
978         * convert.cs (ExplicitConversion): Change the code to use
979         null_type instead of testing `expr is NullLiteral'.
980         (ImplicitConversionStandard): use null_type too.
981         (ImplicitReferenceConversionExists): use null_type too.
982         (ImplicitReferenceConversion): use null_type too.
983
984         * literal.cs: The type of `NullLiteral' is now null_type instead
985         of object_type. 
986         (Resolve): Set the type here.
987
988         * typemanager.cs: Introduce null_type.
989
990 2004-11-18  Martin Baulig  <martin@ximian.com>
991
992         * rootcontext.cs
993         (RootContext.LookupType): Return a `Type', not a `TypeExpr'.
994
995 2004-11-18  Martin Baulig  <martin@ximian.com>
996
997         * ecore.cs (TypeExpr.DoResolveAsTypeStep): Make this protected.
998
999 2004-11-18  Martin Baulig  <martin@ximian.com>
1000
1001         * generic.cs (Constraints.Resolve): Take an `EmitContext' instead
1002         of a `DeclSpace'.  If one of our constraints is a `ConstructedType',
1003         call ResolveConstructedType() on it to resolve it without checking
1004         constraints.
1005         (Constraints.ResolveTypes): Check them here.
1006         (ConstructedType.DoResolveAsTypeStep): Fully resolve ourselves,
1007         but don't check constraints.
1008         (ConstructedType.ResolveAsTypeTerminal): Override this and also
1009         check constraints here.
1010         (ConstructedType.ResolveConstructedType): New public method.  This
1011         is called from DoResolveAsTypeStep() and Constraints.Resolve() to
1012         resolve ourselves without checking constraints.
1013
1014         * ecore.cs (Expression.ResolveAsTypeTerminal): Make this virtual.
1015
1016 2004-11-18  Martin Baulig  <martin@ximian.com>
1017
1018         * decl.cs
1019         (DeclSpace.CurrentType): Changed type from `TypeExpr' to `Type'.
1020
1021         * delegate.cs (Delegate.DefineType): Always create the EmitContext.
1022
1023 2004-11-18  Martin Baulig  <martin@ximian.com>
1024
1025         * ecore.cs (TypeExpr.ResolveType): Removed.
1026         (Expression.ResolveAsTypeTerminal): We always return a fully
1027         resolved `TypeExpr', so we can just access its `Type'.
1028
1029         * class.cs (TypeContainer.DefineType): Resolve `CurrentType' here.
1030
1031 2004-11-17  Martin Baulig  <martin@ximian.com>
1032
1033         * ecore.cs (IAlias.Type): Replaced with ResolveAsType() to make
1034         sure we don't return any unresolved TypeExpr's.
1035         (TypeAliasExpression): The .ctor now takes an `IAlias' instead of
1036         a `TypeExpr'.
1037         (Expression.ResolveAsTypeTerminal): Make sure `te.Type != null'.
1038
1039         * expression.cs (MemberAccess.ResolveAsTypeStep): Don't return any
1040         unresolved `ConstructedType's.
1041
1042 2004-11-17  Martin Baulig  <martin@ximian.com>
1043
1044         * ecore.cs (TypeExpr.ResolveType): Don't make this virtual.
1045
1046 2004-11-17  Martin Baulig  <martin@ximian.com>
1047
1048         * ecore.cs
1049         (Expression.ResolveAsTypeTerminal): Removed the `bool silent' argument.
1050
1051         * decl.cs (DeclSpace.ResolveType): Removed.
1052         (DeclSpace.ResolveTypeExpr): Removed the `bool silent' argument.
1053
1054 2004-11-17  Martin Baulig  <martin@ximian.com>
1055
1056         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
1057         direction, like FindMembers() does.  Fixes #69546, testcase is in
1058         test-315.cs.    
1059
1060 2004-11-16  Martin Baulig  <martin@ximian.com>
1061
1062         This is based on a patch from Marek Safar, see bug #69082.
1063         Fixes bugs #63705 and #67130.
1064
1065         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
1066         method; create a MemberCache for an interface type and cache the
1067         result.
1068
1069         * decl.cs (IMemberContainer.ParentContainer): Removed.
1070         (IMemberContainer.ParentCache): New property.
1071         (MemberCache.SetupCacheForInterface): Removed.
1072         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
1073         to create a cache for an interface's "parent".
1074
1075         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
1076         interfaces too.
1077
1078 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
1079
1080         * statement.cs: Avoid adding bools to a hashtable.
1081
1082 2004-11-15  Martin Baulig  <martin@ximian.com>
1083
1084         * decl.cs (MemberName.GetPartialName): Removed, use GetTypeName() instead.
1085
1086 2004-11-11  Martin Baulig  <martin@ximian.com>
1087
1088         * typemanager.cs (TypeManager.GetMethodName): New method.
1089
1090         * class.cs (MethodData.Define): Include the generic arity in the
1091         name of an explicit interface; also add it to the method name.
1092
1093         * pending.cs (PendingImplementation.InterfaceMethod): The method
1094         name now includes the generic arity.
1095
1096 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
1097
1098         * expression.cs (Invocation.OverloadResolve): Flag error if we are
1099         calling an unsafe method from a safe location.
1100
1101 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
1102
1103         Fix #69167
1104         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
1105
1106 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
1107
1108         * namespace.cs (VerifyUsing): use GetPartialName instead of
1109         ToString. 
1110
1111 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
1112
1113         * statement.cs (Return.Resolve): Fix regression in typo: if
1114         `in_exc', we have to request a NeedReturnLabel, this was a typo
1115         introduced in the anonymous method check-in.  Fixes #69131.
1116
1117         * Indexers were using the ShortName when defining themselves,
1118         causing a regression in the compiler bootstrap when applying the
1119         patch from 2004-11-02 (first part), now they use their full name
1120         and the bug is gone.
1121
1122 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
1123
1124         * driver.cs: Strip the path from the names of embedded resources. Fixes
1125         #68519.
1126
1127 2004-11-04  Raja R Harinath  <rharinath@novell.com>
1128
1129         Fix error message regression: cs0104-2.cs.
1130         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
1131         (AliasEntry.Resolve): Update.
1132         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
1133         'silent' flag.
1134         (RootContext.LookupType): Update.
1135
1136 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
1137
1138         * cs-parser.jay: Add support for handling accessor modifiers
1139         * class: Add support port accessor modifiers and error checking,
1140         define PropertyMethod.Define as virtual (not abstract anymore)
1141         * ecore.cs: Add checking for proeprties access with access modifiers
1142         * iterators.cs: Modify Accessor constructor call based in the modified
1143         constructor
1144 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
1145
1146         * expression.cs (StringConcat): Handle being called twice,
1147         as when we have a concat in a field init with more than two
1148         ctors in the class
1149
1150 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
1151
1152         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
1153         special case explicit implementations, we should always produce
1154         the .property or .event declaration.
1155         
1156         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
1157         since it will not return correct data if people use this
1158         unresolved in the presence of using statements (see test-313).
1159
1160         * class.cs (MethodData.Define): If we are an explicit interface
1161         implementation, set the method name to the full name of the
1162         interface plus the name of the method.  
1163
1164         Notice that using the method.MethodName.GetFullName() does not
1165         work, as it will only contain the name as declared on the source
1166         file (it can be a shorthand in the presence of using statements)
1167         and not the fully qualifed type name, for example:
1168
1169         using System;
1170
1171         class D : ICloneable {
1172                 object ICloneable.Clone ()  {
1173                 }
1174         }
1175
1176         Would produce a method called `ICloneable.Clone' instead of
1177         `System.ICloneable.Clone'.
1178
1179         * namespace.cs (Alias.Resolve): Use GetPartialName.
1180         
1181 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
1182
1183         * cs-parser.jay: Add error 1055 report.
1184
1185 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
1186
1187         * assign.cs (Assign.DoResolve): Only do the transform of
1188         assignment into a New if the types are compatible, if not, fall
1189         through and let the implicit code deal with the errors and with
1190         the necessary conversions. 
1191
1192 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
1193
1194         * cs-parser.jay: Add error 1031 report.
1195
1196         * cs-tokenizer.cs: Add location for error 1038.
1197
1198 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1199
1200         * cs-parser.jay: Add error 1016 report.
1201
1202 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1203
1204         * cs-parser.jay: Add errors 1575,1611 report.
1205
1206 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1207
1208         * cs-parser.jay: Add error 1001 report.
1209
1210 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1211
1212         Fix #68850
1213         * attribute.cs (GetMarshal): Add method argument for
1214         caller identification.
1215
1216         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
1217         agument for GetMarshal and RuntimeMissingSupport.
1218
1219 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
1220
1221         * attribute.cs (ExtractSecurityPermissionSet): Removed
1222         TypeManager.code_access_permission_type.
1223
1224         * typemanager.cs: Removed TypeManager.code_access_permission_type.
1225
1226 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
1227
1228         * expression.cs (LocalVariableReference.DoResolveLValue): Check
1229         for obsolete use of a variable here.   Fixes regression on errors
1230         cs0619-25 and cs0619-26.
1231
1232 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
1233
1234         Fix #62358, implemented security attribute encoding.
1235
1236         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
1237         Tests permitted SecurityAction for assembly or other types.
1238         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
1239         data from SecurityPermissionAttribute to PermisionSet class.
1240
1241         * class.cs (ApplyAttributeBuilder): Added special handling
1242         for System.Security.Permissions.SecurityAttribute based types.
1243
1244         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
1245         special handling for System.Security.Permissions.SecurityAttribute
1246         based types.
1247
1248         * enum.cs (ApplyAttributeBuilder): Added special handling
1249         for System.Security.Permissions.SecurityAttribute based types.
1250
1251         * parameter.cs (ApplyAttributeBuilder): Added special handling
1252         for System.Security.Permissions.SecurityAttribute based types.
1253
1254         * rootcontext.cs: Next 2 core types.
1255
1256         * typemanager.cs (TypeManager.security_permission_attr_type):
1257         Built in type for the SecurityPermission Attribute.
1258         (code_access_permission_type): Build in type.
1259
1260 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
1261
1262         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
1263         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
1264         all of this information into
1265         EmitContext.EmitCapturedVariableInstance.
1266         
1267         * codegen.cs (EmitCapturedVariableInstance): move here the
1268         funcionality of emitting an ldarg.0 in the presence of a
1269         remapping.   This centralizes the instance emit code.
1270
1271         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
1272         then emit a load of this: it means that we have reached the
1273         topmost ScopeInfo: the one that contains the pointer to the
1274         instance of the class hosting the anonymous method.
1275
1276         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
1277         captures to the topmost CaptureContext.
1278
1279 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
1280
1281         * expression.cs (LocalVariableReference): Move the knowledge about
1282         the iterators into codegen's EmitCapturedVariableInstance.
1283
1284 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
1285
1286         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
1287         all code paths return a value from an anonymous method (it is the
1288         same as the 161 error, but for anonymous methods).
1289
1290 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
1291
1292         The introduction of anonymous methods in the compiler changed
1293         various ways of doing things in the compiler.  The most
1294         significant one is the hard split between the resolution phase
1295         and the emission phases of the compiler.
1296
1297         For instance, routines that referenced local variables no
1298         longer can safely create temporary variables during the
1299         resolution phase: they must do so from the emission phase,
1300         since the variable might have been "captured", hence access to
1301         it can not be done with the local-variable operations from the runtime.
1302         
1303         * statement.cs 
1304
1305         (Block.Flags): New flag `IsTopLevel' to indicate that this block
1306         is a toplevel block.
1307
1308         (ToplevelBlock): A new kind of Block, these are the blocks that
1309         are created by the parser for all toplevel method bodies.  These
1310         include methods, accessors and anonymous methods.
1311
1312         These contain some extra information not found in regular blocks:
1313         A pointer to an optional CaptureContext (for tracking captured
1314         local variables and parameters).  A pointer to the parent
1315         ToplevelBlock.
1316         
1317         (Return.Resolve): Catch missmatches when returning a value from an
1318         anonymous method (error 1662).
1319         Invoke NeedReturnLabel from the Resolve phase instead of the emit
1320         phase.
1321
1322         (Break.Resolve): ditto.
1323
1324         (SwitchLabel): instead of defining the labels during the
1325         resolution phase, we now turned the public ILLabel and ILLabelCode
1326         labels into methods called GetILLabelCode() and GetILLabel() that
1327         only define the label during the Emit phase.
1328
1329         (GotoCase): Track the SwitchLabel instead of the computed label
1330         (its contained therein).  Emit the code by using
1331         SwitchLabel.GetILLabelCode ().
1332
1333         (LocalInfo.Flags.Captured): A new flag has been introduce to track
1334         whether the Local has been captured or not.
1335
1336         (LocalInfo.IsCaptured): New property, used to tell whether the
1337         local has been captured.
1338         
1339         * anonymous.cs: Vastly updated to contain the anonymous method
1340         support.
1341
1342         The main classes here are: CaptureContext which tracks any
1343         captured information for a toplevel block and ScopeInfo used to
1344         track the activation frames for various local variables.   
1345
1346         Each toplevel block has an optional capture context associated
1347         with it.  When a method contains an anonymous method both the
1348         toplevel method and the anonymous method will create a capture
1349         context.   When variables or parameters are captured, they are
1350         recorded on the CaptureContext that owns them, for example:
1351
1352         void Demo () {
1353              int a;
1354              MyDelegate d = delegate {
1355                  a = 1;
1356              }
1357         }
1358
1359         Here `a' will be recorded as captured on the toplevel
1360         CapturedContext, the inner captured context will not have anything
1361         (it will only have data if local variables or parameters from it
1362         are captured in a nested anonymous method.
1363
1364         The ScopeInfo is used to track the activation frames for local
1365         variables, for example:
1366
1367         for (int i = 0; i < 10; i++)
1368                 for (int j = 0; j < 10; j++){
1369                    MyDelegate d = delegate {
1370                         call (i, j);
1371                    }
1372                 }
1373
1374         At runtime this captures a single captured variable `i', but it
1375         captures 10 different versions of the variable `j'.  The variable
1376         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
1377         recorded on a child.  
1378
1379         The toplevel ScopeInfo will also track information like the `this'
1380         pointer if instance variables were referenced (this is necessary
1381         as the anonymous method lives inside a nested class in the host
1382         type of the method). 
1383
1384         (AnonymousMethod): Expanded to track the Toplevel, implement
1385         `AnonymousMethod.Compatible' to tell whether an anonymous method
1386         can be converted to a target delegate type. 
1387
1388         The routine now also produces the anonymous method content
1389
1390         (AnonymousDelegate): A helper class that derives from
1391         DelegateCreation, this is used to generate the code necessary to
1392         produce the delegate for the anonymous method that was created. 
1393
1394         * assign.cs: API adjustments for new changes in
1395         Convert.ImplicitStandardConversionExists.
1396
1397         * class.cs: Adjustments to cope with the fact that now toplevel
1398         blocks are of type `ToplevelBlock'. 
1399
1400         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
1401         insteda of standard blocks.
1402
1403         Flag errors if params arguments are passed to anonymous methods.
1404
1405         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
1406         `CurrentAnonymousMethod' which points to the current Anonymous
1407         Method.  The variable points to the AnonymousMethod class that
1408         holds the code being compiled.  It is set in the new EmitContext
1409         created for the anonymous method.
1410
1411         (EmitContext.Phase): Introduce a variable and an enumeration to
1412         assist in enforcing some rules about when and where we are allowed
1413         to invoke certain methods (EmitContext.NeedsReturnLabel is the
1414         only one that enfonces this right now).
1415
1416         (EmitContext.HaveCaptureInfo): new helper method that returns
1417         whether we have a CapturedContext initialized.
1418
1419         (EmitContext.CaptureVariable): New method used to register that a
1420         LocalInfo must be flagged for capturing. 
1421
1422         (EmitContext.CapturedParameter): New method used to register that a
1423         parameters must be flagged for capturing. 
1424         
1425         (EmitContext.CapturedField): New method used to register that a
1426         field must be flagged for capturing. 
1427
1428         (EmitContext.HaveCapturedVariables,
1429         EmitContext.HaveCapturedFields): Return whether there are captured
1430         variables or fields. 
1431
1432         (EmitContext.EmitMethodHostInstance): This is used to emit the
1433         instance for the anonymous method.  The instance might be null
1434         (static methods), this (for anonymous methods that capture nothing
1435         and happen to live side-by-side with the current method body) or a
1436         more complicated expression if the method has a CaptureContext.
1437
1438         (EmitContext.EmitTopBlock): Routine that drives the emission of
1439         code: it will first resolve the top block, then emit any metadata
1440         and then emit the code.  The split is done so that we can extract
1441         any anonymous methods and flag any captured variables/parameters.
1442         
1443         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
1444         during this phase, the ILGenerator should not be used as labels
1445         and local variables declared here might not be accessible to any
1446         code that is part of an anonymous method.  
1447
1448         Exceptions to this include the temporary variables that are
1449         created by some statements internally for holding temporary
1450         variables. 
1451         
1452         (EmitContext.EmitMeta): New routine, in charge of emitting all the
1453         metadata for a cb
1454
1455         (EmitContext.TemporaryReturn): This method is typically called
1456         from the Emit phase, and its the only place where we allow the
1457         ReturnLabel to be defined other than the EmitMeta.  The reason is
1458         that otherwise we would have to duplicate a lot of logic in the
1459         Resolve phases of various methods that today is on the Emit
1460         phase. 
1461
1462         (EmitContext.NeedReturnLabel): This no longer creates the label,
1463         as the ILGenerator is not valid during the resolve phase.
1464
1465         (EmitContext.EmitThis): Extended the knowledge in this class to
1466         work in anonymous methods in addition to iterators. 
1467
1468         (EmitContext.EmitCapturedVariableInstance): This emits whatever
1469         code is necessary on the stack to access the instance to a local
1470         variable (the variable will be accessed as a field).
1471
1472         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
1473         EmitContext.EmitAddressOfParameter): Routines to support
1474         parameters (not completed at this point). 
1475         
1476         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
1477         will also remove the parameters.
1478
1479         * convert.cs (Convert): Define a `ConstantEC' which points to a
1480         null.  This is just to prefity some code that uses
1481         ImplicitStandardConversion code and do not have an EmitContext
1482         handy.
1483
1484         The idea is to flag explicitly that at that point in time, it is
1485         known that the conversion will not trigger the delegate checking
1486         code in implicit conversions (which requires a valid
1487         EmitContext). 
1488
1489         Everywhere: pass new EmitContext parameter since
1490         ImplicitStandardConversionExists now requires it to check for
1491         anonymous method conversions. 
1492
1493         (Convert.ImplicitStandardConversionExists): If the type of an
1494         expression is the anonymous_method_type, and the type is a
1495         delegate, we invoke the AnonymousMethod.Compatible method to check
1496         whether an implicit conversion is possible. 
1497
1498         (Convert.ImplicitConversionStandard): Only do implicit method
1499         group conversions if the language level is not ISO_1.
1500
1501         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
1502         MethodInfo for the Invoke method.  used by Delegate and
1503         AnonymousDelegate.
1504
1505         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
1506         method conversions if the target type is a delegate.
1507
1508         Removed extra debugging nops.
1509
1510         (LocalVariableReference): Turn the `local_info' into a public
1511         field. 
1512
1513         Add `prepared' field, the same hack used for FieldExprs to cope
1514         with composed assignments, as Local variables do not necessarily
1515         operate purely on the stack as they used to: they can be captured
1516         fields. 
1517
1518         Add `temp' for a temporary result, like fields.
1519
1520         Refactor DoResolve and DoResolveLValue into DoResolveBase.
1521
1522         It now copes with Local variables that are captured and emits the
1523         proper instance variable to load it from a field in the captured
1524         case. 
1525
1526         (ParameterReference.DoResolveBase): During the resolve phase,
1527         capture parameters if we are in an anonymous method.
1528
1529         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
1530         anonymous method, use the EmitContext helper routines to emit the
1531         parameter reference.
1532
1533         * iterators.cs: Set RemapToProxy to true/false during the
1534         EmitDispose class.
1535
1536         * parameters.cs (GetParameterByName): New helper method. 
1537
1538         * typemanager.cs (anonymous_method_type) a new type that
1539         represents an anonyous method.  This is always an internal type,
1540         used as a fencepost to test against the anonymous-methodness of an
1541         expression. 
1542         
1543 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
1544
1545         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
1546         561 report.
1547         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
1548
1549 2004-11-10  Martin Baulig  <martin@ximian.com>
1550
1551         * expression.cs (Invocation.BetterFunction): If two methods have
1552         equal parameter types, but only one of them is generic, the
1553         non-generic one wins.
1554         (New.DoResolve): Don't set `is_struct' to false if we're a generic
1555         instance; just use `Type.IsValueType' to determine whether
1556         something is a struct or not.
1557         (MemberAccess.DoResolveAsTypeStep): Don't modify the `args' field,
1558         so we can be called multiple times.
1559
1560 2004-11-10  Martin Baulig  <martin@ximian.com>
1561
1562         * generic.cs (TypeParameter.DefineConstraints): New public method.
1563         (TypeParameter.CheckAccessLevel): Override this and return true.
1564         (ConstructedType.ResolveType): Renamed to DoResolveType(), don't
1565         override ResolveType() anymore.
1566         (ConstructedType.DoResolveAsTypeStep): Call DoResolveType() here.
1567
1568 2004-11-10  Martin Baulig  <martin@ximian.com>
1569
1570         * rootcontext.cs (RootContext.LookupType): If we're a nested type,
1571         call DeclSpace.ResolveNestedType() on it.
1572
1573 2004-11-10  Martin Baulig  <martin@ximian.com>
1574
1575         * support.cs (ReflectionParameters.ParameterModifier): If `gpd' is
1576         non-null, call ParameterModifier() on it.
1577
1578 2004-11-10  Martin Baulig  <martin@ximian.com>
1579
1580         * iterators.cs
1581         (Iterators): Added `current_type' and `this_type' fields.
1582         (Iterators.DefineIterator): Create a new EmitContext and store it
1583         in `ec'; compute `this_type'.
1584
1585 2004-11-10  Martin Baulig  <martin@ximian.com>
1586
1587         * typemanager.cs
1588         (TypeManager.IsPrivateAccessible): New public method.
1589         (Closure.Filter): Use IsPrivateAccessible() instead of IsEqual().
1590
1591 2004-11-10  Martin Baulig  <martin@ximian.com>
1592
1593         * class.cs (TypeContainer.DefineType): Call
1594         TypeBuilder.DefineGenericParameters() before resolving the type
1595         parameters.
1596         (MethodData.parent_method): New protected field.
1597         (MethodData..ctor): Added `MethodInfo parent_method' argument.
1598         (MethodData.Define): Compute `parent_method'.
1599
1600         * decl.cs
1601         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
1602         (MemberCore.GetClsCompliantAttributeValue): Likewise.
1603         (DeclSpace.ec): New protected field; store the EmitContext here.
1604         (DeclSpace.EmitContext): New public property.
1605         (DeclSpace.ResolveType): Un-comment from the [Obsolte] attribute.
1606         (DeclSpace.ResolveNestedType): New public method.
1607         (DeclSpace.ResolveTypeExpr): Just call ResolveAsTypeTerminal() here.
1608         (DeclSpace.NestedAccessible): Added `Type tb' argument.
1609         (DeclSpace.FamilyAccessible): Likewise.
1610         (DeclSpace.FindType): Call ResolveNestedType() for nested types.
1611         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
1612         EmitContext.
1613
1614         * delegate.cs (Delegate.Define): Store the EmitContext in the `ec'
1615         field.
1616
1617         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
1618         (Enum.Emit): Don't create a new EmitContext.
1619
1620 2004-10-18  Martin Baulig  <martin@ximian.com>
1621
1622         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
1623         `Type' directly, but call ResolveType() on it.
1624         (Catch.Resolve): Likewise.
1625         (Foreach.Resolve): Likewise.
1626
1627 2004-10-18  Martin Baulig  <martin@ximian.com>
1628
1629         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
1630         `Type' directly, but call ResolveType() on it.
1631         (Probe.DoResolve): Likewise.
1632         (ArrayCreation.LookupType): Likewise.
1633         (TypeOf.DoResolve): Likewise.
1634         (SizeOf.DoResolve): Likewise.
1635
1636 2004-10-18  Raja R Harinath  <rharinath@novell.com>
1637
1638         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
1639         the ResolveType.
1640
1641 2004-10-17  John Luke  <john.luke@gmail.com>
1642
1643         * class.cs (Operator.GetSignatureForError): use CSharpName
1644
1645         * parameter.cs (Parameter.GetSignatureForError): Returns
1646         correct name even if was not defined.
1647
1648 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1649
1650         Fix #65816.
1651         * class.cs (TypeContainer.EmitContext): New property.
1652         (DefineNestedTypes): Create an emitcontext for each part.
1653         (MethodCore.DoDefineParameters): Use container's emitcontext.
1654         Pass type array to InternalParameters.
1655         (MemberBase.DoDefine): Use container's emitcontext.
1656         (FieldMember.Define): Likewise.
1657         (Event.Define): Likewise.
1658         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1659         Pass type array to InternalParameters.
1660         (SetIndexerMethod.GetParameterInfo): Likewise.
1661         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1662         * delegate.cs (Define): Pass emitcontext to
1663         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1664         array to InternalParameters.
1665         * expression.cs (ParameterReference.DoResolveBase): Pass
1666         emitcontext to GetParameterInfo.
1667         (ComposedCast.DoResolveAsTypeStep): Remove check on
1668         ec.ResolvingTypeTree.
1669         * parameter.cs (Parameter.Resolve): Change argument to
1670         EmitContext.  Use ResolveAsTypeTerminal.
1671         (Parameter.GetSignature): Change argument to EmitContext.
1672         (Parameters.ComputeSignature): Likewise.
1673         (Parameters.ComputeParameterTypes): Likewise.
1674         (Parameters.GetParameterInfo): Likewise.
1675         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1676         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1677         * support.cs (InternalParameters..ctor): Remove variant that takes
1678         a DeclSpace.
1679         * typemanager.cs (system_intptr_expr): New.
1680         (InitExpressionTypes): Initialize it.
1681
1682 2004-10-12  Chris Toshok  <toshok@ximian.com>
1683
1684         * cs-parser.jay: fix location for try_statement and catch_clause.
1685
1686 2004-10-18  Martin Baulig  <martin@ximian.com>
1687
1688         * class.cs (FieldMember.Define): Don't access the TypeExpr's
1689         `Type' directly, but call ResolveType() on it.
1690         (MemberBase.DoDefine): Likewise.
1691
1692         * expression.cs (New.DoResolve): Don't access the TypeExpr's
1693         `Type' directly, but call ResolveType() on it.
1694         (ComposedCast.DoResolveAsTypeStep): Likewise.
1695
1696         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
1697         `Type' directly, but call ResolveType() on it.
1698
1699 2004-10-17  John Luke  <john.luke@gmail.com>
1700
1701         * class.cs (Operator.GetSignatureForError): use CSharpName
1702
1703         * parameter.cs (Parameter.GetSignatureForError): Returns
1704         correct name even if was not defined.
1705
1706 2004-10-13  Raja R Harinath  <rharinath@novell.com>
1707
1708         Fix #65816.
1709         * class.cs (TypeContainer.EmitContext): New property.
1710         (DefineNestedTypes): Create an emitcontext for each part.
1711         (MethodCore.DoDefineParameters): Use container's emitcontext.
1712         Pass type array to InternalParameters.
1713         (MemberBase.DoDefine): Use container's emitcontext.
1714         (FieldMember.Define): Likewise.
1715         (Event.Define): Likewise.
1716         (SetMethod.GetParameterInfo): Change argument to EmitContext.
1717         Pass type array to InternalParameters.
1718         (SetIndexerMethod.GetParameterInfo): Likewise.
1719         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
1720         * delegate.cs (Define): Pass emitcontext to
1721         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
1722         array to InternalParameters.
1723         * expression.cs (ParameterReference.DoResolveBase): Pass
1724         emitcontext to GetParameterInfo.
1725         (ComposedCast.DoResolveAsTypeStep): Remove check on
1726         ec.ResolvingTypeTree.
1727         * parameter.cs (Parameter.Resolve): Change argument to
1728         EmitContext.  Use ResolveAsTypeTerminal.
1729         (Parameter.GetSignature): Change argument to EmitContext.
1730         (Parameters.ComputeSignature): Likewise.
1731         (Parameters.ComputeParameterTypes): Likewise.
1732         (Parameters.GetParameterInfo): Likewise.
1733         (Parameters.ComputeAndDefineParameterTypes): Likewise.
1734         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
1735         * support.cs (InternalParameters..ctor): Remove variant that takes
1736         a DeclSpace.
1737         * typemanager.cs (system_intptr_expr): New.
1738         (InitExpressionTypes): Initialize it.
1739
1740 2004-10-12  Chris Toshok  <toshok@ximian.com>
1741
1742         * cs-parser.jay: fix location for try_statement and catch_clause.
1743
1744 2004-10-07  Raja R Harinath  <rharinath@novell.com>
1745
1746         More DeclSpace.ResolveType avoidance.
1747         * decl.cs (MemberCore.InUnsafe): New property.
1748         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
1749         with newly created EmitContext.
1750         (FieldMember.Define): Likewise.
1751         * delegate.cs (Delegate.Define): Likewise.
1752         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
1753         only if normal name-lookup fails.
1754         (TypeExpr.DoResolve): Enable error-checking.
1755         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
1756         (SizeOf.DoResolve): Likewise.
1757         (ComposedCast.DoResolveAsTypeStep): Likewise.
1758         (StackAlloc.DoResolve): Likewise.
1759         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
1760         (Block.Unsafe): New property.
1761         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
1762         (Unsafe): Set 'unsafe' flag of contained block.
1763         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
1764         (Fixed.Resolve): Likewise.
1765         (Catch.Resolve): Likewise.
1766         (Using.ResolveLocalVariableDecls): Likewise.
1767         (Foreach.Resolve): Likewise.
1768
1769 2004-10-05  John Luke <john.luke@gmail.com>
1770
1771         * cs-parser.jay: add location to error CS0175
1772
1773 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
1774
1775         * ecore.cs (Expression.Constantity): Add support for turning null
1776         into a constant.
1777
1778         * const.cs (Const.Define): Allow constants to be reference types
1779         as long as the value is Null.
1780
1781 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
1782
1783         * namespace.cs (NamespaceEntry.Using): No matter which warning
1784         level is set, check if this namespace name has already been added.
1785
1786 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
1787
1788         * expression.cs: reftype [!=]= null should always use br[true,false].
1789         # 67410
1790
1791 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
1792
1793         Fix #67108
1794         * attribute.cs: Enum conversion moved to 
1795         GetAttributeArgumentExpression to be applied to the all
1796         expressions.
1797
1798 2004-10-01  Raja R Harinath  <rharinath@novell.com>
1799
1800         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
1801         * class.c (TypeContainer.DefineType): Flag error if
1802         base types aren't accessible due to access permissions.
1803         * decl.cs (DeclSpace.ResolveType): Move logic to
1804         Expression.ResolveAsTypeTerminal.
1805         (DeclSpace.ResolveTypeExpr): Thin layer over
1806         Expression.ResolveAsTypeTerminal.
1807         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
1808         Refactor code into NestedAccess.  Use it.
1809         (DeclSpace.NestedAccess): New.
1810         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
1811         argument to silence errors.  Check access permissions.
1812         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
1813         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
1814         (Cast.DoResolve): Likewise.
1815         (New.DoResolve): Likewise.
1816         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
1817         (TypeOf.DoResolve): Likewise.
1818
1819         * expression.cs (Invocation.BetterConversion): Return the Type of
1820         the better conversion.  Implement section 14.4.2.3 more faithfully.
1821         (Invocation.BetterFunction): Make boolean.  Make correspondence to
1822         section 14.4.2.2 explicit.
1823         (Invocation.OverloadResolve): Update.
1824         (Invocation): Remove is_base field.
1825         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
1826         (Invocation.Emit): Likewise.
1827
1828 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
1829
1830         * cs-parser.jay: Reverted 642 warning fix.
1831
1832 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1833
1834         Fix bug #66615
1835         * decl.cs (FindMemberWithSameName): Indexer can have more than
1836         1 argument.
1837
1838 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1839
1840         * expression.cs (LocalVariableReference.DoResolveLValue):
1841         Do not report warning 219 for out values.
1842         (EmptyExpression.Null): New member to avoid extra allocations.
1843
1844 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1845
1846         * cs-parser.jay: Fix wrong warning 642 report.
1847
1848         * cs-tokenizer.cs (CheckNextToken): New helper;
1849         Inspect next character if is same as expected.
1850
1851 2004-09-23  Martin Baulig  <martin@ximian.com>
1852
1853         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1854         (Convert.ImplicitReferenceConversionExists): Likewise.
1855
1856 2004-11-09  Raja R Harinath  <rharinath@novell.com>
1857
1858         * Makefile (DISTFILES): Comment out a few missing files.
1859
1860 2004-10-29  Raja R Harinath  <rharinath@novell.com>
1861
1862         * Makefile (bootstrap_libs,bootstrap_libfiles): New.
1863         (bootstrap-libs): New target.  Invokes the net_2_0_bootstrap profile.
1864         (gmcs.exe): Invoke bootstrap-libs.
1865         (clean-local): Clean the net_2_0_bootstrap profile too.
1866         (PROGRAM_INSTALL_DIR): New.
1867         (install-local): Use it.
1868
1869 2004-10-13  Martin Baulig  <martin@ximian.com>
1870
1871         * generic.cs (TypeManager.InflatedConstraints): New nested class.
1872         (TypeParameter.DefineType): If we're a method type parameter and
1873         that method is overriding something, "inflate" its constraints.
1874
1875 2004-10-12  Martin Baulig  <martin@ximian.com>
1876
1877         * expression.cs (MemberAccess.DoResolve): If we're a SimpleName
1878         and have type arguments, create and resolve a ConstructedType.
1879
1880 2004-10-12  Martin Baulig  <martin@ximian.com>
1881
1882         * decl.cs (MemberCache.FindMemberToOverride): Use
1883         TypeManager.IsEqual() to compare the parameters and Type.Equals()
1884         to compare the invocationType.
1885
1886         * typemanager.cs (TypeManager.IsEqual): Added support for arrays.
1887         When comparing two type parameters, only do the signature-only
1888         comparision for method type parameters.
1889
1890 2004-10-11  Martin Baulig  <martin@ximian.com>
1891
1892         * report.cs: Don't make --fatal abort on warnings, we have
1893         -warnaserror for that.
1894
1895 2004-10-11  Martin Baulig  <martin@ximian.com>
1896
1897         * typemanager.cs
1898         (TypeManager.IsEqualGenericType): Removed, use IsEqual() instead.
1899         (TypeManager.IsEqual): Call ourself recursively instead of using
1900         Type.IsEqual(). 
1901
1902 2004-10-11  Martin Baulig  <martin@ximian.com>
1903
1904         * class.cs (TypeContainer.DefineType): Only call TypeParameter.Define()
1905         on our own type parameters, not on the ones we inherit from a containing
1906         class.
1907
1908         * expression.cs (Invocation.InferType): Use `==', not `Equals()' for
1909         the comparision.
1910
1911         * generic.cs (TypeParameter.Define): We may only be called once.
1912
1913         * pending.cs (Pending.InterfaceMethod): Call TypeManager.Real_IsEqual()
1914         instead of TypeManager.IsEqual().
1915
1916 2004-09-28  Martin Baulig  <martin@ximian.com>
1917
1918         * generic.cs
1919         (GenericConstraints.EffectiveBaseClass): New public property.
1920         (TypeParameter.GenericConstraints): New public property.
1921         (ConstructedType.CheckConstraints): Improved.
1922
1923         * convert.cs (Convert.TypeParam_EffectiveBaseType): New private method.
1924         (Convert.TypeParameterConversion): New private method; use this in
1925         ImplicitReferenceConversion() and ImplicitReferenceConversionExists()
1926         for all conversions related to type parameters.
1927
1928 2004-09-24  Martin Baulig  <martin@ximian.com>
1929
1930         * convert.cs (Convert.ImplicitReferenceConversion): Added implicit
1931         type parameter conversions for type parameters which are known to
1932         be reference types.
1933
1934 2004-09-24  Martin Baulig  <martin@ximian.com>
1935
1936         * generic.cs (GenericConstraints): Added `IsReferenceType' and
1937         `IsValueType' properties.
1938
1939         * support.cs (ReflectionConstraints): Use
1940         Type.GetGenericParameterConstraints() instead of the old hack.
1941
1942 2004-09-24  Martin Baulig  <martin@ximian.com>
1943
1944         * generic.cs (GenericConstraints): Moved here and made it an
1945         abstract class.
1946
1947         * support.cs (GenericConstraints): Moved to generic.cs.
1948
1949 2004-09-24  Martin Baulig  <martin@ximian.com>
1950
1951         * support.cs
1952         (ReflectionConstraints): Un-nested this class and made it public.
1953
1954         * typemanager.cs
1955         (TypeManager.GetTypeParameterConstraints): New public method.
1956         (TypeManager.HasConstructorConstraint): Use the attributes.
1957
1958 2004-09-24  Martin Baulig  <martin@ximian.com>
1959
1960         * support.cs (GenericConstraints): Replaced `HasConstructor',
1961         `IsReferenceType' and `IsValueType' with `Attributes'.
1962         (ReflectionParameters.ReflectionConstraints): Removed the Create()
1963         method and made the .ctor public.
1964
1965         * generic.cs (Constraints.Attributes): New public property.
1966         (Constraints): Renamed `HasConstructor' -> `HasConstructorConstraint',
1967         `IsReferenceType' -> `HasReferenceTypeConstraint' and
1968         `IsValueType' -> `HasValueTypeConstraint'.
1969
1970 2004-09-23  Martin Baulig  <martin@ximian.com>
1971
1972         * generic.cs (Constraints): Reflect latest runtime changes.
1973
1974 2004-09-23  Martin Baulig  <martin@ximian.com>
1975
1976         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
1977         (Convert.ImplicitReferenceConversionExists): Likewise.
1978
1979 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
1980
1981         * class.cs (Operator.Define): Add error 448 and 559 report.
1982         
1983 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1984
1985         * class.cs (MemberBase.IsTypePermitted): New protected
1986         method for checking error CS0610.
1987
1988 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
1989
1990         * class.cs (TypeContainer.HasExplicitLayout): New property
1991         Returns whether container has StructLayout attribute set Explicit.
1992         (FieldMember): New abstract class for consts and fields.
1993         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
1994         (Field): Reuse FieldMember.
1995
1996         * const.cs (Const): Reuse FieldMember.
1997
1998         * rootcontext.cs: EmitConstants call moved to class.
1999
2000 2004-09-22  Martin Baulig  <martin@ximian.com>
2001
2002         Marek and me just fixed one of our oldest bugs: #28562 :-)
2003
2004         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
2005
2006         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
2007         we're an EnumConstant, just return that.
2008         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
2009         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
2010         to get the value which'll actually be written into the attribute.
2011         However, we have to use GetValue() to access the attribute's value
2012         in the compiler.        
2013
2014 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
2015
2016         * constant.cs (Constant.IsNegative): New abstract property
2017         IsNegative.
2018
2019         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
2020         (StackAlloc.DoResolve): Reused IsNegative.
2021
2022 2004-09-22  Martin Baulig  <martin@ximian.com>
2023
2024         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
2025         public method; like LookupTypeContainer, but also works for
2026         generic instances.
2027
2028         * report.cs (Report.SymbolRelatedToPreviousError): Use
2029         TypeManager.LookupGenericTypeContainer().       
2030
2031 2004-09-22  Martin Baulig  <martin@ximian.com>
2032
2033         Thanks to Peter Sestoft for this bug report.
2034
2035         * expression.cs (Conditional): If both the `trueExpr' and the
2036         `falseExpr' is a NullLiteral, return a NullLiteral.
2037
2038 2004-09-22  Martin Baulig  <martin@ximian.com>
2039
2040         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
2041         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
2042         for the "get_Current" call.
2043
2044 2004-09-21  Martin Baulig  <martin@ximian.com>
2045
2046         * convert.cs (Convert.ImplicitReferenceConversion): When
2047         converting to an interface type, first check whether we're
2048         converting from a reference type.
2049
2050 2004-09-14  Martin Baulig  <martin@ximian.com>
2051
2052         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
2053
2054 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
2055
2056         Fixed bug #61902
2057         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
2058         called and is obsolete then this member suppress message
2059         when call is inside next [Obsolete] method or type.
2060
2061         * expression.cs: Use TestObsoleteMethodUsage member.
2062
2063 2004-09-14  Martin Baulig  <martin@ximian.com>
2064
2065         * genericparser.cs: Removed.
2066
2067 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
2068
2069         * class.cs (MethodCore.CheckBase): Fix bug #65757.
2070
2071 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
2072
2073         * attribute.cs (Attribute.Resolve): Add error 653 report.
2074
2075         * class.cs (Class.ApplyAttributeBuilder): Add error 641
2076         report.
2077         (Method.ApplyAttributeBuilder): Add error 685 report.
2078         (Operator.Define): Add error 564 report.
2079
2080         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
2081
2082         * expression.cs (Invocation.DoResolve): Add error
2083         245 and 250 report.
2084
2085         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
2086         error 674 report.
2087
2088 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2089
2090         * class.cs (ConstructorInitializer.Resolve):
2091         Wrong error number (515->516).
2092
2093 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2094
2095         * class.cs (Indexer.Define): Add error 631 report.
2096
2097 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2098
2099         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
2100
2101 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2102
2103         * expression.cs (Probe.DoResolve): Add error CS0241 report.
2104
2105 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
2106
2107         * cs-parser.jay: Added error CS0241 report.
2108
2109 2004-09-10  Raja R Harinath  <rharinath@novell.com>
2110
2111         * cs-parser.jay (fixed_statement): Introduce a scope for the
2112         declaration in the 'fixed' statement.
2113
2114 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2115
2116         * cs-parser.jay: Added CS0230 error report.
2117
2118 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2119
2120         * cs-parser.jay: Added errors CS0231 and CS0257 report.
2121
2122 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2123
2124         * expression.cs (Argument.Resolve): Added error CS0192 and
2125         CS0199 report.
2126
2127 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
2128
2129         C# 2.0 #pragma warning feature
2130
2131         * cs-tokenizer.cs (PreProcessPragma): New method; 
2132         Handles #pragma directive.
2133
2134         * report.cs (WarningRegions): New class; Support
2135         class for #pragma warning directive. It tests whether
2136         warning is enabled for a given line.
2137
2138 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
2139
2140         * const.cs: Add more descriptive error report, tahnks to
2141         Sebastien. 
2142
2143 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
2144
2145         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
2146
2147 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
2148
2149         * expression.cs: Apply patch from Ben: Remove dead code from
2150         ArrayCreation, and remove the TurnintoConstant call in const.cs,
2151         as that code just threw an exception anwyays.
2152
2153         * const.cs: Remove the call to the turnintoconstant, for details
2154         see bug: #63144
2155         
2156         * literal.cs: The type of the null-literal is the null type;  So
2157         we use a placeholder type (literal.cs:System.Null, defined here)
2158         for it.
2159
2160         * expression.cs (Conditional.DoResolve): Remove some old code that
2161         is no longer needed, conversions have been fixed.
2162
2163         (ArrayCreationExpression.DoResolve): Return false if we fail to
2164         resolve the inner expression.
2165
2166 2004-09-07  Raja R Harinath  <rharinath@novell.com>
2167
2168         Fix test-290.cs.
2169         * cs-parser.jay (delegate_declaration): Record a delegate
2170         declaration as a type declaration.
2171         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
2172
2173 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
2174
2175         * parameter.cs: Do not crash if the type can not be resolved. 
2176
2177         * expression.cs: Report errors with unsafe pointers, fixes #64896
2178
2179 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2180
2181         * expression.cs: Pointer arith always needs to do a conv.i
2182         if the operand is a long. fix 65320
2183
2184 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
2185
2186         Fixed cs0619-37.cs, cs0619-38.cs
2187
2188         * enum.cs (GetObsoleteAttribute): Removed.
2189
2190         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
2191         on Enum member is double staged. The first is tested member
2192         and then enum.
2193
2194 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
2195
2196         Fixed #56986, #63631, #65231
2197
2198         * class.cs: (TypeContainer.AddToMemberContainer): New method,
2199         adds member to name container.
2200         (TypeContainer.AddToTypeContainer): New method, adds type to
2201         name container.
2202         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
2203         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
2204         AddOperator): Simplified by reusing AddToMemberContainer.
2205         (TypeContainer.UserDefinedStaticConstructor): Changed to property
2206         instead of field.
2207         (Method.CheckForDuplications): Fixed implementation to test all
2208         possibilities.
2209         (MemberBase): Detection whether member is explicit interface
2210         implementation is now in constructor.
2211         (MemberBase.UpdateMemberName): Handles IndexerName.
2212         (Accessor): Changed to keep also location information.
2213         (AbstractPropertyEventMethod): Is derived from MemberCore.
2214         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
2215         will be emited or not.
2216         (PropertyBase.AreAccessorsDuplicateImplementation):
2217         Tests whether accessors are not in collision with some method.
2218         (Operator): Is derived from MethodCore to simplify common
2219         operations.
2220
2221         * decl.cs (Flags.TestMethodDuplication): Test for duplication
2222         must be performed.
2223         (DeclSpace.AddToContainer): Adds the member to defined_names
2224         table. It tests for duplications and enclosing name conflicts.
2225
2226         * enum.cs (EnumMember): Clean up to reuse the base structures
2227
2228 2004-09-03  Martin Baulig  <martin@ximian.com>
2229
2230         Merged latest changes into gmcs.  Please keep this comment in
2231         here, it makes it easier for me to see what changed in MCS since
2232         the last time I merged.
2233
2234 2004-09-03  Martin Baulig  <martin@ximian.com>
2235
2236         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
2237         into TypeContainer, to make partial classes work again.
2238
2239 2004-09-03  Martin Baulig  <martin@ximian.com>
2240
2241         * rootcontext.cs (RootContext.V2): Removed.
2242
2243 2004-03-23  Martin Baulig  <martin@ximian.com>
2244
2245         * expression.cs (Invocation.OverloadResolve): Added `bool
2246         may_fail' argument and use it instead of the Location.IsNull() hack.
2247
2248 2004-09-09  Martin Baulig  <martin@ximian.com>
2249
2250         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
2251
2252 2004-09-09  Martin Baulig  <martin@ximian.com>
2253
2254         * generic.cs (TypeParameter.DefineType): Added support for
2255         explicit interface methods.
2256
2257 2004-09-09  Martin Baulig  <martin@ximian.com>
2258
2259         * README.Changes: New document.  Started to list important changes
2260         between MCS and GMCS here.
2261
2262 2004-09-08  Martin Baulig  <martin@ximian.com>
2263
2264         * class.cs
2265         (TypeContainer.CheckRecursiveDefinition): New protected method.
2266         (TypeContainer.DefineType): Move the CS0146 check into
2267         CheckRecursiveDefinition().     
2268
2269 2004-09-06  Martin Baulig  <martin@ximian.com>
2270
2271         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
2272         types for the constructor constraint.
2273
2274 2004-09-03  Martin Baulig  <martin@ximian.com>
2275
2276         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
2277         into TypeContainer, to make partial classes work again.
2278
2279 2004-09-03  Martin Baulig  <martin@ximian.com>
2280
2281         * rootcontext.cs (RootContext.V2): Removed.
2282
2283 2004-03-23  Martin Baulig  <martin@ximian.com>
2284
2285         * expression.cs (Invocation.OverloadResolve): Added `bool
2286         may_fail' argument and use it instead of the Location.IsNull() hack.
2287
2288 2004-09-03  Martin Baulig  <martin@ximian.com>
2289
2290         Merged latest changes into gmcs.  Please keep this comment in
2291         here, it makes it easier for me to see what changed in MCS since
2292         the last time I merged.
2293
2294 2004-09-03  Raja R Harinath  <rharinath@novell.com>
2295
2296         Fix #61128.
2297         * expression.cs (BetterConversion): Don't allow either conversion 
2298         to be null.  Remove redundant implicit conversion test when 'q ==
2299         null' -- when this function is invoked, we already know that the
2300         implicit conversion exists.
2301         (BetterFunction): Assume that 'best' is non-null.  Remove
2302         redundant reimplementation of IsApplicable when 'best' is null.
2303         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
2304         number of arguments.
2305         (IsAncestralType): Extract from OverloadResolve.
2306         (OverloadResolve): Make robust to the MethodGroupExpr being
2307         unsorted.  Implement all the logic of Section 14.5.5.1, and
2308         support overloading of methods from multiple applicable types.
2309         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
2310
2311         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
2312         (RealError, Warning): Append type of report to related symbol.
2313
2314 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
2315
2316         * enum.cs: Fixed CLS-Compliance checks for enum members.
2317         Error tests cs3008-8.cs, cs3014-8.cs
2318
2319 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
2320
2321         Fixed bug #62342, #63102
2322         * class.cs: ImplementIndexer uses member.IsExplicitImpl
2323         like ImplementMethod.
2324
2325 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
2326
2327         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2328         Fixed bug #65170.
2329
2330 2004-09-02  Martin Baulig  <martin@ximian.com>
2331
2332         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
2333         TypeManager.GetArgumentTypes() rather than calling GetParameters()
2334         on the MethodBase.
2335
2336 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
2337
2338         C# 2.0 Static classes implemented
2339
2340         * class.cs (TypeContainer): instance_constructors,
2341         initialized_fields, initialized_static_fields,
2342         default_constructor, base_inteface_types are protected to be
2343         accessible from StaticClass.
2344         (TypeContainer.DefineDefaultConstructor): New virtual method
2345         for custom default constructor generating
2346         (StaticClass): New class to handle "Static classes" feature.
2347
2348         * cs-parser.jay: Handle static keyword on class like instance
2349         of StaticClass.
2350
2351         * driver.cs: Added "/langversion" command line switch with two
2352         options (iso-1, default).
2353
2354 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
2355
2356         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
2357
2358 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
2359
2360         * delegate.cs: Style.
2361
2362 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
2363
2364         * delegate.cs: Add seperate instance expr field for miguel.
2365
2366 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2367
2368         * PointerArithmetic (Resolve): make sure we are not doing
2369         pointer arith on void*. Also, make sure we are resolved
2370         by not setting eclass until resolve.
2371
2372         All callers: Make sure that PointerArithmetic gets resolved.
2373
2374 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2375
2376         * ArrayCreation (LookupType): If the type does not resolve 
2377         to an array, give an error.
2378
2379 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
2380
2381         * statement.cs (Try.Resolve): Fixed bug #64222
2382
2383 2004-08-27  Martin Baulig  <martin@ximian.com>
2384
2385         * class.cs
2386         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
2387         crash here.     
2388
2389 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2390
2391         * ecore.cs (Constantify): Get underlying type via
2392         System.Enum.GetUnderlyingType to avoid StackOverflow on the
2393         Windows in special cases.
2394
2395 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
2396
2397         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
2398         for obtaining also private methods.
2399         (GetRemoveMethod): Used GetRemoveMethod (true)
2400         for obtaining also private methods.
2401
2402 2004-09-02  Martin Baulig  <martin@ximian.com>
2403
2404         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
2405         TypeManager.GetArgumentTypes() rather than calling GetParameters()
2406         on the MethodBase.
2407
2408 2004-08-27  Martin Baulig  <martin@ximian.com>
2409
2410         * class.cs
2411         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
2412         crash here.     
2413
2414 2004-08-25  Martin Baulig  <martin@ximian.com>
2415
2416         * support.cs (ReflectionParameters..ctor): If this is a generic
2417         method, retrieve and store its type parameters.
2418         (InternalParameters..ctor): Added `TypeParameter[]' argument.
2419         (ReflectionParameters.GenericConstraints): The argument specifies
2420         the type parameter, not the method parameter.
2421         (InternalParameters.GenericConstraints): Likewise.
2422
2423         * generic.cs (TypeParameter.DefineType): Correctly handle
2424         constraints wrt. generic methods in interfaces and their
2425         implementations.        
2426
2427 2004-08-24  Martin Baulig  <martin@ximian.com>
2428
2429         * generic.cs (TypeParameter.IsSubclassOf): New public method.
2430         (Constraints.IsSubclassOf): New internal method.
2431
2432         * typemanager.cs (TypeManager.FindMembers): Added special support
2433         for GenericTypeParameterBuilder's.      
2434         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
2435         type parameters.
2436
2437 2004-08-24  Martin Baulig  <martin@ximian.com>
2438
2439         * typemanager.cs
2440         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
2441         this for accessibility checks.
2442         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
2443         IsNestedFamilyAccessible.
2444         (TypeManager.IsSubclassOf): New method, do what the name actually
2445         says.   
2446
2447 2004-08-24  Martin Baulig  <martin@ximian.com>
2448
2449         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
2450         as a SimpleName, include the generic arity.
2451
2452 2004-08-24  Martin Baulig  <martin@ximian.com>
2453
2454         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
2455         MethodAttributes.HideBySig for operators.
2456
2457 2004-08-23  Martin Baulig  <martin@ximian.com>
2458
2459         Back to the old error reporting system :-)
2460
2461         * report.cs (Message): Removed.
2462         (Report.MessageData, ErrorData, WarningData): Removed.
2463         (Report.Error, Warning): Back to the old system.
2464
2465 2004-08-23  Martin Baulig  <martin@ximian.com>
2466
2467         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
2468
2469         * class.cs (TypeContainer.ParentContainer): New public virtual
2470         method; replaces the explicit interface implementation.
2471         (ClassPart.ParentContainer): Override.
2472
2473 2004-08-23  Martin Baulig  <martin@ximian.com>
2474
2475         * statement.cs (Switch): Added support for constant switches; see
2476         #59428 or test-285.cs.
2477
2478 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2479
2480         Fixed bug #62740.
2481         * statement.cs (GetEnumeratorFilter): Removed useless
2482         logic because C# specs is strict. GetEnumerator must be
2483         public.
2484
2485 2004-08-22  Martin Baulig  <martin@ximian.com>
2486
2487         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2488         a switch and may break, reset the barrier.  Fixes #59867.
2489
2490 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
2491
2492         CLS-Compliance speed up (~5% for corlib)
2493
2494         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
2495         New method. Tests container for CLS-Compliant names
2496
2497         * class.cs (TypeContainer.VerifyClsName): New method.
2498         Checks whether container name is CLS Compliant.
2499         (Constructor): Implements IMethodData.
2500
2501         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
2502         low-case table for CLS Compliance test.
2503         (MemberCache.VerifyClsParameterConflict): New method.
2504         Checks method parameters for CS3006 error.
2505
2506         * enum.cs (EnumMember): Is derived from MemberCore.
2507         (Enum.VerifyClsName): Optimized for better performance.
2508
2509 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2510
2511         * report.cs: Renamed Error_T to Error and changed all
2512         references.
2513
2514 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
2515
2516         * class.cs (TypeContainer.IndexerArrayList): New inner class
2517         container for indexers.
2518         (TypeContainer.DefaultIndexerName): New constant for default
2519         indexer name. Replaced all "Item" with this constant.
2520         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
2521
2522         * typemanager.cs (TypeManager.default_member_ctor): Cache here
2523         DefaultMemberAttribute constructor.
2524
2525 2004-08-05  Martin Baulig  <martin@ximian.com>
2526
2527         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
2528         Fix bug #59429.
2529
2530 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
2531
2532         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
2533         multi platforms problem.
2534
2535         * compiler.csproj: Included shared files.
2536
2537 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2538
2539         Fix bug 60333, 55971 in the more general way
2540         * attribute.cs (Attribute.GetAttributeArgumentExpression):
2541         Added arg_type argument for constant conversion.
2542         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
2543
2544 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2545
2546         Fix bug #59760
2547         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
2548         OperatorArrayList, MethodCoreArrayList for typecontainer
2549         containers. Changed class member types to these new types.
2550         (MethodArrayList.DefineMembers): Added test for CS0659.
2551
2552 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
2553
2554         * cfold.cs: Synchronize the folding with the code in expression.cs
2555         Binary.DoNumericPromotions for uint operands.
2556
2557         * attribute.cs: Revert patch from Raja, it introduced a regression
2558         while building Blam-1.2.1 (hard to isolate a test case).
2559
2560 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
2561
2562         Fix for #55382
2563         * class.cs:
2564         (TypeContainer.Define): Renamed to DefineContainerMembers because of
2565         name collision.
2566         (MethodCore.parent_method): New member. The method we're overriding
2567         if this is an override method.
2568         (MethodCore.CheckBase): Moved from Method class and made common.
2569         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
2570         private.
2571         (MethodCore.CheckForDuplications): New abstract method. For custom
2572         member duplication search in a container
2573         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
2574         method and its return type.
2575         (Event.conflict_symbol): New member. Symbol with same name in the
2576         parent class.
2577
2578         * decl.cs:
2579         (MemberCache.FindMemberWithSameName): New method. The method
2580         is looking for conflict with inherited symbols.
2581
2582 2004-08-04  Martin Baulig  <martin@ximian.com>
2583
2584         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
2585
2586         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
2587
2588 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2589
2590         * report.cs (Message): New enum for better error, warning reference in
2591         the code.
2592         (MessageData): New inner abstract class. It generally handles printing of
2593         error and warning messages.
2594         Removed unused Error, Warning, Message methods.
2595
2596 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2597
2598         Fix for cs0592-8.cs test
2599         * attribute.cs
2600         (Attributable.ValidAttributeTargets): Made public.
2601         (Attribute.ExplicitTarget): New member for explicit target value.
2602         (Attribute.CheckTargets): Now we translate explicit attribute
2603         target to Target here.
2604
2605 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
2606
2607         * ecore.cs (MethodGroupExpr): new IsBase property.
2608
2609         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
2610
2611         * delegate.cs (DelegateCreation): store a MethodGroupExpr
2612         rather than an instance expr.
2613
2614         (DelegateCreation.Emit): Use the method group rather than
2615         the instance expression. Also, if you have base.Foo as the
2616         method for a delegate, make sure to emit ldftn, not ldftnvirt.
2617
2618         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
2619
2620         (NewDelegate.DoResolve): Only check for the existance of Invoke
2621         if the method is going to be needed. Use MethodGroupExpr.
2622
2623         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
2624
2625         * expression.cs: For pointer arith., make sure to use
2626         the size of the type, not the size of the pointer to
2627         the type.
2628
2629 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
2630
2631         Fix for #60722
2632         * class.cs (Class): Added error CS0502 test.
2633
2634 2004-08-03  John Luke  <jluke@cfl.rr.com>
2635             Raja R Harinath  <rharinath@novell.com>
2636
2637         Fix for #60997.
2638         * attribute.cs (Attribute.complained_before): New flag.
2639         (Attribute.ResolveType, Attribute.Resolve),
2640         (Attribute.DefinePInvokeMethod): Set it.
2641         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
2642         
2643 2004-08-03  Martin Baulig  <martin@ximian.com>
2644
2645         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
2646         use a user-defined operator; we still need to do numeric
2647         promotions in case one argument is a builtin type and the other
2648         one has an implicit conversion to that type.  Fixes #62322.
2649
2650 2004-08-18  Martin Baulig  <martin@ximian.com>
2651
2652         * class.cs (Method.Define): Use the correct method name when
2653         creating the MethodBuilder for a generic method.
2654
2655 2004-08-17  Martin Baulig  <martin@ximian.com>
2656
2657         * generic.cs (Constraints): Support type parameter constraints.
2658
2659 2004-08-16  Martin Baulig  <martin@ximian.com>
2660
2661         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
2662         (Token.GENERIC_DIMENSION): New token; this is returned if we
2663         encounter an unbound generic type in a typeof() expression.
2664
2665         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
2666         this token is only generated while parsing a typeof() expression.
2667         (typeof_expression): Removed the old unbound_type hack.
2668
2669         * generic.cs (TypeArguments.IsUnbound): New public property.
2670
2671         * decl.cs (MemberName): Added support for unbound types.
2672
2673 2004-08-14  Martin Baulig  <martin@ximian.com>
2674
2675         * typemanager.cs
2676         (TypeManager.IsEqualGenericInstance): New static method.
2677         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
2678         just used to check accessibility, so follow the rules of 26.1.6.        
2679
2680         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
2681         ConstructedType instead of a TypeExpression if we have type arguments.
2682
2683         * cs-parser.jay (typeof_expression): Support unbound generic types.
2684
2685         * ecore.cs (UnboundTypeExpression): New public class.
2686
2687 2004-08-12  Martin Baulig  <martin@ximian.com>
2688
2689         * typemanager.cs (TypeManager.IsNestedChildOf): Use
2690         TypeManager.IsEqual() rather than `=='.
2691
2692         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
2693         generic instances as well.
2694
2695 2004-08-12  Martin Baulig  <martin@ximian.com>
2696
2697         * expression.cs (Invocation.InferType): We can only infer method
2698         type parameters.  Fixes #62647.
2699
2700 2004-08-11  Martin Baulig  <martin@ximian.com>
2701
2702         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
2703         before resolving the base classes.
2704
2705 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
2706
2707         * Makefile: install .mdb file too.
2708
2709 2004-08-05  Martin Baulig  <martin@ximian.com>
2710
2711         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
2712         initializer, the current type is just the TypeBuilder, not the
2713         instantiated generic type.
2714         (FieldExpr.IsFieldInitializer): New public property.
2715
2716 2004-08-04  Martin Baulig  <martin@ximian.com>
2717
2718         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
2719
2720         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
2721
2722 2004-08-03  Martin Baulig  <martin@ximian.com>
2723
2724         * class.cs (MethodData.Define): If we're an explicit
2725         implementation, remove the generic arity from the type name.
2726
2727 2004-08-03  Martin Baulig  <martin@ximian.com>
2728
2729         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
2730         use a user-defined operator; we still need to do numeric
2731         promotions in case one argument is a builtin type and the other
2732         one has an implicit conversion to that type.  Fixes #62322.
2733
2734 2004-08-02  Martin Baulig  <martin@ximian.com>
2735
2736         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
2737         `TypeExpr[]' array.
2738         (TypeContainer.GetClassBases): Return the unexpanded list of
2739         interfaces; we expand them later.
2740         (TypeContainer.DefineType): After creating the TypeBuilder, call
2741         TypeManager.ExpandInterfaces() to get an expanded and resolved
2742         list of interfaces.
2743
2744         * ecore.cs (TypeExpr.GetInterfaces): Removed
2745
2746         * generics.cs (Constraints.InterfaceConstraints): Remove.
2747         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
2748         register the interface constraints.
2749
2750         * typemanager.cs
2751         (TypeManager.AddUserType): Removed the `ifaces' argument.
2752         (TypeManager.AddTypeParameter): Likewise.
2753         (TypeManager.AddUserInterface): Removed, was unused.
2754         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
2755         `TypeExpr[]' array for the interfaces.
2756         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
2757         has been defined, returns a list of the resolved interfaces types.
2758         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
2759         (TypeManager.GetExplicitInterfaces): Likewise.  
2760
2761 2004-08-02  Martin Baulig  <martin@ximian.com>
2762
2763         * expression.cs (Invocation.EmitCall): If we're invoking a method
2764         on a type parameter, use the new `Constrained' prefix opcode.
2765
2766 2004-08-02  Martin Baulig  <martin@ximian.com>
2767
2768         * statement.cs (LocalInfo.Flags): Added `IsThis'.
2769         (LocalInfo.IsThis): New public property.
2770         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
2771
2772 2004-08-01  Martin Baulig  <martin@ximian.com>
2773
2774         * class.cs (TypeContainer.GetClassBases): Don't set the default
2775         here since we may get called from GetPartialBases().
2776         (TypeContainer.DefineType): If GetClassBases() didn't return a
2777         parent, use the default one.
2778
2779 2004-07-30  Martin Baulig  <martin@ximian.com>
2780
2781         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
2782
2783         * class.cs (SourceMethod): New public class, derive from the
2784         symbol writer's ISourceMethod.
2785         (Method): Use the new symbol writer API.
2786
2787         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
2788         as argument and use the new symbol writer.
2789
2790         * location.cs
2791         (SourceFile): Implement the symbol writer's ISourceFile.
2792         (Location.SymbolDocument): Removed.
2793         (Location.SourceFile): New public property.
2794
2795         * symbolwriter.cs: Use the new symbol writer API.
2796
2797 2004-07-30  Raja R Harinath  <rharinath@novell.com>
2798
2799         * Makefile (install-local): Remove.  Functionality moved to
2800         executable.make.
2801
2802 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
2803
2804         * Makefile: Install mcs.exe.config file together with mcs.exe.
2805         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
2806         correct runtime version.
2807         
2808 2004-07-25  Martin Baulig  <martin@ximian.com>
2809
2810         * class.cs
2811         (TypeContainer.RegisterOrder): Removed, this was unused.
2812         (TypeContainer, interface_order): Removed.
2813         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
2814         TypeContainer as argument since we can also be called with a
2815         `PartialContainer' for a partial class/struct/interface.
2816         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
2817         of checking whether we're an `Interface' - we could be a
2818         `PartialContainer'.
2819         (PartialContainer.Register): Override; call
2820         AddClass()/AddStruct()/AddInterface() on our parent.
2821
2822         * cs-parser.jay (interface_member_declaration): Add things to the
2823         `current_container', not the `current_class'.
2824
2825         * rootcontext.cs (RegisterOrder): The overloaded version which
2826         takes an `Interface' was unused, removed.
2827
2828         * typemanager.cs (TypeManager.LookupInterface): Return a
2829         `TypeContainer', not an `Interface'.
2830         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
2831         contain a `PartialContainer' for an interface, so check it's
2832         `Kind' to figure out what it is.
2833
2834 2004-07-25  Martin Baulig  <martin@ximian.com>
2835
2836         * class.cs (Class.DefaultTypeAttributes): New public constant.
2837         (Struct.DefaultTypeAttributes): Likewise.
2838         (Interface.DefaultTypeAttributes): Likewise.
2839         (PartialContainer.TypeAttr): Override this and add the
2840         DefaultTypeAttributes.
2841
2842 2004-07-25  Martin Baulig  <martin@ximian.com>
2843
2844         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
2845         we can just use the `Parent' field instead.
2846
2847 2004-07-25  Martin Baulig  <martin@ximian.com>
2848
2849         * class.cs (TypeContainer.Emit): Renamed to EmitType().
2850
2851 2004-07-25  Martin Baulig  <martin@ximian.com>
2852
2853         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
2854         our parts before defining any methods.
2855         (TypeContainer.VerifyImplements): Make this virtual.
2856         (ClassPart.VerifyImplements): Override and call VerifyImplements()
2857         on our PartialContainer.
2858
2859 2004-07-25  Martin Baulig  <martin@ximian.com>
2860
2861         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
2862
2863         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
2864         argument, we can just use the `Parent' field instead.
2865
2866         * class.cs
2867         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
2868         (MemberBase.DoDefine): Likewise.
2869
2870 2004-07-24  Martin Baulig  <martin@ximian.com>
2871
2872         * decl.cs (MemberCore.Parent): New public field.
2873         (DeclSpace.Parent): Moved to MemberCore.
2874
2875         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
2876         (MemberBase.ctor): Added TypeContainer argument, pass it to our
2877         parent's .ctor.
2878         (FieldBase, Field, Operator): Likewise.
2879         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
2880         (EventField, Event): Likewise.
2881
2882 2004-07-23  Martin Baulig  <martin@ximian.com>
2883
2884         * class.cs (PartialContainer): New public class.
2885         (ClassPart): New public class.
2886         (TypeContainer): Added support for partial classes.
2887         (TypeContainer.GetClassBases): Splitted some of the functionality
2888         out into GetNormalBases() and GetPartialBases().
2889
2890         * cs-tokenizer.cs (Token.PARTIAL): New token.
2891         (Tokenizer.consume_identifier): Added some hacks to recognize
2892         `partial', but only if it's immediately followed by `class',
2893         `struct' or `interface'.
2894
2895         * cs-parser.jay: Added support for partial clases.
2896
2897 2004-07-23  Martin Baulig  <martin@ximian.com>
2898
2899         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
2900         a `DeclSpace' and also made it readonly.
2901         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
2902         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
2903         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
2904
2905         * cs-parser.jay: Pass the `current_class', not the
2906         `current_container' (at the moment, this is still the same thing)
2907         to a new Method, Property, Event, Indexer or Constructor.
2908
2909 2004-07-23  Martin Baulig  <martin@ximian.com>
2910
2911         * cs-parser.jay (CSharpParser): Added a new `current_class' field
2912         and removed the `current_interface' one.
2913         (struct_declaration, class_declaration, interface_declaration):
2914         Set `current_class' to the newly created class/struct/interface;
2915         set their `Bases' and call Register() before parsing their body.
2916
2917 2004-07-23  Martin Baulig  <martin@ximian.com>
2918
2919         * class.cs (Kind): New public enum.
2920         (TypeContainer): Made this class abstract.
2921         (TypeContainer.Kind): New public readonly field.
2922         (TypeContainer.CheckDef): New public method; moved here from
2923         cs-parser.jay.
2924         (TypeContainer.Register): New public abstract method.
2925         (TypeContainer.GetPendingImplementations): New public abstract
2926         method.
2927         (TypeContainer.GetClassBases): Removed the `is_class' and
2928         `is_iface' parameters.
2929         (TypeContainer.DefineNestedTypes): Formerly known as
2930         DoDefineType().
2931         (ClassOrStruct): Made this class abstract.
2932
2933         * tree.cs (RootTypes): New public type. 
2934
2935 2004-07-20  Martin Baulig  <martin@ximian.com>
2936
2937         * tree.cs (Tree.RecordNamespace): Removed.
2938         (Tree.Namespaces): Removed.
2939
2940         * rootcontext.cs (RootContext.IsNamespace): Removed.
2941
2942         * cs-parser.jay (namespace_declaration): Just create a new
2943         NamespaceEntry here.
2944
2945 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
2946
2947         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
2948         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
2949         entry to make sure it runs in the correct runtime version.
2950         
2951 2004-07-18  Martin Baulig  <martin@ximian.com>
2952
2953         * generic.cs (ConstructedType.CheckConstraints): Improved
2954         constraints checking.
2955
2956 2004-07-18  Martin Baulig  <martin@ximian.com>
2957
2958         * expression.cs (Invocation.BetterMethod): Call
2959         TypeManager.TypeToCoreType() on all types and removed my previous
2960         hack; we're already doig the right thing here.
2961
2962 2004-07-17  Martin Baulig  <martin@ximian.com>
2963
2964         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
2965
2966 2004-07-16  Martin Baulig  <martin@ximian.com>
2967
2968         * iterators.cs: Added generics support.
2969
2970 2004-07-16  Martin Baulig  <martin@ximian.com>
2971
2972         * iterators.cs: Rewrote this.  We're now using one single Proxy
2973         class for both the IEnumerable and the IEnumerator interface and
2974         `Iterator' derives from Class so we can use the high-level API.
2975
2976         * class.cs (TypeContainer.AddIterator): New method.
2977         (TypeContainer.DoDefineType): New protected virtual method, which
2978         is called from DefineType().
2979         (TypeContainer.DoDefineMembers): Call DefineType() and
2980         DefineMembers() on all our iterators.
2981         (TypeContainer.Emit): Call Emit() on all our iterators.
2982         (TypeContainer.CloseType): Call CloseType() on all our iterators.
2983
2984         * codegen.cs (EmitContext.CurrentIterator): New public field.
2985
2986 2004-07-15  Martin Baulig  <martin@ximian.com>
2987
2988         * typemanager.cs
2989         (TypeManager.not_supported_exception_type): New type.   
2990
2991 2004-07-14  Martin Baulig  <martin@ximian.com>
2992
2993         * typemanager.cs
2994         (TypeManager.generic_ienumerable_type): New type.
2995         (TypeManager.generic_ienumerator_type): New type.
2996
2997         * rootcontext.cs
2998         (RootContext.interfaces_first_stage): Added
2999         "System.Collections.Generic.IEnumerator`1" and
3000         "System.Collections.Generic.IEnumerable`1".     
3001
3002 2004-07-14  Martin Baulig  <martin@ximian.com>
3003
3004         * iterators.cs: Use real error numbers.
3005
3006 2004-07-14  Martin Baulig  <martin@ximian.com>
3007
3008         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
3009         requires this to be a System.Collection.IEnumerable and not a
3010         class implementing that interface.
3011         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
3012
3013 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
3014
3015         * class.cs: Fixed previous fix, it broke some error tests.
3016
3017 2004-07-12  Martin Baulig  <martin@ximian.com>
3018
3019         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
3020         Fixes #61293.
3021
3022 2004-07-14  Martin Baulig  <martin@ximian.com>
3023
3024         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
3025         an exclamation mark (!) for the generic arity to reflect the
3026         latest spec changes; ie. use "System.Collections.Generic.IList`1".
3027
3028 2004-07-13  Martin Baulig  <martin@ximian.com>
3029
3030         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
3031         specifiers being part of a type argument.
3032
3033 2004-07-13  Martin Baulig  <martin@ximian.com>
3034
3035         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
3036         name for generic types.
3037
3038 2004-07-13  Martin Baulig  <martin@ximian.com>
3039
3040         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
3041         bit to fix #60119.
3042
3043 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
3044
3045         * assign.cs (LocalTemporary): Add new argument: is_address,If
3046         `is_address' is true, then the value that we store is the address
3047         to the real value, and not the value itself.
3048         
3049         * ecore.cs (PropertyExpr): use the new local temporary
3050         stuff to allow us to handle X.Y += z (where X is a struct)
3051
3052 2004-07-08  Martin Baulig  <martin@ximian.com>
3053
3054         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
3055         not always return, just like we're doing in Using.Resolve().
3056
3057 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
3058
3059         * cs-parser.jay (fixed_statement): flag this as Pinned.
3060
3061 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
3062
3063         * typemanager.cs (TypeManager): Removed MakePinned method, this
3064         mechanism is replaced with the .NET 2.x compatible mechanism of
3065         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
3066
3067         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
3068         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
3069         `IsFixed' property which has a different meaning.
3070
3071 2004-07-02  Raja R Harinath  <rharinath@novell.com>
3072
3073         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
3074         visible from inside a nested class, not just the names of the
3075         immediately enclosing class.
3076         Fix for bug #60730.
3077
3078 2004-06-24  Raja R Harinath  <rharinath@novell.com>
3079
3080         * expression.cs (BetterConversion): Remove buggy special-case
3081         handling of "implicit constant expression conversions".  At this
3082         point, we already know that the conversion is possible -- we're
3083         only checking to see which is better.
3084
3085 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3086
3087         * cs-parser.jay: Added error CS0210 test.
3088
3089 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3090
3091         * cs-parser.jay: Added error CS0134 test.
3092
3093 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3094
3095         Fix bug #52507
3096         * cs-parser.jay: Added error CS0145 test.
3097
3098 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3099
3100         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
3101
3102 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
3103         
3104         * expression.cs (StackAlloc.Resolve): The argument may not
3105         be a constant; deal with this case.
3106         
3107 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
3108
3109         * attribute.cs (IndexerName_GetIndexerName): Renamed to
3110         GetIndexerAttributeValue.
3111         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
3112
3113         * class.cs (Indexer.Define): Added error tests for CS0415,
3114         CS0609.
3115
3116 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
3117
3118         * attribute.cs (Attribute.Resolve): Keep field code in sync with
3119         property code.
3120
3121 2004-06-23  Martin Baulig  <martin@ximian.com>
3122
3123         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
3124         neither return nor throw, reset the barrier as well.  Fixes #60457.
3125
3126 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
3127
3128         * class.cs : EventAttributes is now set to None by default.
3129           This fixes bug #60459.
3130
3131 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
3132
3133         Fix bug #60219
3134         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
3135         Don't throw exception but return null (it's sufficient now).
3136
3137 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
3138
3139         * typemanager.cs (GetArgumentTypes): Faster implementation.
3140
3141 2004-06-18  Martin Baulig  <martin@ximian.com>
3142
3143         * attribute.cs (Attribute.Resolve): Check whether we're an
3144         EmptyCast which a Constant child.  Fixes #60333.
3145
3146 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
3147
3148         * statement.cs (EmitCollectionForeach): Account for the fact that
3149         not all valuetypes are in areas which we can take the address of.
3150         For these variables, we store to a temporary variable. Also, make
3151         sure that we dont emit a `callvirt' on a valuetype method.
3152
3153 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3154
3155         * expression.cs (StackAlloc.DoReSolve): Added test for
3156         negative parameter (CS0247).
3157
3158 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3159
3160         Fix bug #59792
3161         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
3162
3163 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
3164
3165         Fix bug #59781
3166         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
3167         ulong.
3168
3169 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
3170
3171         Fix bug #58254 & cs1555.cs, cs1556.cs
3172         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
3173
3174 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
3175
3176         * cs-parser.jay: Added error CS1669 test for indexers.
3177
3178 2004-06-18  Martin Baulig  <martin@ximian.com>
3179
3180         * generics.cs (GenericMethod.ctor): Don't take an Attributes
3181         argument.  Fixes #60441.
3182
3183 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
3184         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
3185         The name needs to have the actual name of the method in order
3186         for other tests (such as the one in OverloadResolve for Invoke
3187         on a delegate) to work. As well, it does not really help
3188         error reporting because the method group had multiple methods.
3189         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
3190         Make profiling work.
3191         
3192 2004-06-13  Martin Baulig  <martin@ximian.com>
3193
3194         * cs-parser.jay: Don't allow generic attributes.
3195
3196 2004-06-13  Martin Baulig  <martin@ximian.com>
3197
3198         * class.cs (MemberBase.DoDefineBase): New protected method.
3199         (MemberBase.DoDefine): Compute the `flags' in the new
3200         DoDefineBase() which must be called first.
3201         (Method.Define): Call DoDefineBase() first so we have the flags
3202         when defining the generic method.
3203
3204         * cs-parser.jay (interface_method_declaration): Support generic methods.
3205
3206 2004-06-13  Martin Baulig  <martin@ximian.com>
3207
3208         * decl.cs (TypeName): Removed.
3209         (MemberName): Removed TypeName and MemberNow; now we just have
3210         MemberName.
3211
3212         * cs-parser.jay: Don't distinguish between type arguments and type
3213         parameters in the grammar and simplified the rules a bit.  The
3214         reduce/reduce conflicts are now gone (except the one we inherited
3215         from mcs).
3216
3217 2004-06-11  Martin Baulig  <martin@ximian.com>
3218
3219         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
3220         call this twice: for params and varargs methods.
3221
3222 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
3223
3224         * class.cs:
3225         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
3226
3227 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
3228
3229         * attribute.cs (Attribute.GetValidTargets): Made public.
3230
3231         * class.cs: 
3232         (AbstractPropertyEventMethod): New class for better code sharing.
3233         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
3234         CS1667 report.
3235         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
3236
3237 2004-06-09  Martin Baulig  <martin@ximian.com>
3238
3239         * cs-parser.jay: Removed a reduce/reduce conflict.
3240
3241 2004-06-03  Martin Baulig  <martin@ximian.com>
3242
3243         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
3244         GetSimpleName() and return a SimpleName.
3245
3246         * ecore.cs (SimpleName.Arguments): New public field.
3247         (SimpleName): Added overloaded ctor which takes an additional
3248         TypeArguments argument.
3249         (SimpleName.SimpleNameResolve): Added support for generic methods.
3250         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
3251         formerly in MemberAccess.DoResolve(), but we also need it in
3252         SimpleNameResolve().
3253
3254         * expression.cs (MemberAccess.DoResolve): Use the new
3255         MethodGroupExpr.ResolveGeneric().       
3256
3257 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3258
3259         * decl.cs: If possible, use lookuptypedirect here. We can only do
3260         this if there is no `.' after the namespace. Avoids using
3261         LookupType, which does lots of slow processing.
3262         (FindNestedType) New method, does what it says :-).
3263         * namespace.cs: use LookupTypeDirect.
3264         * rootcontext.cs: use membercache, if possible.
3265         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
3266
3267 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3268
3269         * expression.cs:
3270         According to the spec, 
3271
3272         In a member access of the form E.I, if E is a single identifier,
3273         and if the meaning of E as a simple-name (§7.5.2) is a constant,
3274         field, property, localvariable, or parameter with the same type as
3275         the meaning of E as a type-name (§3.8), then both possible
3276         meanings of E are permitted.
3277
3278         We did not check that E as a simple-name had the same type as E as
3279         a type name.
3280
3281         This trivial check gives us 5-7% on bootstrap time.
3282
3283 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3284
3285         * expression.cs (Invocation.OverloadResolve): Avoid the
3286         use of hashtables and boxing here by allocating on demand.
3287
3288 2004-05-30  Martin Baulig  <martin@ximian.com>
3289
3290         * rootcontext.cs (RootContext.LookupType): Don't cache things if
3291         we're doing a silent lookup.  Don't try to lookup nested types in
3292         TypeManager.object_type (thanks to Ben Maurer).
3293
3294 2004-05-30  Martin Baulig  <martin@ximian.com>
3295
3296         Committing a patch from Ben Maurer.
3297
3298         * rootcontext.cs (RootContext.LookupType): Cache negative results.
3299
3300 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3301
3302         * convert.cs: add a trivial cache for overload operator resolution.
3303
3304 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
3305
3306         * attribute.cs
3307         (AttributeTester.GetObsoleteAttribute): Returns instance of
3308         ObsoleteAttribute when type is obsolete.
3309
3310         * class.cs
3311         (TypeContainer.VerifyObsoleteAttribute): Override.
3312         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
3313         (MethodCode.VerifyObsoleteAttribute): Override.
3314         (MemberBase.VerifyObsoleteAttribute): Override.
3315
3316         * decl.cs
3317         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
3318         and report proper error.
3319
3320         *delegate.cs
3321         (Delegate.VerifyObsoleteAttribute): Override.
3322
3323         * ecore.cs
3324         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
3325         and report proper error.
3326         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
3327
3328         * enum.cs
3329         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
3330         and enum member.
3331
3332         * expression.cs
3333         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
3334         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
3335         Added test for ObsoleteAttribute.
3336
3337         * statement.cs
3338         (Catch): Derived from Statement.
3339
3340 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3341
3342         * decl.cs: If possible, use lookuptypedirect here. We can only do
3343         this if there is no `.' after the namespace. Avoids using
3344         LookupType, which does lots of slow processing.
3345         (FindNestedType) New method, does what it says :-).
3346         * namespace.cs: use LookupTypeDirect.
3347         * rootcontext.cs: use membercache, if possible.
3348         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
3349
3350 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3351
3352         * expression.cs:
3353         According to the spec, 
3354
3355         In a member access of the form E.I, if E is a single identifier,
3356         and if the meaning of E as a simple-name (§7.5.2) is a constant,
3357         field, property, localvariable, or parameter with the same type as
3358         the meaning of E as a type-name (§3.8), then both possible
3359         meanings of E are permitted.
3360
3361         We did not check that E as a simple-name had the same type as E as
3362         a type name.
3363
3364         This trivial check gives us 5-7% on bootstrap time.
3365
3366 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
3367
3368         Fixed bug #59071 & cs0160.cs
3369         * statement.cs (Try.Resolve): Check here whether order of catch
3370         clauses matches their dependencies.
3371
3372 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
3373
3374         Fixed bug #58624
3375         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
3376         unsafe type.
3377
3378 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3379
3380         * expression.cs (Invocation.OverloadResolve): Avoid the
3381         use of hashtables and boxing here by allocating on demand.
3382
3383 2004-05-30  Martin Baulig  <martin@ximian.com>
3384
3385         * rootcontext.cs (RootContext.LookupType): Don't cache things if
3386         we're doing a silent lookup.  Don't try to lookup nested types in
3387         TypeManager.object_type (thanks to Ben Maurer).
3388
3389 2004-05-30  Martin Baulig  <martin@ximian.com>
3390
3391         Committing a patch from Ben Maurer.
3392
3393         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
3394
3395 2004-05-29  Martin Baulig  <martin@ximian.com>
3396
3397         * class.cs (IMethodData.ShouldIgnore): New method.
3398
3399         * typemanager.cs (TypeManager.MethodFlags): Don't take a
3400         `Location' argument, we don't need it anywhere.  Use
3401         `IMethodData.ShouldIgnore ()' instead of
3402         `MethodData.GetMethodFlags ()'.
3403         (TypeManager.AddMethod): Removed.
3404         (TypeManager.AddMethod2): Renamed to AddMethod.
3405
3406 2004-05-29  Martin Baulig  <martin@ximian.com>
3407
3408         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
3409
3410         * convert.cs (Convert.ImplicitReferenceConversion): If we're
3411         converting from a class type S to an interface type and we already
3412         have an object on the stack, don't box it again.  Fixes #52578.
3413
3414 2004-05-29  Martin Baulig  <martin@ximian.com>
3415
3416         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
3417         Added support for `params' parameters.  Fixes #59267.
3418
3419 2004-05-29  Martin Baulig  <martin@ximian.com>
3420
3421         * literal.cs (NullPointer): Provide a private .ctor which sets
3422         `type' to TypeManager.object_type.  Fixes #59048.
3423
3424 2004-05-29  Martin Baulig  <martin@ximian.com>
3425
3426         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
3427         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
3428
3429         * ecore.cs (EventExpr.instance_expr): Make the field private.
3430
3431 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
3432
3433         Fixed bug #50080 & cs0214-2.cs
3434         * expression.cs (Cast.DoResolve): Check unsafe context here.
3435         
3436         * statement.cs (Resolve.DoResolve): Likewise.
3437
3438 2004-05-26  Martin Baulig  <martin@ximian.com>
3439
3440         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
3441
3442         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
3443         (RootContext.LookupType): Pass down the `silent' flag.
3444
3445 2004-05-25  Martin Baulig  <martin@ximian.com>
3446
3447         * expression.cs
3448         (MethodGroupExpr.IdenticalTypeName): New public property.
3449         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
3450         expression actually refers to a type.
3451
3452 2004-05-25  Martin Baulig  <martin@ximian.com>
3453
3454         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
3455         for #56176 and made it actually work.
3456
3457 2004-05-25  Martin Baulig  <martin@ximian.com>
3458
3459         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
3460         (FieldExpr, PropertyExpr): Override and implement
3461         CacheTemporaries.  Fixes #52279.
3462
3463 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
3464
3465         * location.cs: In the new compiler listing a file twice is a
3466         warning, not an error.
3467
3468 2004-05-24  Martin Baulig  <martin@ximian.com>
3469
3470         * enum.cs (Enum.DefineType): For the `BaseType' to be a
3471         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
3472
3473 2004-05-24  Martin Baulig  <martin@ximian.com>
3474
3475         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
3476         walking the `using' list.  Fixes #53921.
3477
3478 2004-05-24  Martin Baulig  <martin@ximian.com>
3479
3480         * const.cs (Const.LookupConstantValue): Added support for
3481         EmptyCast's; fixes #55251.
3482
3483 2004-05-24  Martin Baulig  <martin@ximian.com>
3484
3485         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
3486         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
3487         which does the CS0135 check.  The reason is that we first need to
3488         check whether the variable actually exists.
3489
3490 2004-05-24  Martin Baulig  <martin@ximian.com>
3491
3492         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
3493         than RootContext.LookupType() to find the explicit interface
3494         type.  Fixes #58584.
3495
3496 2004-05-24  Raja R Harinath  <rharinath@novell.com>
3497
3498         * Makefile: Simplify.  Use executable.make.
3499         * mcs.exe.sources: New file.  List of sources of mcs.exe.
3500
3501 2004-05-24  Anders Carlsson  <andersca@gnome.org>
3502
3503         * decl.cs:
3504         * enum.cs:
3505         Use the invariant culture when doing String.Compare for CLS case
3506         sensitivity.
3507         
3508 2004-05-23  Martin Baulig  <martin@ximian.com>
3509
3510         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
3511         don't have any dots.  Fixes #52622, added cs0246-8.cs.
3512
3513         * namespace.cs (NamespaceEntry.Lookup): Likewise.
3514
3515 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3516
3517         * class.cs (MemberBase.Define): Reuse MemberType member for 
3518         resolved type. Other methods can use it too.
3519
3520 2004-05-23  Martin Baulig  <martin@ximian.com>
3521
3522         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
3523         the variable also exists in the current block (otherwise, we need
3524         to report a CS0103).  Fixes #58670.
3525
3526 2004-05-23  Martin Baulig  <martin@ximian.com>
3527
3528         * flowanalysis.cs (Reachability.Reachable): Compute this
3529         on-the-fly rather than storing it as a field.
3530
3531 2004-05-23  Martin Baulig  <martin@ximian.com>
3532
3533         * flowanalysis.cs (Reachability.And): Manually compute the
3534         resulting `barrier' from the reachability.      
3535        
3536 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
3537
3538         Fix bug #57835
3539         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
3540         instance of ObsoleteAttribute when symbol is obsolete.
3541
3542         * class.cs
3543         (IMethodData): Extended interface for ObsoleteAttribute support.
3544
3545 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3546
3547         * attribute.cs: Fix bug #55970
3548
3549 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
3550
3551         Fix bug #52705
3552         * attribute.cs
3553         (GetObsoleteAttribute): New method. Creates the instance of
3554         ObsoleteAttribute.
3555         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
3556         ObsoleteAttribute when member is obsolete.
3557         (AttributeTester.Report_ObsoleteMessage): Common method for
3558         Obsolete error/warning reporting.
3559
3560         * class.cs
3561         (TypeContainer.base_classs_type): New member for storing parent type.
3562
3563         * decl.cs
3564         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
3565         for this MemberCore.
3566
3567 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3568
3569         * attribute.cs, const.cs: Fix bug #58590
3570
3571 2004-05-21  Martin Baulig  <martin@ximian.com>
3572
3573         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
3574         out parameters if the end of the method is unreachable.  Fixes
3575         #58098. 
3576
3577 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3578
3579         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
3580         Hari was right, why extra method.
3581
3582 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
3583
3584         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
3585
3586 2004-05-20  Martin Baulig  <martin@ximian.com>
3587
3588         * delegate.cs: Convert this file to Unix mode - like the original
3589         version in mcs is.
3590
3591 2004-05-20  Martin Baulig  <martin@ximian.com>
3592
3593         * attribute.cs: Convert this file to Unix mode - like the original
3594         version in mcs is.
3595
3596 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
3597
3598        Fix bug #58688 (MCS does not report error when the same attribute
3599        is assigned twice)
3600
3601        * attribute.cs (Attribute.Emit): Distinction between null and default.
3602
3603 2004-05-19  Raja R Harinath  <rharinath@novell.com>
3604
3605        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
3606        of a top-level attribute without an attribute target.
3607        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
3608        Make non-static.
3609        (Attribute.Conditional_GetConditionName), 
3610        (Attribute.Obsolete_GetObsoleteMessage): Update.
3611        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
3612        part of ScanForIndexerName.
3613        (Attribute.CanIgnoreInvalidAttribute): New function.
3614        (Attribute.ScanForIndexerName): Move to ...
3615        (Attributes.ScanForIndexerName): ... here.
3616        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
3617        (Attributes.Search): New internal variant that can choose not to
3618        complain if types aren't resolved.  The original signature now
3619        complains.
3620        (Attributes.GetClsCompliantAttribute): Use internal variant, with
3621        complaints suppressed.
3622        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
3623        only if it not useful.
3624        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
3625        top-level for attributes that are shared between the assembly
3626        and a top-level class.
3627        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
3628        * class.cs: Update to reflect changes.
3629        (DefineIndexers): Fuse loops.
3630        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
3631        a couple more variants of attribute names.
3632
3633 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
3634
3635         Fix bug #52585 (Implemented explicit attribute declaration)
3636
3637         * attribute.cs:
3638         (Attributable.ValidAttributeTargets): New abstract method. It gets
3639         list of valid attribute targets for explicit target declaration.
3640         (Attribute.Target): It holds target itself.
3641         (AttributeSection): Removed.
3642         (Attribute.CheckTargets): New method. It checks whether attribute
3643         target is valid for the current element.
3644
3645         * class.cs:
3646         (EventProperty): New class. For events that are declared like
3647         property (with add and remove accessors).
3648         (EventField): New class. For events that are declared like field.
3649         class.cs
3650
3651         * cs-parser.jay: Implemented explicit attribute target declaration.
3652
3653         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
3654         Override ValidAttributeTargets.
3655
3656         * parameter.cs:
3657         (ReturnParameter): Class for applying custom attributes on 
3658         the return type.
3659         (ParameterAtribute): New class. Class for applying custom
3660         attributes on the parameter type.
3661
3662 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
3663
3664         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
3665         definitions. 
3666
3667         (Method): Allow UNSAFE here.
3668
3669         * modifiers.cs: Support unsafe reporting.
3670
3671 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
3672
3673         * decl.cs: Fix bug #58478.
3674
3675 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3676
3677         * statement.cs: When checking for unreachable code on an EmptyStatement,
3678         set the location. Fixes bug #58488.
3679
3680 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
3681
3682         * driver.cs: Add -pkg handling.
3683
3684         From Gonzalo: UseShelLExecute=false
3685
3686 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
3687
3688         * attribute.cs:
3689         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
3690         for attribute.
3691         (Attribute.IsClsCompliaceRequired): Moved to base for better
3692         accesibility.
3693         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
3694         when attribute is AttributeUsageAttribute.
3695         (Attribute.GetValidTargets): Simplified.
3696         (Attribute.GetAttributeUsage): New method returns AttributeUsage
3697         attribute for this type.
3698         (Attribute.ApplyAttributes): Method renamed to Emit and make
3699         non-static.
3700         (GlobalAttributeSection): New class for special handling of global
3701         attributes (assembly, module).
3702         (AttributeSection.Emit): New method.
3703
3704         * class.cs: Implemented Attributable abstract methods.
3705         (MethodCore.LabelParameters): Moved to Parameter class.
3706         (Accessor): Is back simple class.
3707         (PropertyMethod): Implemented Attributable abstract class.
3708         (DelegateMethod): Implemented Attributable abstract class.
3709         (Event): New constructor for disctintion between normal Event
3710         and Event with accessors.
3711
3712         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
3713
3714         * codegen.cs, const.cs, decl.cs, delegate.cs:
3715         (CommonAssemblyModulClass): Implemented Attributable abstract class
3716         and simplified.
3717
3718         * enum.cs: Implement IAttributeSupport interface.
3719         (EnumMember): New class for emum members. Implemented Attributable
3720         abstract class
3721
3722         * parameter.cs:
3723         (ParameterBase): Is abstract.
3724         (ReturnParameter): New class for easier [return:] attribute handling.
3725
3726         * typemanager.cs: Removed builder_to_attr.
3727
3728 2004-05-11  Raja R Harinath  <rharinath@novell.com>
3729
3730         Fix bug #57151.
3731         * attribute.cs (Attribute.GetPositionalValue): New function.
3732         * class.cs (TypeContainer.VerifyMembers): New function.
3733         (TypeContainer.Emit): Use it.
3734         (ClassOrStruct): New base class for Class and Struct.
3735         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
3736         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
3737         class.
3738         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
3739         then each non-static field should have a FieldOffset attribute.
3740         Otherwise, none of the fields should have a FieldOffset attribute.
3741         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
3742         and FieldOffset attributes.
3743         * typemanager.cs (TypeManager.struct_layout_attribute_type)
3744         (TypeManager.field_offset_attribute_type): New core types.
3745         (TypeManager.InitCoreTypes): Initialize them.
3746
3747 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
3748
3749         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
3750         Return correct type.
3751         From bug #58270.
3752
3753 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
3754
3755         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
3756         be implicitly converted to ulong.
3757         
3758         * expression.cs: The logic for allowing operator &, | and ^ worked
3759         was wrong, it worked before because we did not report an error in
3760         an else branch.  Fixes 57895.
3761
3762         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
3763         allow volatile fields to be reference types.
3764
3765 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
3766
3767         * driver.cs: Add support for /debug-
3768
3769 2004-05-07  Raja R Harinath  <rharinath@novell.com>
3770
3771         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
3772         Add a 'complain' parameter to silence errors.
3773         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
3774         silently overlooked type-resolutions.
3775         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
3776         to reflect changes.
3777         (Attributes.Search): New function.
3778         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
3779         (Attributes.GetAttributeFullName): Remove hack.
3780         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
3781         Update to reflect changes.
3782         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
3783         Use Attributes.Search instead of nested loops.
3784
3785 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
3786
3787         * decl.cs:
3788         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
3789         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
3790         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
3791
3792         * report.cs: (Report.Warning): Renamed to Warning_T because of
3793         parameter collision.
3794
3795 2004-05-05  Raja R Harinath  <rharinath@novell.com>
3796
3797         * expression.cs (MemberAccess.ResolveMemberAccess):
3798         Exit with non-zero status after Report.Error.
3799         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
3800         Likewise.
3801         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
3802
3803 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3804
3805         * support.cs: Don't hang when the file is empty.
3806
3807 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
3808
3809         * support.cs: In SeekableStreamReader, compute the preamble size of the
3810           underlying stream. Position changes should take into account that initial
3811           count of bytes.
3812
3813 2004-05-03  Todd Berman  <tberman@sevenl.net>
3814
3815         * driver.cs: remove unused GetSysVersion function.
3816
3817 2004-05-03  Todd Berman  <tberman@sevenl.net>
3818
3819         * driver.cs: Remove the hack from saturday, as well as the hack
3820         from jackson (LoadAssemblyFromGac), also adds the CWD to the
3821         link_paths to get that bit proper.
3822
3823 2004-05-01  Todd Berman  <tberman@sevenl.net>
3824
3825         * driver.cs: Try a LoadFrom before a Load, this checks the current
3826         path. This is currently a bug in mono that is be fixed, however, this
3827         provides a workaround for now. This will be removed when the bug
3828         is fixed.
3829
3830 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
3831
3832         * CryptoConvert.cs: Updated to latest version. Fix issue with 
3833         incomplete key pairs (#57941).
3834
3835 2004-05-01  Todd Berman  <tberman@sevenl.net>
3836
3837         * driver.cs: Remove '.' from path_chars, now System.* loads properly
3838         from the GAC
3839
3840 2004-04-30  Jackson Harper  <jackson@ximian.com>
3841
3842         * codegen.cs: Open keys readonly.
3843         
3844 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
3845
3846         * typemanager.cs: don't report cyclic struct layout when a struct
3847         contains 2 or more fields of the same type. Failed for Pango.AttrShape
3848         which has 2 Pango.Rectangle fields.
3849
3850 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3851
3852         * expression.cs: Handle IntPtr comparisons with IL code
3853         rather than a method call.
3854
3855 2004-04-29  Martin Baulig  <martin@ximian.com>
3856
3857         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
3858         the list of PropertyInfo's in class hierarchy and find the
3859         accessor.  Fixes #56013.
3860
3861 2004-04-29  Martin Baulig  <martin@ximian.com>
3862
3863         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
3864
3865 2004-04-29  Martin Baulig  <martin@ximian.com>
3866
3867         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3868
3869         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
3870
3871 2004-04-29  Martin Baulig  <martin@ximian.com>
3872
3873         * class.cs (ConstructorInitializer.Resolve): Check whether the
3874         parent .ctor is accessible.  Fixes #52146.
3875
3876 2004-04-29  Martin Baulig  <martin@ximian.com>
3877
3878         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
3879
3880         * statement.cs (Using.EmitLocalVariableDecls): Use
3881         TypeManager.idisposable_type, not typeof (IDisposable).
3882         (Foreach.EmitCollectionForeach): Added support for valuetypes.
3883
3884 2004-04-29  Martin Baulig  <martin@ximian.com>
3885
3886         * class.cs (Event.Define): Don't emit the field and don't set
3887         RTSpecialName and SpecialName for events on interfaces.  Fixes
3888         #57703. 
3889
3890 2004-04-29  Raja R Harinath  <rharinath@novell.com>
3891
3892         Refactor Attribute.ApplyAttributes.
3893         * attribute.cs (Attributable): New base class for objects that can
3894         have Attributes applied on them.
3895         (Attribute): Make AttributeUsage fields public.
3896         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
3897         (Attribute.IsInternalCall): New property.
3898         (Attribute.UsageAttr): Convert to a public read-only property.
3899         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
3900         (Attribute.ResolveType, Attribute.Resolve)
3901         (Attribute.ScanForIndexerName): Update to reflect changes.
3902         (Attribute.CheckAttributeTarget): Re-format.
3903         (Attribute.ApplyAttributes): Refactor, to various
3904         Attributable.ApplyAttributeBuilder methods.
3905         * decl.cs (MemberCore): Make Attributable.
3906         * class.cs (Accessor): Make Attributable.
3907         (MethodData.ApplyAttributes): Use proper attribute types, not
3908         attribute names.
3909         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
3910         (TypeContainer.ApplyAttributeBuilder)
3911         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
3912         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
3913         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
3914         (Operator.ApplyAttributeBuilder): New factored-out methods.
3915         * const.cs (Const.ApplyAttributeBuilder): Likewise.
3916         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
3917         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
3918         * parameter.cs (ParameterBase): New Attributable base class
3919         that can also represent Return types.
3920         (Parameter): Update to the changes.
3921
3922 2004-04-29  Jackson Harper  <jackson@ximian.com>
3923
3924         * driver.cs: Prefer the corlib system version when looking for
3925         assemblies in the GAC. This is still a hack, but its a better hack
3926         now.
3927         
3928 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
3929
3930         * decl.cs, enum.cs: Improved error 3005 reporting.
3931   
3932         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
3933         (related_symbols): New private member for list of symbols
3934         related to reported error/warning.
3935         
3936         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
3937
3938 2004-04-29  Martin Baulig  <martin@ximian.com>
3939
3940         * ecore.cs (Expression.Constantify): If we're an enum and
3941         TypeManager.TypeToCoreType() doesn't give us another type, use
3942         t.UnderlyingSystemType.  Fixes #56178.  
3943
3944 2004-04-29  Martin Baulig  <martin@ximian.com>
3945
3946         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
3947         interfaces and for each interface, only add members directly
3948         declared in that interface.  Fixes #53255.
3949
3950 2004-04-28  Martin Baulig  <martin@ximian.com>
3951
3952         * expression.cs (ConditionalLogicalOperator): Use a temporary
3953         variable for `left' to avoid that we evaluate it more than once;
3954         bug #52588.
3955
3956 2004-04-28  Martin Baulig  <martin@ximian.com>
3957
3958         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
3959         `void[]' (CS1547).
3960
3961 2004-04-28  Martin Baulig  <martin@ximian.com>
3962
3963         * statement.cs (LocalInfo.Resolve): Check whether the type is not
3964         void (CS1547).
3965
3966         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
3967         whether the type is not void (CS1547).
3968
3969 2004-04-28  Martin Baulig  <martin@ximian.com>
3970
3971         * expression.cs (Unary.DoResolveLValue): Override this and report
3972         CS0131 for anything but Operator.Indirection.
3973
3974 2004-04-28  Martin Baulig  <martin@ximian.com>
3975
3976         Committing a patch from Ben Maurer; see bug #50820.
3977
3978         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3979         check for classes.
3980
3981         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3982         classes.        
3983
3984 2004-04-28  Martin Baulig  <martin@ximian.com>
3985
3986         Committing a patch from Ben Maurer; see bug #50820.
3987
3988         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
3989         check for classes.
3990
3991         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
3992         classes.        
3993
3994 2004-04-28  Martin Baulig  <martin@ximian.com>
3995
3996         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
3997         (Block.AddLabel): Call DoLookupLabel() to only search in the
3998         current block.
3999
4000 2004-04-28  Martin Baulig  <martin@ximian.com>
4001
4002         * cfold.cs (ConstantFold.BinaryFold): Added special support for
4003         comparing StringConstants and NullLiterals in Equality and Inequality.
4004
4005 2004-04-28  Jackson Harper  <jackson@ximian.com>
4006
4007         * driver.cs: Attempt to load referenced assemblies from the
4008         GAC. This is the quick and dirty version of this method that
4009         doesnt take into account versions and just takes the first
4010         canidate found. Will be good enough for now as we will not have more
4011         then one version installed into the GAC until I update this method.
4012
4013 2004-04-28  Martin Baulig  <martin@ximian.com>
4014
4015         * typemanager.cs (TypeManager.CheckStructCycles): New public
4016         static method to check for cycles in the struct layout.
4017
4018         * rootcontext.cs (RootContext.PopulateTypes): Call
4019         TypeManager.CheckStructCycles() for each TypeContainer.
4020         [Note: We only need to visit each type once.]
4021
4022 2004-04-28  Martin Baulig  <martin@ximian.com>
4023
4024         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
4025
4026         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
4027         success and added `out object value'.  Use a `bool resolved' field
4028         to check whether we've already been called rather than
4029         `ConstantValue != null' since this breaks for NullLiterals.
4030
4031 2004-04-28  Raja R Harinath  <rharinath@novell.com>
4032
4033         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
4034         setting of this flag, since the 'set' method may be non-public.
4035
4036 2004-04-28  Raja R Harinath  <rharinath@novell.com>
4037
4038         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
4039         check on current_vector.Block.
4040
4041 2004-04-27  Martin Baulig  <martin@ximian.com>
4042
4043         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
4044         a field initializer.  Fixes #56459.
4045
4046 2004-04-27  Martin Baulig  <martin@ximian.com>
4047
4048         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
4049         we're not attempting to use an indexer.  Fixes #52154.
4050
4051 2004-04-27  Martin Baulig  <martin@ximian.com>
4052
4053         * statement.cs (Return): Don't create a return label if we don't
4054         need it; reverts my change from January 20th.  Thanks to Ben
4055         Maurer for this.
4056
4057 2004-04-27  Martin Baulig  <martin@ximian.com>
4058
4059         According to the spec, `goto' can only leave a nested scope, but
4060         never enter it.
4061
4062         * statement.cs (Block.LookupLabel): Only lookup in the current
4063         block, don't recurse into parent or child blocks.
4064         (Block.AddLabel): Check in parent and child blocks, report
4065         CS0140/CS0158 if we find a duplicate.
4066         (Block): Removed this indexer for label lookups.
4067         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
4068         this already does the error reporting for us.
4069
4070         * flowanalysis.cs
4071         (FlowBranching.UsageVector.Block): New public variable; may be null.
4072         (FlowBranching.CreateSibling): Added `Block' argument.
4073         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
4074         label for the target of a `goto' and check whether we're not
4075         leaving a `finally'.
4076
4077 2004-04-27  Martin Baulig  <martin@ximian.com>
4078
4079         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
4080         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
4081         just for returns).
4082
4083 2004-04-27  Martin Baulig  <martin@ximian.com>
4084
4085         * statement.cs (Block.AddLabel): Also check for implicit blocks
4086         and added a CS0158 check.
4087
4088 2004-04-27  Martin Baulig  <martin@ximian.com>
4089
4090         * flowanalysis.cs (FlowBranchingLoop): New class.
4091         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
4092         UsageVector's instead of an ArrayList.
4093         (FlowBranching.Label): Likewise.
4094         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
4095         (FlowBranching.AddBreakVector): New method.
4096
4097 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
4098
4099         * attribute.cs: Small regression fix: only convert the type if we
4100         the type is different, fixes System.Drawing build.
4101
4102 2004-04-27  Martin Baulig  <martin@ximian.com>
4103
4104         * attribute.cs (Attribute.Resolve): If we have a constant value
4105         for a named field or property, implicity convert it to the correct
4106         type.
4107
4108 2004-04-27  Raja R Harinath  <rharinath@novell.com>
4109
4110         * statement.cs (Block.Block): Implicit blocks share
4111         'child_variable_names' fields with parent blocks.
4112         (Block.AddChildVariableNames): Remove.
4113         (Block.AddVariable): Mark variable as "used by a child block" in
4114         every surrounding block.
4115         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
4116         been used in a child block, complain about violation of "Invariant
4117         meaning in blocks" rule.
4118         * cs-parser.jay (declare_local_variables): Don't use
4119         AddChildVariableNames.
4120         (foreach_statement): Don't create an implicit block: 'foreach'
4121         introduces a scope.
4122
4123 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
4124
4125         * convert.cs (ImplicitNumericConversion): 0 is also positive when
4126         converting from 0L to ulong.  Fixes 57522.
4127
4128 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
4129
4130         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
4131         derived class hides via 'new' keyword field from base class (test-242.cs).
4132         TODO: Handle this in the more general way.
4133         
4134         * class.cs (CheckBase): Ditto.
4135
4136 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
4137
4138         * decl.cs (caching_flags): New member for storing cached values
4139         as bit flags.
4140         (MemberCore.Flags): New enum where bit flags for caching_flags
4141         are defined.
4142         (MemberCore.cls_compliance): Moved to caching_flags.
4143         (DeclSpace.Created): Moved to caching_flags.
4144
4145         * class.cs: Use caching_flags instead of DeclSpace.Created
4146         
4147 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
4148
4149         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
4150         if we are only a derived class, not a nested class.
4151
4152         * typemanager.cs: Same as above, but do this at the MemberLookup
4153         level (used by field and methods, properties are handled in
4154         PropertyExpr).   Allow for the qualified access if we are a nested
4155         method. 
4156
4157 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
4158
4159         * class.cs: Refactoring.
4160         (IMethodData): New inteface; Holds links to parent members
4161         to avoid member duplication (reduced memory allocation).
4162         (Method): Implemented IMethodData interface.
4163         (PropertyBase): New inner classes for get/set methods.
4164         (PropertyBase.PropertyMethod): Implemented IMethodData interface
4165         (Event): New inner classes for add/remove methods.
4166         (Event.DelegateMethod): Implemented IMethodData interface.
4167
4168         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
4169         EmitContext (related to class.cs refactoring).
4170
4171 2004-04-21  Raja R Harinath  <rharinath@novell.com>
4172
4173         * delegate.cs (Delegate.VerifyApplicability): If the number of
4174         arguments are the same as the number of parameters, first try to
4175         verify applicability ignoring  any 'params' modifier on the last
4176         parameter.
4177         Fixes #56442.
4178
4179 2004-04-08  Martin Baulig  <martin@ximian.com>
4180
4181         Merged latest changes into gmcs.  Please keep this comment in
4182         here, it makes it easier for me to see what changed in MCS since
4183         the last time I merged.
4184
4185 2004-04-16  Raja R Harinath  <rharinath@novell.com>
4186
4187         * class.cs (TypeContainer.AddIndexer): Use
4188         'ExplicitInterfaceName' to determine if interface name was
4189         explicitly specified.  'InterfaceType' is not initialized at this time.
4190         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
4191         Indexers array is already in the required order.  Initialize
4192         'IndexerName' only if there are normal indexers.
4193         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
4194         (TypeContainer.Emit): Emit DefaultMember attribute only if
4195         IndexerName is initialized.
4196         Fixes #56300.
4197
4198 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
4199
4200         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
4201         Fixes #57007
4202
4203 2004-04-15  Raja R Harinath  <rharinath@novell.com>
4204
4205         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
4206         attributes.
4207         Fix for #56456.
4208
4209         * attribute.cs (Attribute.Resolve): Check for duplicate named
4210         attributes.
4211         Fix for #56463.
4212
4213 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
4214
4215         * iterators.cs (MarkYield): track whether we are in an exception,
4216         and generate code accordingly.  Use a temporary value to store the
4217         result for our state.
4218
4219         I had ignored a bit the interaction of try/catch with iterators
4220         since their behavior was not entirely obvious, but now it is
4221         possible to verify that our behavior is the same as MS .NET 2.0
4222
4223         Fixes 54814
4224
4225 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
4226
4227         * iterators.cs: Avoid creating temporaries if there is no work to
4228         do. 
4229
4230         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
4231         Enumerations, use TypeManager.EnumToUnderlying and call
4232         recursively. 
4233
4234         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
4235         bug #57013
4236
4237         (This.Emit): Use EmitContext.EmitThis to emit our
4238         instance variable.
4239
4240         (This.EmitAssign): Ditto.
4241
4242         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
4243         codepaths, we will move all the functionality into
4244         Mono.CSharp.This 
4245
4246         (FieldExpr.EmitAssign): Ditto.
4247
4248         This fixes several hidden bugs that I uncovered while doing a code
4249         review of this today.
4250
4251         * codegen.cs (EmitThis): reworked so the semantics are more clear
4252         and also support value types "this" instances.
4253
4254         * iterators.cs: Changed so that for iterators in value types, we
4255         do not pass the value type as a parameter.  
4256
4257         Initialization of the enumerator helpers is now done in the caller
4258         instead of passing the parameters to the constructors and having
4259         the constructor set the fields.
4260
4261         The fields have now `assembly' visibility instead of private.
4262
4263 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
4264
4265         * expression.cs (Argument.Resolve): Check if fields passed as ref
4266         or out are contained in a MarshalByRefObject.
4267
4268         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
4269         another compiler type.
4270
4271 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
4272
4273         * class.cs (Indexer.Define): use the new name checking method.
4274         Also, return false on an error.
4275         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
4276         (is_identifier_[start/part]_character): make static.
4277
4278 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
4279
4280         * expression.cs (Binary.ResolveOperator): Do no append strings
4281         twice: since we can be invoked more than once (array evaluation)
4282         on the same concatenation, take care of this here.  Based on a fix
4283         from Ben (bug #56454)
4284
4285 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
4286
4287         * codegen.cs: Fix another case where CS1548 must be reported (when 
4288         delay-sign isn't specified and no private is available #56564). Fix
4289         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
4290         error when MCS is used on the MS runtime and we need to delay-sign 
4291         (which seems unsupported by AssemblyBuilder - see #56621).
4292
4293 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
4294
4295         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
4296         (TypeManager.ComputeNamespaces): Faster implementation for
4297         Microsoft runtime.
4298
4299         * compiler.csproj: Updated AssemblyName to mcs.
4300
4301 2004-05-11  Jackson Harper  <jackson@ximian.com>
4302
4303         * Makefile: Preserve MONO_PATH
4304         
4305 2004-05-11  Jackson Harper  <jackson@ximian.com>
4306
4307         * Makefile: Use mono and mcs to build gmcs
4308         
4309 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
4310
4311         * codegen.cs: Add patch from Robert Shade
4312         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
4313         sync with mcs.
4314
4315 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
4316
4317         * CryptoConvert.cs: Updated to latest version. Fix issue with 
4318         incomplete key pairs (#57941).
4319
4320 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
4321
4322         * codegen.cs: Fix another case where CS1548 must be reported (when 
4323         delay-sign isn't specified and no private is available #56564). Fix
4324         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
4325         error when MCS is used on the MS runtime and we need to delay-sign 
4326         (which seems unsupported by AssemblyBuilder - see #56621).
4327
4328 2004-04-29  Jackson Harper  <jackson@ximian.com>
4329
4330         * Makefile: Set MONO_PATH to use the bootstrap corlib
4331         * driver.cs: Check the GAC for referenced assemblies.
4332                 
4333 2004-04-29  Martin Baulig  <martin@ximian.com>
4334
4335         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
4336
4337 2004-04-07  Martin Baulig  <martin@ximian.com>
4338
4339         * expression.cs (Binary.ResolveOperator): Added special case for
4340         Equality/Inequality between a type parameter and a null literal.
4341
4342 2004-04-07  Martin Baulig  <martin@ximian.com>
4343
4344         * convert.cs: Check null literal -> type parameter conversions.
4345
4346 2004-04-07  Martin Baulig  <martin@ximian.com>
4347
4348         * generic.cs (ConstructedType.CheckConstraints): Enforce the
4349         `class' and `struct' constraints.
4350
4351 2004-04-07  Martin Baulig  <martin@ximian.com>
4352
4353         * generic.cs (SpecialConstraint): New public enum.
4354         (Constraints.Resolve): Added support for the `class' and `struct'
4355         constraints.
4356
4357         * cs-parser.jay (type_parameter_constraint): Added support for the
4358         `class' and `struct' constraints.
4359
4360 2004-04-07  Martin Baulig  <martin@ximian.com>
4361
4362         * support.cs (GenericConstraints): Replaced `Types' by
4363         `ClassConstraint' and `InterfaceConstraints'; added
4364         `HasClassConstraint'.   
4365
4366 2004-04-07  Martin Baulig  <martin@ximian.com>
4367
4368         * generic.cs
4369         (Constraints.InterfaceConstraints): New public property.
4370         (Constraints.Types): Make this property public
4371         (TypeParameter): Implement IMemberContainer.
4372         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
4373         instead of a TypeBuilder/MethodBuilder; pass the interface
4374         constraints to TypeManager.AddTypeParameter().
4375         (TypeParameter.DefineType): Just take an EmitContext and no
4376         TypeBuilder/MethodBuilder.  Use the new public API.
4377
4378         * typemanager.cs (TypeManager.AddTypeParameter): Added
4379         `TypeExpr[]' argument; add the interfaces to the
4380         `builder_to_ifaces' hash.
4381         (TypeManager.LookupMemberContainer): For
4382         GenericTypeParameterBuilders, get the TypeParameter from the
4383         `builder_to_type_param'.
4384         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
4385         the TypeParameter and call FindMembers on it.
4386
4387 2004-04-07  Martin Baulig  <martin@ximian.com>
4388
4389         * class.cs
4390         (MethodCore.GenericMethod): Moved this field here from Method.
4391         (MethodCore.IsDuplicateImplementation): Take the number of type
4392         parameters into account if we're a generic method.
4393
4394         * expression.cs (Invocation.InferTypeArguments): Don't return true
4395         if `arguments' is null; we still need to check whether we actually
4396         don't need to infer anything in this case.
4397         (MemberAccess): Merged the functionality from GenericMemberAccess
4398         into this class.
4399
4400         * generic.cs (GenericMemberAccess): Removed.
4401
4402 2004-04-05  Martin Baulig  <martin@ximian.com>
4403
4404         * decl.cs (MemberCore): For generic classes, interfaces and
4405         structs, `Name' now includes the number of type parameters
4406         ("Stack!1.Node!1").
4407         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
4408         encode the number of type arguments in the type name.
4409
4410         * expression.cs (Expression.MemberLookup): Removed the
4411         `num_type_args' argument; we now encode the number of type
4412         arguments in the type name.
4413
4414         * ecore.cs (SimpleName): Encode the number of type arguments in
4415         the type name itself.
4416
4417         * generic.cs (ConstructedType): Likewise.
4418
4419         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
4420         `MemberName'; we now include the number of type parameters in the
4421         type name.
4422
4423         * typemanager.cs (TypeManager.CheckGeneric): Removed.
4424         (TypeManager.MemberLookup): Removed the
4425         `num_type_args' argument; we now encode the number of type
4426         arguments in the type name.     
4427
4428 2004-04-03  Martin Baulig  <martin@ximian.com>
4429
4430         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
4431         (MemberCore.MemberName): Moved here from MemberBase.
4432         (DeclSpace.SetParameterInfo): Just take the constraints as an
4433         ArrayList; we already have the type parameters in our
4434         `MemberName'; also do the CS0080 reporting here.
4435
4436         * cs-parser.jay (struct_declaration): Use `member_name' instead of
4437         `IDENTIFIER opt_type_parameter_list'; when constructing our
4438         `MemberName', it'll already include our type parameters.
4439         (class_declaration, interface_declaration): Likewise.
4440         (delegate_declaration): Likewise.
4441         (MakeName): Take a MemberName and return a MemberName.
4442         The following two changes are required to avoid shift/reduce conflicts:
4443         (member_name): Don't include a TypeName anymore; ie. this is now
4444         just 'IDENTIFIER opt_type_parameter_list'.
4445         (property_declaration, event_declaration): Use a
4446         `namespace_or_type_name' instead of a `member_name'.            
4447
4448 2004-04-03  Martin Baulig  <martin@ximian.com>
4449
4450         * decl.cs (MemberName): Renamed to `TypeName' and created a new
4451         `MemberName' class.
4452         (TypeName): Formerly known as MemberName.
4453
4454         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
4455         instead of a `MemberName'.
4456
4457         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
4458         (member_name): New rule; create a MemberName.
4459
4460 2004-04-02  Martin Baulig  <martin@ximian.com>
4461
4462         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
4463         (CS0305 and CS0308).
4464
4465 2004-04-02  Martin Baulig  <martin@ximian.com>
4466
4467         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
4468         support for nested types.
4469
4470 2004-04-02  Martin Baulig  <martin@ximian.com>
4471
4472         * ecore.cs (IAlias): New public interface.
4473         (TypeExpr, TypeExpression): Implement IAlias.
4474         (TypeAliasExpression): New public class.
4475
4476         * namespace.cs (Namespace): Implement IAlias.
4477         (Namespace.Lookup): Return an IAlias instead on an object.
4478         (Namespace.DefineName): Take an IAlias instead of an object.
4479         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
4480         an object.
4481         (NamespaceEntry.UsingAlias): Take a Membername instead of an
4482         Expression.
4483         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
4484         object.
4485         (NamespaceEntry.Lookup): Likewise.
4486
4487         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
4488         instead of a Type.      
4489
4490         * decl.cs (DeclSpace): Implement IAlias.
4491         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
4492
4493         * generic.cs (ConstructedType): Improved error checking.
4494
4495 2004-04-02  Martin Baulig  <martin@ximian.com>
4496
4497         * convert.cs: Added type parameter conversions.
4498
4499         * ecore.cs
4500         (UnboxCast.Emit): Emit an `unbox.any' for type params.
4501         (ClassCast.Emit): If the source type is a type parameter, box it.
4502         If the target type is a type parameter, emit an `unbox.any'
4503         instead of a `classcast'.1      
4504
4505 2004-04-01  Martin Baulig  <martin@ximian.com>
4506
4507         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
4508
4509 2004-04-01  Martin Baulig  <martin@ximian.com>
4510
4511         * generic.cs (ConstructedType.CheckConstraints): Use
4512         Convert.ImplicitStandardConversionExists(); user-defined implicit
4513         conversions are not allowed according to the spec.
4514
4515 2004-03-30  Martin Baulig  <martin@ximian.com>
4516
4517         * expression.cs (New): Added support for type parameters.
4518
4519         * typemanager.cs
4520         (TypeManager.activator_type): New public static field.
4521         (TypeManager.activator_create_instance): Likewise.
4522
4523 2004-03-30  Martin Baulig  <martin@ximian.com>
4524
4525         * typemanager.cs (TypeManager.HasConstructorConstraint): New
4526         public method.
4527
4528 2004-03-30  Martin Baulig  <martin@ximian.com>
4529
4530         * generic.cs (ConstructedType.CheckConstraints): Actually follow
4531         the spec here: the argument type must be convertible to the
4532         constraints.
4533
4534 2004-03-30  Martin Baulig  <martin@ximian.com>
4535
4536         * generic.cs
4537         (TypeParameter.Define, TypeParameter.DefineMethod): Call
4538         TypeManager.AddTypeParameter().
4539         (ConstructedType.CheckConstraints): Re-enable this and actually
4540         check whether we have a constructor constraint.
4541
4542         * typemanager.cs
4543         (TypeManager.builder_to_type_param): New static field.
4544         (TypeManager.AddTypeParameter): New static method.
4545         (TypeManager.LookupTypeParameter): New public method.
4546
4547 2004-03-30  Martin Baulig  <martin@ximian.com>
4548
4549         * generic.cs (TypeParameter.DefineType): Return a boolean and use
4550         the new API to actually define the constructor constraint.
4551
4552         * typemanager.cs
4553         (TypeManager.new_constraint_attr_type): New static field.
4554         (TypeManager.InitCoreTypes): Initialize it.
4555
4556 2004-03-30  Martin Baulig  <martin@ximian.com>
4557
4558         * generic.cs (Constraints): Completed error checking, use correct
4559         error numbers.
4560
4561 2004-03-29  Martin Baulig  <martin@ximian.com>
4562
4563         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
4564
4565         * expression.cs (Invocation.InferTypeArguments): Added overloaded
4566         public version which takes a `ParameterData pd' instead of an
4567         `ArrayList args'.
4568
4569 2004-03-29  Martin Baulig  <martin@ximian.com>
4570
4571         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
4572         not a MethodInfo.       
4573
4574 2004-03-29  Martin Baulig  <martin@ximian.com>
4575
4576         * expression.cs (Argument.ResolveMethodGroup): If we're a
4577         ConstructedType, call GetMemberAccess() on it.  
4578
4579 2004-03-29  Martin Baulig  <martin@ximian.com>
4580
4581         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
4582         (MethodCore.CheckGenericOverride): When overriding a generic
4583         method, check whether the constraints match.
4584
4585         * support.cs (GenericConstraints): New public interface.
4586         (ParameterData.GenericConstraints): New public method.
4587
4588         * parameter.cs (Parameter.Resolve): Check whether we're a generic
4589         method parameter and compute our constraints if appropriate.
4590         (Parameter.GenericConstraints): New public property.
4591
4592         * generic.cs (Constraints): Implement GenericConstraints.
4593
4594 2004-03-29  Martin Baulig  <martin@ximian.com>
4595
4596         * decl.cs (MemberCache.FindMemberToOverride): Use
4597         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
4598
4599 2004-03-29  Martin Baulig  <martin@ximian.com>
4600
4601         * generic.cs (GenericMethod.Define): Resolve our type parameters.
4602
4603 2004-03-29  Martin Baulig  <martin@ximian.com>
4604
4605         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
4606         not allowed on non-generic declarations").
4607
4608 2004-03-29  Martin Baulig  <martin@ximian.com>
4609
4610         * expression.cs (Invocation.InferTypeArguments): Added overloaded
4611         public version of this method.
4612
4613         * class.cs (MethodCore.IsDuplicateImplementation): Use
4614         Invocation.InferTypeArguments() to check this.
4615
4616 2004-03-29  Martin Baulig  <martin@ximian.com>
4617
4618         * convert.cs: Use TypeManager.IsDelegateType() instead of
4619         comparing types correctly.
4620
4621 2004-03-29  Martin Baulig  <martin@ximian.com>
4622
4623         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
4624         types directly to make it work for generic instances.
4625
4626         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
4627
4628 2004-03-29  Martin Baulig  <martin@ximian.com>
4629
4630         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
4631         support for arrays.     
4632
4633 2004-03-24  Martin Baulig  <martin@ximian.com>
4634
4635         * decl.cs (DeclSpace.FindType): Also use
4636         TypeManager.CheckGeneric() for types from the using clauses.
4637
4638 2004-03-23  Martin Baulig  <martin@ximian.com>
4639
4640         * expression.cs (Invocation.OverloadResolve): Added `bool
4641         may_fail' argument and use it instead of the Location.IsNull() hack.
4642
4643 2004-03-23  Martin Baulig  <martin@ximian.com>
4644
4645         * expression.cs (Invocation.InferType): Use correct type inference
4646         rules here.     
4647
4648 2004-03-23  Martin Baulig  <martin@ximian.com>
4649
4650         * ecore.cs (MethodGroupExpr.Name): Use
4651         TypeManager.CSharpSignature() instead of just the name.
4652
4653         * expression.cs (Invocation.OverloadResolve): Provide better error
4654         reporting.
4655         (Invocation.DoResolve): OverloadResolve() never returns null
4656         without reporting an error, so removed the error -6 reporting here.
4657
4658 2004-03-23  Martin Baulig  <martin@ximian.com>
4659
4660         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
4661         generic methods.
4662
4663         * cs-parser.jay (delegate_declaration): Support generic delegates.
4664
4665         * delegate.cs: Support generic delegates.
4666
4667 2004-03-22  Martin Baulig  <martin@ximian.com>
4668
4669         * expression.cs (Invocation.InferParamsTypeArguments): New static
4670         method; does type inference for params arguments.
4671
4672 2004-03-21  Martin Baulig  <martin@ximian.com>
4673
4674         * typemanager.cs (TypeManager.IsGenericMethod): New public static
4675         method; checks whether a method is a generic method.    
4676
4677         * expression.cs (Invocation.InferTypeArguments): New static method;
4678         infer type arguments for generic method invocation.
4679
4680         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
4681         property; we set this to true if we're resolving a generic method
4682         invocation and the user specified type arguments, ie. we're not
4683         doing type inference.
4684
4685 2004-03-20  Martin Baulig  <martin@ximian.com>
4686
4687         * class.cs (MethodData.DeclaringType): New public property.
4688         (MethodData.Define): Set DeclaringType here.
4689         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
4690         instead of OperatorMethodBuilder.DeclaringType.
4691
4692 2004-03-20  Martin Baulig  <martin@ximian.com>
4693
4694         * cs-tokenizer.cs (xtoken): Return a special
4695         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
4696
4697         * cs-parser.jay (default_value_expression): Switch to the new
4698         syntax (14.5.13).
4699
4700 2004-03-19  Martin Baulig  <martin@ximian.com>
4701
4702         * decl.cs (MemberName): New class.  We use this to "construct"
4703         namespace_or_type_name's.
4704
4705         * generics.cs (TypeArguments.GetDeclarations): New public method;
4706         returns the type arguments as a string[] and reports a CS0081 if
4707         one of them is not an identifier.
4708
4709         * class.cs (MemberBase): The .ctor now takes the name as a
4710         MemberName instead of a string.
4711         (MemberBase.ExplicitInterfaceName): Changed type from string to
4712         Expression.
4713         (MemberBase.DoDefine): If we're an explicit implementation, the
4714         InterfaceType may be a generic instance.
4715
4716         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
4717         (namespace_name): Call MemberName.GetName () to transform the
4718         MemberName into a string and ensure we don't have any type
4719         arguments.
4720         (type_name): Call MemberName.GetTypeExpression() to transfrom the
4721         MemberName into an expression.
4722         (method_header): Use namespace_or_type_name instead of member_name.     
4723
4724 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
4725
4726         * rootcontext.cs: Add new types to the boot resolution.
4727
4728         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
4729         MulticastDelegate is not allowed.
4730
4731         * typemanager.cs: Add new types to lookup: System.TypedReference
4732         and ArgIterator.
4733
4734         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
4735         check for TypedReference or ArgIterator, they are not allowed. 
4736
4737         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
4738         makes us properly catch 1510 in some conditions (see bug 56016 for
4739         details). 
4740
4741 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
4742
4743         * CryptoConvert.cs: update from corlib version
4744         with endian fixes.
4745
4746 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
4747
4748         * class.cs (Indexer.Define): Check indexername declaration
4749
4750 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
4751
4752         * attribute.cs (IsClsCompliant): Fixed problem with handling
4753         all three states (compliant, not-compliant, undetected).
4754
4755 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
4756
4757         * attribute.cs (Attribute): Location is now public.
4758         (Resolve): Store resolved arguments (pos_values) in attribute class.
4759         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
4760         (GetClsCompliantAttributeValue): New method that gets
4761         CLSCompliantAttribute value.
4762         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
4763         if exists else null.
4764         (AttributeTester): New class for CLS-Compliant verification routines.
4765
4766         * class.cs (Emit): Add CLS-Compliant verification.
4767         (Method.GetSignatureForError): Implemented.
4768         (Constructor.GetSignatureForError): Implemented
4769         (Constructor.HasCompliantArgs): Returns if constructor has
4770         CLS-Compliant arguments.
4771         (Constructor.Emit): Override.
4772         (Construcor.IsIdentifierClsCompliant): New method; For constructors
4773         is needed to test only parameters.
4774         (FieldBase.GetSignatureForError): Implemented.
4775         (TypeContainer): New member for storing base interfaces.
4776         (TypeContainer.FindMembers): Search in base interfaces too.
4777
4778         * codegen.cs (GetClsComplianceAttribute): New method that gets
4779         assembly or module CLSCompliantAttribute value.
4780         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
4781         for assembly.
4782         (ModuleClass.Emit): Add error 3012 test.
4783
4784         * const.cs (Emit): Override and call base for CLS-Compliant tests.
4785
4786         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
4787         state for all decl types.
4788         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
4789         if CLS-Compliant tests are required.
4790         (IsClsCompliaceRequired): New method. Analyze whether code
4791         must be CLS-Compliant.
4792         (IsExposedFromAssembly): New method. Returns true when MemberCore
4793         is exposed from assembly.
4794         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
4795         value or gets cached value.
4796         (HasClsCompliantAttribute): New method. Returns true if MemberCore
4797         is explicitly marked with CLSCompliantAttribute.
4798         (IsIdentifierClsCompliant): New abstract method. This method is
4799         used to testing error 3005.
4800         (IsIdentifierAndParamClsCompliant): New method. Common helper method
4801         for identifier and parameters CLS-Compliant testing.
4802         (VerifyClsCompliance): New method. The main virtual method for
4803         CLS-Compliant verifications.
4804         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
4805         null. I don't know why is null (too many public members !).
4806         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
4807         and get value of first CLSCompliantAttribute that found.
4808
4809         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
4810         (VerifyClsCompliance): Override and add extra tests.
4811
4812         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
4813         clscheck- disable CLS-Compliant verification event if assembly is has
4814         CLSCompliantAttribute(true).
4815
4816         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
4817         ApllyAttribute is now called in emit section as in the other cases.
4818         Possible future Emit integration.
4819         (IsIdentifierClsCompliant): New override.
4820         (VerifyClsCompliance): New override.
4821         (GetEnumeratorName): Returns full enum name.
4822
4823         * parameter.cs (GetSignatureForError): Implemented.
4824
4825         * report.cs (WarningData): New struct for Warning message information.
4826         (LocationOfPreviousError): New method.
4827         (Warning): New method. Reports warning based on the warning table.
4828         (Error_T): New method. Reports error based on the error table.
4829
4830         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
4831         verifications are done here.
4832
4833         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
4834
4835         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
4836         CLSCompliantAttribute.
4837         (all_imported_types): New member holds all imported types from other
4838         assemblies.
4839         (LoadAllImportedTypes): New method fills static table with exported types
4840         from all referenced assemblies.
4841         (Modules): New property returns all assembly modules.
4842
4843 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
4844
4845         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
4846         throwing a parser error.
4847
4848         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
4849         which removes the hardcoded get_/set_ prefixes for properties, as
4850         IL allows for the properties to be named something else.  
4851
4852         Bug #56013
4853
4854         * expression.cs: Do not override operand before we know if it is
4855         non-null.  Fix 56207
4856
4857 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4858
4859         * typemanager.cs: support for pinned variables.
4860
4861 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4862
4863         * decl.cs, typemanager.cs: Avoid using an arraylist
4864         as a buffer if there is only one result set.
4865
4866 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4867
4868         * expression.cs: Make sure you cant call a static method
4869         with an instance expression, bug #56174.
4870
4871 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
4872
4873         * class.cs (IsDuplicateImplementation): Improve error reporting to
4874         flag 663 (method only differs in parameter modifier).
4875
4876         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
4877         in preprocessor directives.
4878
4879         * location.cs (LookupFile): Allow for the empty path.
4880
4881         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
4882         better approach for some of that patch, but its failing with the
4883         CharSet enumeration.  For now try/catch will do.
4884
4885         * typemanager.cs: Do not crash if a struct does not have fields.
4886         Fixes 56150.
4887
4888 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4889
4890         * expression.cs: cs0213, cant fix a fixed expression.
4891         fixes 50231.
4892
4893 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4894
4895         * cs-parser.jay: detect invalid embeded statements gracefully.
4896         bug #51113.
4897
4898 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4899
4900         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
4901         As a regex:
4902         s/
4903         the invocation type may not be a subclass of the tye of the item/
4904         The type of the item must be a subclass of the invocation item.
4905         /g
4906
4907         Fixes bug #50820.
4908
4909 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
4910
4911         * attribute.cs: Added methods to get a string and a bool from an
4912         attribute. Required to information from AssemblyKeyFileAttribute,
4913         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
4914         * codegen.cs: Modified AssemblyName creation to include support for
4915         strongnames. Catch additional exceptions to report them as CS1548.
4916         * compiler.csproj: Updated include CryptoConvert.cs.
4917         * compiler.csproj.user: Removed file - user specific configuration.
4918         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
4919         Mono.Security assembly. The original class is maintained and tested in
4920         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
4921         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
4922         like CSC 8.0 (C# v2) supports.
4923         * Makefile: Added CryptoConvert.cs to mcs sources.
4924         * rootcontext.cs: Added new options for strongnames.
4925
4926 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
4927
4928         * driver.cs: For --expect-error, report error code `2'
4929         if the program compiled with no errors, error code `1' if
4930         it compiled with an error other than the one expected.
4931
4932 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
4933
4934         * compiler.csproj: Updated for Visual Studio .NET 2003.
4935         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
4936         * compiler.sln: Updated for Visual Studio .NET 2003.
4937
4938 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
4939
4940         * expression.cs: Fix bug #47234. We basically need to apply the
4941         rule that we prefer the conversion of null to a reference type
4942         when faced with a conversion to 'object' (csc behaviour).
4943
4944 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4945
4946         * statement.cs: Shorter form for foreach, eliminates
4947         a local variable. r=Martin.
4948
4949 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4950
4951         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
4952         checks if we can use brtrue/brfalse to test for 0.
4953         * expression.cs: use the above in the test for using brtrue/brfalse.
4954         cleanup code a bit.
4955
4956 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4957
4958         * expression.cs: Rewrite string concat stuff. Benefits:
4959
4960         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
4961         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
4962         rather than a concat chain.
4963
4964         * typemanager.cs: Add lookups for more concat overloads.
4965
4966 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4967
4968         * expression.cs: Emit shorter il code for array init.
4969
4970         newarr
4971         dup
4972         // set 1
4973
4974         // set 2
4975
4976         newarr
4977         stloc.x
4978
4979         ldloc.x
4980         // set 1
4981
4982         ldloc.x
4983         // set 2
4984
4985 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
4986
4987         * statement.cs: Before, two switch blocks would be merged if the
4988         total size of the blocks (end_item - begin_item + 1) was less than
4989         two times the combined sizes of the blocks.
4990
4991         Now, it will only merge if after the merge at least half of the
4992         slots are filled.
4993
4994         fixes 55885.
4995
4996 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
4997
4998         * class.cs : csc build fix for GetMethods(). See bug #52503.
4999
5000 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
5001
5002         * expression.cs: Make sure fp comparisons work with NaN.
5003         This fixes bug #54303. Mig approved this patch a long
5004         time ago, but we were not able to test b/c the runtime
5005         had a related bug.
5006
5007 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
5008
5009         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
5010
5011 2004-03-19  Martin Baulig  <martin@ximian.com>
5012
5013         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
5014         two overloads may unify for some type parameter substitutions and
5015         report a CS0408 if appropriate.
5016
5017 2004-03-19  Martin Baulig  <martin@ximian.com>
5018
5019         * class.cs (MemberCore.IsDuplicateImplementation): Report the
5020         error here and not in our caller.
5021
5022 2004-03-19  Martin Baulig  <martin@ximian.com>
5023
5024         * interface.cs: Completely killed this file.
5025         (Interface): We're now a TypeContainer and live in class.cs.
5026
5027         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
5028         argument; we're now also called for interfaces.
5029         (TypeContainer.DefineMembers): Allow this method being called
5030         multiple times.
5031         (TypeContainer.GetMethods): New public method; formerly known as
5032         Interface.GetMethod().  This is used by PendingImplementation.
5033         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
5034         it's now private and non-static.
5035         (Interface): Moved this here; it's now implemented similar to
5036         Class and Struct.
5037         (Method, Property, Event, Indexer): Added `bool is_interface'
5038         argument to their .ctor's.
5039         (MemberBase.IsInterface): New public field.
5040
5041         * cs-parser.jay: Create normal Method, Property, Event, Indexer
5042         instances instead of InterfaceMethod, InterfaceProperty, etc.
5043         (opt_interface_base): Removed; we now use `opt_class_base' instead.
5044         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
5045
5046 2004-03-19  Martin Baulig  <martin@ximian.com>
5047
5048         * class.cs (MethodCore.IsDuplicateImplementation): New private
5049         method which does the CS0111 checking.
5050         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
5051         Use IsDuplicateImplementation().
5052
5053 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
5054
5055         * decl.cs (FindMemberToOverride): New method to find the correct
5056         method or property to override in the base class.
5057         * class.cs
5058             - Make Method/Property use the above method to find the
5059               version in the base class.
5060             - Remove the InheritableMemberSignatureCompare as it is now
5061               dead code.
5062
5063         This patch makes large code bases much faster to compile, as it is
5064         O(n) rather than O(n^2) to do this validation.
5065
5066         Also, it fixes bug 52458 which is that nested classes are not
5067         taken into account when finding the base class member.
5068
5069         Reviewed/Approved by Martin.
5070
5071 2004-03-17  Martin Baulig  <martin@ximian.com>
5072
5073         * expression.cs (MemberAccess.DoResolve): Take the parent's number
5074         of type arguments into account; use the `real_num_type_args'
5075         approach like in DoResolveAsTypeStep().
5076
5077         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
5078         nested types.
5079
5080 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
5081
5082         * interface.cs: In all interface classes removed redundant
5083         member initialization.
5084
5085 2004-03-16  Martin Baulig  <martin@ximian.com>
5086
5087         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
5088
5089 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
5090
5091         * decl.cs (DefineTypeAndParents): New helper method to define a
5092         type's containers before the type itself is defined;  This is a
5093         bug exposed by the recent changes to Windows.Forms when an
5094         implemented interface was defined inside a class that had not been
5095         built yet.   
5096
5097         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
5098
5099         (Check): Loop correctly to report errors modifiers
5100         (UNSAFE was not in the loop, since it was the same as TOP).
5101
5102         * interface.cs: Every interface member now takes a ModFlags,
5103         instead of a "is_new" bool, which we set on the base MemberCore. 
5104
5105         Every place where we called "UnsafeOk" in the interface, now we
5106         call the proper member (InterfaceMethod.UnsafeOK) instead to get
5107         the unsafe settings from the member declaration instead of the
5108         container interface. 
5109
5110         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
5111
5112         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
5113         `set_indexer_name' to the pending bits (one per type).
5114
5115         We fixed a bug today that was picking the wrong method to
5116         override, since for properties the existing InterfaceMethod code
5117         basically ignored the method name.  Now we make sure that the
5118         method name is one of the valid indexer names.
5119
5120 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
5121  
5122         * support.cs (SeekableStreamReader): Keep track of stream byte
5123         positions and don't mix them with character offsets to the buffer.
5124
5125         Patch from Gustavo Giráldez
5126
5127 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
5128
5129         * interface.cs (InterfaceSetGetBase): Removed double member
5130         initialization, base class does it as well.
5131
5132 2004-03-13  Martin Baulig  <martin@ximian.com>
5133
5134         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
5135         when compiling corlib.
5136
5137 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
5138
5139         * convert.cs (ExplicitConversion): We were reporting an error on
5140         certain conversions (object_type source to a value type, when the
5141         expression was `null') before we had a chance to pass it through
5142         the user defined conversions.
5143
5144         * driver.cs: Replace / and \ in resource specifications to dots.
5145         Fixes 50752
5146
5147         * class.cs: Add check for duplicate operators.  Fixes 52477
5148
5149 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
5150
5151         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
5152         that are in the middle of the statements, not only at the end.
5153         Fixes #54987
5154
5155         * class.cs (TypeContainer.AddField): No longer set the
5156         `HaveStaticConstructor' flag, now we call it
5157         `UserDefineStaticConstructor' to diferentiate the slightly
5158         semantic difference.
5159
5160         The situation is that we were not adding BeforeFieldInit (from
5161         Modifiers.TypeAttr) to classes that could have it.
5162         BeforeFieldInit should be set to classes that have no static
5163         constructor. 
5164
5165         See:
5166
5167         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
5168
5169         And most importantly Zoltan's comment:
5170
5171         http://bugzilla.ximian.com/show_bug.cgi?id=44229
5172
5173         "I think beforefieldinit means 'it's ok to initialize the type sometime 
5174          before its static fields are used', i.e. initialization does not need
5175          to be triggered by the first access to the type. Setting this flag
5176          helps the JIT to compile better code, since it can run the static
5177          constructor at JIT time, and does not need to generate code to call it
5178          (possibly lots of times) at runtime. Unfortunately, mcs does not set
5179          this flag for lots of classes like String. 
5180          
5181          csc sets this flag if the type does not have an explicit static 
5182          constructor. The reasoning seems to be that if there are only static
5183          initalizers for a type, and no static constructor, then the programmer
5184          does not care when this initialization happens, so beforefieldinit
5185          can be used.
5186          
5187          This bug prevents the AOT compiler from being usable, since it 
5188          generates so many calls to mono_runtime_class_init that the AOT code
5189          is much slower than the JITted code. The JITted code is faster, 
5190          because it does not generate these calls if the vtable is type is
5191          already initialized, which is true in the majority of cases. But the
5192          AOT compiler can't do this."
5193
5194 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
5195
5196         * class.cs (MethodData.Emit): Refactor the code so symbolic
5197         information is generated for destructors;  For some reasons we
5198         were taking a code path that did not generate symbolic information
5199         before. 
5200
5201 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
5202
5203         * class.cs: Create a Constructor.CheckBase method that
5204         takes care of all validation type code. The method
5205         contains some code that was moved from Define.
5206
5207         It also includes new code that checks for duplicate ctors.
5208         This fixes bug #55148.
5209
5210 2004-03-09  Joshua Tauberer <tauberer@for.net>
5211
5212         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
5213         a { ... }-style array creation invokes EmitStaticInitializers
5214         which is not good for reference-type arrays.  String, decimal
5215         and now null constants (NullCast) are not counted toward
5216         static initializers.
5217
5218 2004-03-05  Martin Baulig  <martin@ximian.com>
5219
5220         * location.cs (SourceFile.HasLineDirective): New public field;
5221         specifies whether the file contains or is referenced by a "#line"
5222         directive.
5223         (Location.DefineSymbolDocuments): Ignore source files which
5224         either contain or are referenced by a "#line" directive.        
5225
5226 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
5227
5228         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
5229         direct access to our parent, so check the method inline there.
5230
5231 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
5232
5233         * expression.cs (Invocation.EmitCall): Miguel's last commit
5234         caused a regression. If you had:
5235
5236             T t = null;
5237             t.Foo ();
5238
5239         In Foo the implict this would be null.
5240
5241 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
5242
5243         * expression.cs (Invocation.EmitCall): If the method is not
5244         virtual, do not emit a CallVirt to it, use Call.
5245
5246         * typemanager.cs (GetFullNameSignature): Improve the method to
5247         cope with ".ctor" and replace it with the type name.
5248
5249         * class.cs (ConstructorInitializer.Resolve): Now the method takes
5250         as an argument the ConstructorBuilder where it is being defined,
5251         to catch the recursive constructor invocations.
5252
5253 2004-03-16  Martin Baulig  <martin@ximian.com>
5254
5255         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
5256         ConstructedType, call ResolveType() on it to get the type rather
5257         than just using `expr.Type'.
5258
5259 2004-03-16  Martin Baulig  <martin@ximian.com>
5260
5261         * generics.cs (ConstructedType.GetMemberAccess): Take the
5262         EmitContext instead on the TypeExpr and use
5263         ec.TypeContainer.CurrentType/ec.ContainerType.
5264
5265 2004-03-16  Martin Baulig  <martin@ximian.com>
5266
5267         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
5268         parameters before aliases.
5269
5270 2004-03-16  Martin Baulig  <martin@ximian.com>
5271
5272         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
5273         New oublic function; checks whether two generic instances may become
5274         equal under some instantiations (26.3.1).
5275
5276         * class.cs (TypeContainer.Define): Call
5277         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
5278         error.
5279
5280 2004-03-16  Martin Baulig  <martin@ximian.com>
5281
5282         * class.cs (TypeContainer.GetClassBases): Moved
5283         Error_TypeParameterAsBase() here and also check whether the base
5284         class is not an attribute.
5285
5286 2004-03-16  Martin Baulig  <martin@ximian.com>
5287
5288         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
5289
5290 2004-03-16  Martin Baulig  <martin@ximian.com>
5291
5292         * class.cs (Error_TypeParameterAsBase): Use correct error number
5293         here (CS0689).  
5294
5295 2004-03-16  Martin Baulig  <martin@ximian.com>
5296
5297         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
5298         for generics.
5299
5300         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
5301         error reporting.
5302
5303 2004-03-15  Martin Baulig  <martin@ximian.com>
5304
5305         * typemanager.cs (TypeManager.GetFullName): New public method.
5306         (TypeManager.MemberLookup): Added `int_num_type_arguments'
5307         argument; only return members with the correct number of type
5308         arguments.
5309         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
5310         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
5311         whether the number of type arguments matches.
5312
5313         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
5314         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
5315
5316         * expression.cs (MemberAccess): Added public `NumTypeArguments'
5317         field; it's set by the protected .ctor when we're actually a
5318         GenericMemberAccess.
5319         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
5320         arguments and pass it to MemberLookupFinal ().
5321
5322         * ecore.cs (Expression.MemberLookup): Added `int
5323         num_type_arguments' argument; only return members with the correct
5324         number of type arguments.
5325         (Expression.MemberLookupFailed): Check whether the MemberLookup
5326         failed because we did not have the correct number of type
5327         arguments; report CS0305 in this case.
5328
5329         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
5330         `e.ResolveAsTypeTerminal()' already did so.
5331
5332 2004-03-15  Martin Baulig  <martin@ximian.com>
5333
5334         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
5335         we're a ConstructedType; in this case, the caller must report an
5336         error (for instance CS0131).
5337
5338         * generic.cs (TypeArguments): Added Location argument to the .ctor.
5339         (TypeArguments.Resolve): Actually report errors here.
5340
5341 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
5342
5343         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
5344         `set_indexer_name' to the pending bits (one per type).
5345
5346         We fixed a bug today that was picking the wrong method to
5347         override, since for properties the existing InterfaceMethod code
5348         basically ignored the method name.  Now we make sure that the
5349         method name is one of the valid indexer names.
5350
5351 2004-03-15  Martin Baulig  <martin@ximian.com>
5352
5353         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
5354         for generic instances.
5355
5356 2004-03-13  Martin Baulig  <martin@ximian.com>
5357
5358         * class.cs (TypeContainer.DefineType): Call
5359         TypeManager.AddUserType() immediately after creating the
5360         TypeBuilder; pass all type parameters when creating the
5361         CurrentType.
5362
5363         * decl.cs (DeclSpace.FindNestedType): New public method.
5364         (DeclSpace.FindType): Added `int num_type_args' argument; only
5365         return types with the correct number of type parameters.
5366         (DeclSpace.CountTypeParams): New public property.
5367
5368         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
5369         the number of type parameters; defaults to zero.
5370
5371         * generic.cs (TypeArguments.Count): New public property.
5372         (ConstructedType.DoResolveAsTypeStep): First call
5373         ds.FindNestedType() to find out whether we're nested in the
5374         current generic type; in this case, we inherit all type parameters
5375         from the current class.
5376
5377         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
5378         num_type_args' argument.
5379         (RootContext.LookupType): Added overloaded version which takes the
5380         number of type arguments; only return types with the correct
5381         number of type arguments.
5382
5383         * typemanager.cs (TypeManager.CheckGeneric): New public function;
5384         checks whether `Type t' has `int num_type_args'.
5385
5386 2004-03-13  Martin Baulig  <martin@ximian.com>
5387
5388         * generic.cs (GenericMethod.DefineType): New method; calls
5389         DefineType() on all the type parameters.
5390
5391         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
5392         (MethodData.Define): If we're a generic method, call
5393         GenericMethod.DefineType() to define the type parameters.       
5394
5395 2004-03-10  Martin Baulig  <martin@ximian.com>
5396
5397         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
5398         instead of IsAssignableFrom.    
5399
5400 2004-03-10  Martin Baulig  <martin@ximian.com>
5401
5402         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
5403
5404         * support.cs (ParameterData.HasArrayParameter): New property.
5405         (ReflectionParameters.ctor): Take a MethodBase instead of a
5406         ParameterInfo[].  If we have any type parameters, get the generic
5407         method definition and ask it whether we have variable arguments.
5408
5409 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
5410
5411         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
5412         routines to check if a type is an enumerable/enumerator allow
5413         classes that implement the IEnumerable or IEnumerator interfaces.
5414
5415         * class.cs (Property, Operator): Implement IIteratorContainer, and
5416         implement SetYields.
5417
5418         (Property.Define): Do the block swapping for get_methods in the
5419         context of iterators.   We need to check if Properties also
5420         include indexers or not.
5421
5422         (Operator): Assign the Block before invoking the
5423         OperatorMethod.Define, so we can trigger the Iterator code
5424         replacement. 
5425
5426         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
5427         Property and Operator classes are not created when we parse the
5428         declarator but until we have the block completed, so we use a
5429         singleton SimpleIteratorContainer.Simple to flag whether the
5430         SetYields has been invoked.
5431
5432         We propagate this setting then to the Property or the Operator to
5433         allow the `yield' to function.
5434
5435 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
5436
5437         * codegen.cs: Implemented attribute support for modules.
5438         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
5439         Assembly/Module functionality.
5440
5441         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
5442         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
5443         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
5444
5445 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
5446
5447         * interface.cs (FindMembers): The operation is performed on all base
5448         interfaces and not only on the first. It is required for future CLS Compliance patch.
5449
5450 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
5451
5452         * statement.cs, codegen.cs:
5453         This patch deals with patterns such as:
5454
5455         public class List : IEnumerable {
5456
5457                 public MyEnumerator GetEnumerator () {
5458                         return new MyEnumerator(this);
5459                 }
5460
5461                 IEnumerator IEnumerable.GetEnumerator () {
5462                         ...
5463                 }
5464                 
5465                 public struct MyEnumerator : IEnumerator {
5466                         ...
5467                 }
5468         }
5469
5470         Before, there were a few things we did wrong:
5471         1) we would emit callvirt on a struct, which is illegal
5472         2) we emited ldarg when we needed to emit ldarga
5473         3) we would mistakenly call the interface methods on an enumerator
5474         type that derived from IEnumerator and was in another assembly. For example:
5475
5476         public class MyEnumerator : IEnumerator
5477
5478         Would have the interface methods called, even if there were public impls of the
5479         method. In a struct, this lead to invalid IL code.
5480
5481 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
5482
5483         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
5484           renamed to Emit.
5485
5486         * delegate.cs (Define): Fixed crash when delegate type is undefined.
5487
5488 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
5489
5490         * cs-parser.jay: Fix small regression: we were not testing V2
5491         compiler features correctly.
5492
5493         * interface.cs: If the emit context is null, then create one
5494
5495 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
5496
5497         * decl.cs (GetSignatureForError): New virtual method to get full name
5498           for error messages.
5499
5500         * attribute.cs (IAttributeSupport): New interface for attribute setting.
5501           Now it is possible to rewrite ApplyAttributes method to be less if/else.
5502
5503         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
5504           Duplicated members and code in these classes has been removed.
5505           Better encapsulation in these classes.
5506
5507 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
5508
5509         * assign.cs (Assign.DoResolve): When dealing with compound
5510         assignments, there is a new rule in ECMA C# 2.4 (might have been
5511         there before, but it is documented here) that states that in:
5512
5513         a op= b;
5514
5515         If b is of type int, and the `op' is a shift-operator, then the
5516         above is evaluated as:
5517
5518         a = (int) a op b 
5519
5520         * expression.cs (Binary.ResolveOperator): Instead of testing for
5521         int/uint/long/ulong, try to implicitly convert to any of those
5522         types and use that in pointer arithmetic.
5523
5524         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
5525         method to print information for from the type, not from the
5526         null-method we were given.
5527
5528 2004-02-01  Duncan Mak  <duncan@ximian.com>
5529
5530         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
5531         parsing for cmd, fixes bug #53694.
5532
5533 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
5534
5535         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
5536         in the member name duplication tests. Property and operator name duplication
5537         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
5538
5539 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
5540
5541         * interface.cs (PopulateMethod): Fixed crash when interface method
5542         returns not existing type (error test cs0246-3.cs).
5543
5544 2004-02-02  Ravi Pratap M <ravi@ximian.com>
5545
5546         * cs-parser.jay (interface_accessors): Re-write actions to also
5547         store attributes attached to get and set methods. Fix spelling
5548         while at it.
5549
5550         (inteface_property_declaration): Modify accordingly.
5551
5552         (InterfaceAccessorInfo): New helper class to store information to pass
5553         around between rules that use interface_accessors.
5554
5555         * interface.cs (Emit): Apply attributes on the get and set
5556         accessors of properties and indexers too.
5557
5558         * attribute.cs (ApplyAttributes): Modify accordingly to use the
5559         right MethodBuilder when applying attributes to the get and set accessors.
5560
5561 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
5562
5563         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
5564
5565 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
5566
5567         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
5568
5569 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
5570
5571         * cs-parser.jay: Remove YIELD token, instead use the new grammar
5572         changes that treat `yield' specially when present before `break'
5573         or `return' tokens.
5574
5575         * cs-tokenizer.cs: yield is no longer a keyword.
5576
5577 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
5578
5579         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
5580         setting for default constructors.
5581         For default constructors are almost every time set wrong Modifier. The
5582         generated IL code has been alright. But inside mcs this values was
5583         wrong and this was reason why several of my CLS Compliance tests
5584         failed.
5585
5586 2004-02-27  Martin Baulig  <martin@ximian.com>
5587
5588         * generics.cs (ConstructedType.ResolveType): Make the nested type
5589         stuff actually work.
5590
5591 2004-02-25  Martin Baulig  <martin@ximian.com>
5592
5593         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
5594         property; returns the type parameters just from the current type,
5595         ie. with the ones from outer classes.
5596         (DeclSpace.LookupGeneric): First search in the current class, then
5597         in outer classes.
5598         (DeclSpace.initialize_type_params): When hiding a type parameter
5599         from an outer class, put it into the `type_param_list' anyways.
5600
5601         * expression.cs (MemberAccess.expr): Made this field protected.
5602
5603         * class.cs (TypeContainer.Define): The `CurrentType' just contains
5604         the type parameters from the current class.
5605
5606         * generic.cs (ConstructedType.ResolveType): Support nested generic
5607         types by taking the type parameters which we inherit from outer
5608         classes into account.
5609         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
5610         support for nested generic types.
5611
5612 2004-02-23  Martin Baulig  <martin@ximian.com>
5613
5614         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
5615         field and check whether we're nested inside a generic type.
5616         (DeclSpace.ResolveType): If we're resolving to a generic type
5617         definition, create a ConstructedType and return its resolved type.
5618         (DeclSpace.initialize_type_params): New private method;
5619         initializes the `type_param_list' field from the type parameters
5620         from this and all enclosing classes.
5621         (DeclSpace.TypeParameters): Call initialize_type_params() unless
5622         we're already initialized.
5623
5624 2004-02-23  Martin Baulig  <martin@ximian.com>
5625
5626         * class.cs (Method.Define): Create the generic method before
5627         calling DoDefine().
5628         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
5629         the TypeContainer one); we use this for generic methods.
5630
5631         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
5632         parent's TypeBuilder.
5633
5634 2004-02-18  Martin Baulig  <martin@ximian.com>
5635
5636         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
5637         to check for equality.
5638
5639 2004-02-05  Martin Baulig  <martin@ximian.com>
5640
5641         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
5642         `ec.TypeContainer.CurrentType', use it instead of
5643         `ec.ContainerType' to check whether we're in the type's ctor.
5644
5645 2004-01-29  Martin Baulig  <martin@ximian.com>
5646
5647         * expression.cs (Invocation.DoResolve): If we're a
5648         `ConstructedType', then we're actually a generic method, so
5649         rewrite the expr as a GenericMemberAccess.
5650
5651         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
5652         here; manually parse it into a string.
5653
5654 2004-01-28  Martin Baulig  <martin@ximian.com>
5655
5656         * typemanager.cs (TypeManager.IsEqual): New static method.
5657         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
5658         check for equality instead of using `=='.
5659
5660 2004-01-26  Martin Baulig  <martin@ximian.com>
5661
5662         * decl.cs (DeclSpace.CurrentType): New public field.
5663
5664         * expression.cs (This.ResolveBase): If we have an
5665         `ec.TypeContainer.CurrentType', use it instead of
5666         `ec.ContainerType'.
5667
5668         * class.cs (TypeContainer.DefineType): If we're a generic type,
5669         create the `CurrentType' (unresolved).
5670         (TypeContainer.GenericType): New private field.
5671         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
5672         it and store it in `GenericType' before creating the MemberCache.
5673         (TypeContainer.GetMembers): If we have a `GenericType', call
5674         TypeManager.FindMembers() on it.
5675
5676         * interface.cs (Interface.GenericType): New private field.
5677         (Interface.DefineType): If we're a generic type, create the
5678         `CurrentType' (unresolved).
5679         (Interface.DefineMembers): If we have a `CurrentType', resolve it
5680         and store it in `GenericType' before creating the MemberCache.
5681         (Interface.GetMembers): If we have a `GenericType', call
5682         TypeManager.FindMembers() on it.
5683
5684 2004-01-22  Martin Baulig  <martin@ximian.com>
5685
5686         * cs-parser.jay (namespace_or_type_name): Return an Expression,
5687         not a QualifiedIdentifier.  This is what `type_name_expression'
5688         was previously doing.
5689         (type_name_expression): Removed; the code is now in
5690         `namespace_or_type_name'.
5691         (qualified_identifier): Removed, use `namespace_or_type_name'
5692         instead.
5693         (QualifiedIdentifier): Removed this class.      
5694
5695 2004-01-22  Martin Baulig  <martin@ximian.com>
5696
5697         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
5698         not a string as alias name.
5699
5700 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
5701
5702         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
5703         #52730 bug, and instead compute correctly the need to use a
5704         temporary variable when requesting an address based on the
5705         static/instace modified of the field and the constructor.
5706  
5707 2004-01-21  Martin Baulig  <martin@ximian.com>
5708
5709         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
5710         class and namespace before looking up aliases.  Fixes #52517.
5711
5712 2004-01-21  Martin Baulig  <martin@ximian.com>
5713
5714         * flowanalysis.cs (UsageVector.Merge): Allow variables being
5715         assinged in a 'try'; fixes exception4.cs.
5716
5717 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5718         * class.cs : Implemented parameter-less constructor for TypeContainer
5719
5720         * decl.cs: Attributes are now stored here. New property OptAttributes
5721
5722         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
5723
5724         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
5725
5726 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5727
5728         * typemanager.cs (CSharpSignature): Now reports also inner class name.
5729           (CSharpSignature): New method for indexer and property signature.
5730
5731 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5732
5733         * pending.cs (IsVirtualFilter): Faster implementation.
5734
5735 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5736
5737         * typemanager.cs: Avoid inclusion of same assembly more than once.
5738
5739 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5740
5741         * cs-parser.jay: Fixed problem where the last assembly attribute
5742           has been applied also to following declaration (class, struct, etc.)
5743           
5744 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
5745
5746         * class.cs: Added error CS0538, CS0539 reporting.
5747         Fixed crash on Microsoft runtime when field type is void.
5748
5749         * cs-parser.jay: Added error CS0537 reporting.
5750
5751         * pending.cs: Added error CS0535 reporting.
5752         Improved error report for errors CS0536, CS0534.
5753
5754 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
5755
5756         Merge a few bits from the Anonymous Method MCS tree.
5757
5758         * statement.cs (ToplevelBlock): New class for toplevel methods,
5759         will hold anonymous methods, lifted variables.
5760
5761         * cs-parser.jay: Create toplevel blocks for delegates and for
5762         regular blocks of code. 
5763
5764 2004-01-20  Martin Baulig  <martin@ximian.com>
5765
5766         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
5767         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
5768         and `NeedExplicitReturn'; added `IsLastStatement'.
5769         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
5770         have a `ReturnLabel' or we're not unreachable.
5771
5772         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
5773         child's reachability; don't just override ours with it.  Fixes
5774         #58058 (lluis's example).
5775         (FlowBranching): Added public InTryOrCatch(), InCatch(),
5776         InFinally(), InLoop(), InSwitch() and
5777         BreakCrossesTryCatchBoundary() methods.
5778
5779         * statement.cs (Return): Do all error checking in Resolve().
5780         Unless we are the last statement in a top-level block, always
5781         create a return label and jump to it.
5782         (Break, Continue): Do all error checking in Resolve(); also make
5783         sure we aren't leaving a `finally'.
5784         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
5785         statement in a top-level block.
5786         (Block.Flags): Added `IsDestructor'.
5787         (Block.IsDestructor): New public property.
5788
5789 2004-01-20  Martin Baulig  <martin@ximian.com>
5790
5791         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
5792
5793 2004-01-20  Martin Baulig  <martin@ximian.com>
5794
5795         * statement.cs (Statement.ResolveUnreachable): New public method.
5796         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
5797         (Block.Resolve): Resolve unreachable statements.
5798
5799 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
5800
5801         * expression.cs: We need to fix the case where we do
5802         not have a temp variable here.
5803
5804         * assign.cs: Only expression compound assignments need
5805         temporary variables.
5806
5807 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
5808
5809         * flowanalysis.cs: Reduce memory allocation in a few ways:
5810           - A block with no variables should not allocate a bit
5811             vector for itself.
5812           - A method with no out parameters does not need any tracking
5813             for assignment of the parameters, so we need not allocate
5814             any data for it.
5815           - The arrays:
5816                 public readonly Type[] VariableTypes;
5817                 public readonly string[] VariableNames;
5818             Are redundant. The data is already stored in the variable
5819             map, so we need not allocate another array for it.
5820           - We need to add alot of checks for if (params | locals) == null
5821             due to the first two changes.
5822
5823 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
5824
5825         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
5826         implement IMemoryLocation, we store a copy on a local variable and
5827         take the address of it.  Patch from Benjamin Jemlich
5828
5829         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
5830         to use a special "type_name_expression" rule which reduces the
5831         number of "QualifiedIdentifier" classes created, and instead
5832         directly creates MemberAccess expressions.
5833
5834 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
5835
5836         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
5837         that fixes #52853.  Null literal assignment to ValueType
5838
5839         * class.cs (MethodData.Emit): Instead of checking the name of the
5840         method to determine if its a destructor, create a new derived
5841         class from Method called Destructor, and test for that.  
5842
5843         * cs-parser.jay: Create a Destructor object instead of a Method.  
5844
5845         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
5846
5847         Fixes: 52933
5848
5849 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
5850
5851         * expression.cs (Binary.ResolveOperator): Perform an implicit
5852         conversion from MethodGroups to their delegate types on the
5853         Addition operation.
5854
5855         * delegate.cs: Introduce a new class DelegateCreation that is the
5856         base class for `NewDelegate' and `ImplicitDelegateCreation',
5857         factor some code in here.
5858
5859         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
5860         conversion from MethodGroups to compatible delegate types. 
5861
5862         * ecore.cs (Expression.Resolve): Do not flag error 654
5863         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
5864         we allow conversions from MethodGroups to delegate types now.
5865
5866         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
5867         assignments in v2 either.
5868
5869 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
5870
5871         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
5872         static read-only fields in ctors.
5873
5874         Applied patch from Benjamin Jemlich 
5875
5876         * expression.cs (UnaryMutator): Avoid leaking local variables. 
5877
5878 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
5879
5880         * cs-tokenizer.cs (IsCastToken): Allow the various native types
5881         here to return true, as they can be used like this:
5882
5883                 (XXX) int.MEMBER ()
5884
5885         Fixed 49836 and all the other dups
5886
5887 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
5888
5889         * driver.cs: Implement /win32res and /win32icon.
5890
5891 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
5892
5893         * cs-parser.jay: Add a rule to improve error handling for the
5894         common mistake of placing modifiers after the type.
5895
5896 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
5897
5898         * cs-parser.jay (interface_event_declaration): Catch
5899         initialization of events on interfaces, and report cs0068
5900
5901         * cs-parser.jay (interface_event_declaration): Catch
5902         initialization of events. 
5903
5904         * ecore.cs: Better report missing constructors.
5905
5906         * expression.cs (Binary.ResolveOperator): My previous bug fix had
5907         the error reporting done in the wrong place.  Fix.
5908
5909         * expression.cs (Binary.ResolveOperator): Catch the 
5910         operator + (E x, E y) error earlier, and later allow for implicit
5911         conversions in operator +/- (E e, U x) from U to the underlying
5912         type of E.
5913
5914         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
5915         52596, if the container class is abstract, the default constructor
5916         is protected otherwise its public (before, we were always public).
5917
5918         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
5919         fixed statement.
5920
5921         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
5922         Jemlich that fixes bug #52597, MCS was generating invalid code for
5923         idisposable structs.   Thanks to Ben for following up with this
5924         bug as well.
5925
5926 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
5927
5928         * driver.cs: Allow assemblies without code to be generated, fixes
5929         52230.
5930
5931 2004-01-07  Nick Drochak <ndrochak@gol.com>
5932
5933         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
5934
5935 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
5936
5937         * cs-parser.jay: Add rules to improve error reporting if fields or
5938         methods are declared at the namespace level (error 116)
5939
5940         * Add rules to catch event add/remove
5941
5942 2004-01-04  David Sheldon <dave-mono@earth.li>
5943
5944   * expression.cs: Added matching ")" to error message for 
5945   CS0077
5946
5947 2004-01-03 Todd Berman <tberman@gentoo.org>
5948
5949         * ecore.cs, attribute.cs:
5950         Applying fix from #52429.
5951
5952 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5953
5954         * ecore.cs, expression.cs, statement.cs:
5955         Total rewrite of how we handle branching. We
5956         now handle complex boolean expressions with fewer
5957         jumps. As well if (x == 0) no longer emits a ceq.
5958
5959         if (x is Foo) is much faster now, because we generate
5960         better code.
5961
5962         Overall, we get a pretty big improvement on our benchmark
5963         tests. The code we generate is smaller and more readable.
5964
5965         I did a full two-stage bootstrap. The patch was reviewed
5966         by Martin and Miguel.
5967
5968 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5969
5970         * cs-parser.jay: Make primary_expression not take a QI.
5971         we dont need this because the member_access rule covers
5972         us here. So we replace the rule with just IDENTIFIER.
5973
5974         This has two good effects. First, we remove a s/r conflict.
5975         Second, we allocate many fewer QualifiedIdentifier objects.
5976
5977 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5978
5979         * attribute.cs: Handle MarshalAs attributes as pseudo, and
5980         set the correct information via SRE. This prevents
5981         hanging on the MS runtime. Fixes #29374.
5982
5983 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
5984
5985         * convert.cs: correctly handle conversions to value types
5986         from Enum and ValueType as unboxing conversions.
5987
5988         Fixes bug #52569. Patch by Benjamin Jemlich.
5989
5990 2004-01-02  Ravi Pratap  <ravi@ximian.com>
5991
5992         * expression.cs (BetterConversion): Prefer int -> uint
5993         over int -> ulong (csc's behaviour). This fixed bug #52046.
5994
5995 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
5996
5997         * decl.cs (MemberCache.FindMembers): now returns a
5998         MemberInfo [].
5999
6000         * typemanager.cs: In general, go with with ^^.
6001         (CopyNewMethods): take an IList.
6002         (RealMemberLookup): Only allocate an arraylist
6003         if we copy from two sets of methods.
6004
6005         This change basically does two things:
6006         1) Fewer array lists allocated due to CopyNewMethods.
6007         2) the explicit cast in MemberList costed ALOT.
6008
6009 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
6010
6011         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
6012         a hashtable to avoid needless string allocations when an identifier is
6013         used more than once (the common case).
6014
6015 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
6016
6017         * pending.cs: MS's TypeBuilder.GetInterfaces ()
6018         is broken, it will not return anything. So, we
6019         have to use the information we have in mcs to
6020         do the task.
6021
6022         * typemanager.cs: Add a cache for GetInterfaces,
6023         since this will now be used more often (due to ^^)
6024
6025         (GetExplicitInterfaces) New method that gets the
6026         declared, not effective, interfaces on a type
6027         builder (eg, if you have interface IFoo, interface
6028         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
6029         { IBar }.
6030
6031         This patch makes MCS able to bootstrap itself on
6032         Windows again.
6033
6034 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
6035
6036         * expression.cs: Remove the Nop's that Miguel put
6037         in by mistake.
6038
6039 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6040
6041         * report.cs, codegen.cs: Give the real stack trace to
6042         the error when an exception is thrown.
6043
6044 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6045
6046         * decl.cs: only allocate hashtables for ifaces if 
6047         it is an iface!
6048
6049 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6050
6051         * expression.cs: fix the error from cs0121-2.cs
6052         (a parent interface has two child interfaces that
6053         have a function with the same name and 0 params
6054         and the function is called through the parent).
6055
6056 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
6057
6058         * class.cs, rootcontext.cs, typmanager.cs: do not
6059         leak pointers.
6060
6061 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
6062
6063         * codegen.cs: remove stack for the ec flow branching.
6064         It is already a linked list, so no need.
6065
6066 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
6067
6068         * Makefile: Allow custom profiler here.
6069
6070 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
6071
6072         * typemanager.cs (LookupType):
6073           - Use a static char [], because split takes
6074             a param array for args, so it was allocating
6075             every time.
6076           - Do not store true in a hashtable, it boxes.
6077
6078 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
6079
6080         * flowanalysis.cs: bytify common enums.
6081
6082 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6083
6084         * modifiers.cs: Add a new set of flags for the
6085         flags allowed on explicit interface impls.
6086         * cs-parser.jay: catch the use of modifiers in
6087         interfaces correctly.
6088         * class.cs: catch private void IFoo.Blah ().
6089
6090         All related to bug #50572.
6091
6092 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6093
6094         * decl.cs: Rewrite the consistant accessability checking.
6095         Accessability is not linear, it must be implemented in
6096         a tableish way. Fixes #49704.
6097
6098 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6099
6100         * expression.cs: Handle negation in a checked context.
6101         We must use subtraction from zero. Fixes #38674.
6102
6103 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
6104
6105         * class.cs: Ignore static void main in DLLs.
6106         * rootcontext.cs: Handle the target type here,
6107         since we are have to access it from class.cs
6108         * driver.cs: account for the above.
6109
6110 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
6111
6112         * report.cs: Give line numbers and files if available.
6113
6114 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
6115
6116         * driver.cs: Implement /addmodule.
6117
6118         * typemanager.cs:  Change 'modules' field so it now contains Modules not
6119         ModuleBuilders.
6120
6121 2003-12-20  Martin Baulig  <martin@ximian.com>
6122
6123         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
6124         (FieldBase.IsAssigned): Removed this field.
6125         (FieldBase.SetAssigned): New public method.
6126         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
6127
6128 2003-12-20  Martin Baulig  <martin@ximian.com>
6129
6130         * expression.cs (LocalVariableReference.DoResolve): Don't set
6131         `vi.Used' if we're called from DoResolveLValue().
6132
6133         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
6134         returns the usage vector it just merged into the current one -
6135         pass this one to UsageWarning().
6136         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
6137         of the `EmitContext', don't call this recursively on our children.
6138
6139 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
6140
6141         * driver.cs: Implement /target:module.
6142
6143 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
6144
6145         * support.cs (CharArrayHashtable): New helper class.
6146
6147         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
6148         char arrays, not strings, so we can avoid creating a string in
6149         consume_identifier if the identifier is a keyword.
6150
6151 2003-12-16  Martin Baulig  <martin@ximian.com>
6152
6153         * statement.cs (LocalInfo.Assigned): Removed this property.
6154         (LocalInfo.Flags): Removed `Assigned'.
6155         (LocalInfo.IsAssigned): New public method; takes the EmitContext
6156         and uses flow analysis.
6157         (Block.UsageWarning): Made this method private.
6158         (Block.Resolve): Call UsageWarning() if appropriate.
6159
6160         * expression.cs (LocalVariableReference.DoResolve): Always set
6161         LocalInfo.Used here.
6162
6163 2003-12-13  Martin Baulig  <martin@ximian.com>
6164
6165         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
6166         any value here; we're now using flow analysis to figure out
6167         whether a statement/block returns a value.
6168
6169 2003-12-13  Martin Baulig  <martin@ximian.com>
6170
6171         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
6172         working again.
6173         (FlowBranching.MergeFinally): Don't call
6174         `branching.CheckOutParameters()' here, this is called in
6175         MergeTopBlock().
6176         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
6177         when adding the `finally' vector.       
6178
6179 2003-12-13  Martin Baulig  <martin@ximian.com>
6180
6181         * flowanalysis.cs
6182         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
6183         actually work and also fix #48962.
6184
6185 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
6186
6187         * decl.cs: Do not check System.Object for nested types,
6188         since we know it does not have any. Big bang for buck:
6189
6190         BEFORE:
6191            Run 1:   8.35 seconds
6192            Run 2:   8.32 seconds
6193            corlib:  17.99 seconds
6194         AFTER:
6195            Run 1:   8.17 seconds
6196            Run 2:   8.17 seconds
6197            corlib:  17.39 seconds
6198
6199 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
6200
6201         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
6202         time we are returning 0 members, so we save alot here.
6203
6204 2003-12-11  Martin Baulig  <martin@ximian.com>
6205
6206         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
6207         `MergeChild()', also just take the `FlowBranching' as argument;
6208         call Merge() on it and return the result.
6209         (FlowBranching.Merge): We don't need to do anything if we just
6210         have one sibling.
6211
6212 2003-12-11  Martin Baulig  <martin@ximian.com>
6213
6214         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
6215         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
6216         Maurer for this idea.
6217
6218 2003-12-11  Martin Baulig  <martin@ximian.com>
6219
6220         * flowanalysis.cs (MergeResult): This class is now gone; we now
6221         use the `UsageVector' for this.  The reason for this is that if a
6222         branching just has one sibling, we don't need to "merge" them at
6223         all - that's the next step to do.
6224         (FlowBranching.Merge): We now return a `UsageVector' instead of a
6225         `MergeResult'.
6226
6227 2003-12-11  Martin Baulig  <martin@ximian.com>
6228
6229         Reworked flow analyis and made it more precise and bug-free.  The
6230         most important change is that we're now using a special `Reachability'
6231         class instead of having "magic" meanings of `FlowReturns'.  I'll
6232         do some more cleanups and optimizations and also add some more
6233         documentation this week.
6234
6235         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
6236         largely reworked this class.
6237         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
6238         the new `Reachability' class instead of having "magic" values here.
6239         (FlowBranching): We're now using an instance of `Reachability'
6240         instead of having separate `Returns', `Breaks' etc. fields.
6241
6242         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
6243         based on flow analysis; ignore the return value of block.Emit ().
6244
6245 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
6246
6247         * driver.cs typemanager.cs: Find the mono extensions to corlib even
6248         if they are private.
6249
6250 2003-12-09  Martin Baulig  <martin@ximian.com>
6251
6252         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
6253         call them directly on the UsageVector.
6254
6255 2003-12-09  Martin Baulig  <martin@ximian.com>
6256
6257         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
6258         Changed return type from `FlowReturns' to `Reachability'.
6259
6260 2003-12-09  Martin Baulig  <martin@ximian.com>
6261
6262         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
6263         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
6264         `Reachable' fields with a single `Reachability' one.
6265
6266 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6267
6268         * class.cs (FindMembers): Remove foreach's.
6269
6270         Bootstrap times:
6271
6272         BEFORE
6273                 Run 1:   8.74 seconds
6274                 Run 2:   8.71 seconds
6275
6276         AFTER
6277                 Run 1:   8.64 seconds
6278                 Run 2:   8.58 seconds
6279
6280
6281 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6282
6283         * cs-parser.jay:
6284         * gen-treedump.cs:
6285         * statement.cs:
6286         This patch does a few things:
6287                 1. EmptyStatement is now a singleton, so it is never reallocated.
6288                 2. All blah is EmptyStatement constructs have been changed to
6289                    blah == EmptyStatement.Value, which is much faster and valid
6290                    now that EmptyStatement is a singleton.
6291                 3. When resolving a block, rather than allocating a new array for
6292                    the non-empty statements, empty statements are replaced with
6293                    EmptyStatement.Value
6294                 4. Some recursive functions have been made non-recursive.
6295         Mainly the performance impact is from (3), however (1) and (2) are needed for
6296         this to work. (4) does not make a big difference in normal situations, however
6297         it makes the profile look saner.
6298
6299         Bootstrap times:
6300
6301         BEFORE
6302         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
6303         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
6304         Total memory allocated: 56397 KB
6305
6306         AFTER
6307         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
6308         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
6309         Total memory allocated: 55666 KB
6310
6311 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6312
6313         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
6314         than the hashtable in a hashtable version
6315
6316         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
6317         we always end up concating a string. This results in a huge perf
6318         loss, because many strings have to be tracked by the GC. In this
6319         patch, we first use a hashtable that works with two keys, so that
6320         the strings do not need to be concat'ed.
6321
6322         Bootstrap times:
6323         BEFORE
6324                 Run 1:   8.74 seconds
6325                 Run 2:   8.71 seconds
6326
6327         AFTER
6328                 Run 1:   8.65 seconds
6329                 Run 2:   8.56 seconds
6330
6331 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
6332
6333         * Makefile: Add a new target `do-time' that does a quick and simple
6334         profile, leaving easy to parse output.
6335
6336 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
6337
6338         * codegen.cs (Init): Create the dynamic assembly with 
6339         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
6340
6341 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
6342
6343         * support.cs: Make the PtrHashtable use only one
6344         instance of its comparer.
6345
6346 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
6347
6348         * typemanager.cs: Fix lookup of GetNamespaces.
6349
6350 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
6351
6352         * expression.cs: Removed redundant line.
6353
6354         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
6355         ArrayLists, use for loops with bounds.  
6356
6357         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
6358         arraylist.
6359
6360         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
6361         arraylists, use for loop with bounds.
6362
6363         The above three changes give us a 0.071 second performance
6364         improvement out of 3.294 seconds down to 3.223.  On my machine
6365         the above changes reduced the memory usage by 1,387 KB during
6366         compiler bootstrap.
6367
6368         * cs-parser.jay (QualifiedIdentifier): New class used to represent
6369         QualifiedIdentifiers.  Before we created a new string through
6370         concatenation, and mostly later on, the result would be
6371         manipulated by DecomposeQI through string manipulation.
6372
6373         This reduced the compiler memory usage for bootstrapping from
6374         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
6375         compile times in 0.05 seconds.
6376
6377 2003-11-28  Dick Porter  <dick@ximian.com>
6378
6379         * support.cs: Do string compares with the Invariant culture.
6380
6381         * rootcontext.cs: 
6382         * gen-treedump.cs: 
6383         * expression.cs: 
6384         * driver.cs: 
6385         * decl.cs: 
6386         * codegen.cs: 
6387         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
6388         the comparison is done with the Invariant culture.
6389
6390 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
6391
6392         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
6393         GetEnumerator method.
6394
6395         (ProbeCollectionType): Iterate starting at the most specific type
6396         upwards looking for a GetEnumerator
6397
6398         * expression.cs: Shift count can be up to 31 for int/uint and 63
6399         for long/ulong.
6400
6401 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
6402
6403         * statement.cs (Block.LookupLabel): Also look for the label on the
6404         children blocks.  Use a hash table to keep track of visited
6405         nodes. 
6406
6407         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
6408         we actually did transform the other operand, otherwise fall back
6409         to the common codepath that casts to long.
6410
6411         * cs-tokenizer.cs: Use the same code pattern as the int case.
6412         Maybe I should do the parsing myself, and avoid depending on the
6413         Parse routines to get this done.
6414
6415 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
6416
6417         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
6418         which fixes bug 51347.  This time test it.
6419
6420         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
6421         attributes for example can not tell the difference between these.
6422         The difference was only a syntax feature of the language. 
6423
6424         * attribute.cs: Apply attributes to delegates.
6425
6426         * delegate.cs: Call the apply attributes method.
6427
6428 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
6429
6430         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
6431         comparing 0 vs Byte.MinValue, not the value
6432
6433         (ImplicitConversionRequired): When reporting a conversion error,
6434         use error 31 to print out the constant error instead of the
6435         simpler 29.
6436
6437         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
6438         which fixes bug 51347.
6439
6440 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
6441
6442         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
6443         which fixes the -warnaserror command line option.
6444
6445 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
6446
6447         * cfold.cs (DoNumericPromotions): During constant folding of
6448         additions on UIntConstant, special case intconstants with
6449         IntConstants like we do on the expression binary operator. 
6450
6451 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
6452
6453         * convert.cs (ImplicitReferenceConversion): We were missing a case
6454         (System.Enum are not value types or class types, so we need to
6455         classify them separatedly).
6456
6457         * driver.cs: We do not support error 2007.
6458
6459 2003-11-12 Jackson Harper <jackson@ximian.com>
6460
6461         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
6462         system directory. Also use the full file name so users can
6463         libraries names mscorlib-o-tron.dll in a non system dir.
6464         
6465 2004-01-04  David Sheldon <dave-mono@earth.li>
6466
6467         * expression.cs: Added matching ")" to error message for CS0077.
6468
6469 2003-12-19  Martin Baulig  <martin@ximian.com>
6470
6471         * typemanager.cs (TypeManager.IsEqualGenericType): New public
6472         static method; see documentation in the method.
6473         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
6474
6475         * convert.cs (Convert.ImplicitReferenceConversion,
6476         Convert.ImplicitReferenceConversionExists): Add support for
6477         generic type declarations; see gen-36.cs.
6478
6479 2003-12-19  Martin Baulig  <martin@ximian.com>
6480
6481         * pending.cs (Pending.InterfaceMethod): Use
6482         `Type.IsAssignableFrom()' instead of `=='.
6483
6484 2003-12-18  Martin Baulig  <martin@ximian.com>
6485
6486         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
6487         byref types first.
6488
6489         * convert.cs (Convert.ImplicitStandardConversionExists): Use
6490         `expr_type.Equals (target_type)' instead of `=='.
6491
6492 2003-12-08  Martin Baulig  <martin@ximian.com>
6493
6494         * generics.cs (Constraints.Types): Removed.
6495         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
6496         to Type's.
6497         (Constraints.ResolveTypes): New public method; resolves the
6498         TypeExpr's to Type's.
6499         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
6500         longer takes the constraints.
6501         (TypeParameter.DefineMethod): Likewise.
6502         (TypeParameter.DefineType): New public method.  Calls
6503         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
6504         the constraints.
6505
6506 2003-12-08  Martin Baulig  <martin@ximian.com>
6507
6508         * convert.cs (Convert.ImplicitConversionStandard): Use
6509         `expr_type.Equals (target_type)' instead of `=='.
6510
6511 2003-12-08  Martin Baulig  <martin@ximian.com>
6512
6513         * typemanager.cs (TypeManager.GetReferenceType): Call
6514         `Type.MakeByRefType ()'.
6515
6516 2003-12-08  Martin Baulig  <martin@ximian.com>
6517
6518         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
6519         just has some special meaning in some situations.  For instance,
6520         it is allowed to use `where' as the name of a variable etc.
6521
6522 2003-12-04  Martin Baulig  <martin@ximian.com>
6523
6524         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
6525         `Type.MakeArrayType()' for array types.
6526
6527 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
6528
6529         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
6530         debugging message.
6531
6532         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
6533         corlib to compile.
6534
6535 2003-11-16  Martin Baulig  <martin@ximian.com>
6536
6537         * codegen.cs (EmitContext.IsGeneric): Removed.
6538
6539         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
6540         ResolveGeneric() on the DeclSpace.
6541
6542 2003-11-16  Martin Baulig  <martin@ximian.com>
6543
6544         * generic.cs (TypeArguments.Resolve):
6545         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
6546         `ResolveType()' on it to get the Type.
6547
6548 2003-11-15  Martin Baulig  <martin@ximian.com>
6549
6550         * generic.cs (ConstructedType.GetInterfaces): Override this.
6551
6552 2003-11-14  Martin Baulig  <martin@ximian.com>
6553
6554         * interface.cs (Interface.DefineType): Define all type parameters
6555         before adding the interfaces we inherit.
6556
6557 2003-11-11  Martin Baulig  <martin@ximian.com>
6558
6559         * generic.cs (ConstructedType.ResolveType): Always call
6560         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
6561
6562 2003-11-10  Martin Baulig  <martin@ximian.com>
6563
6564         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
6565         (TypeManager.InitCoreTypes): Initialize them here, but instead of
6566         calling `ResolveType()' on them, directly assign their `Type'.
6567
6568 2003-11-08  Martin Baulig  <martin@ximian.com>
6569
6570         * generic.cs (ConstructedType): Override `IsClass' etc.
6571
6572 2003-11-08  Martin Baulig  <martin@ximian.com>
6573
6574         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
6575         return value and the `out parent' parameter.
6576         (TypeContainer.DefineType): Moved the CS0644 check into
6577         GetClassBases().  Don't pass the interface types to the
6578         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
6579         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
6580
6581         * ecore.cs (TypeExpr.IsAttribute): New property.
6582         (TypeExpr.GetInterfaces): New method.
6583
6584         * interface.cs (Interface.GetInterfaceTypeByName): Return a
6585         TypeExpr instead of a Type.
6586         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
6587         (Interface.DefineType): Don't pass the interface types to the
6588         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
6589         them later and then call `TypeBulider.AddInterfaceImplementation()'.
6590
6591         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
6592         instead of a `Type[]'.
6593         (TypeManager.RegisterBuilder): Likewise.
6594         (TypeManager.AddUserInterface): Likewise.
6595         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
6596         `Type[]' and also return a `TypeExpr[]'.
6597         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
6598
6599 2003-11-08  Martin Baulig  <martin@ximian.com>
6600
6601         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
6602         Expression.     
6603
6604 2003-11-08  Martin Baulig  <martin@ximian.com>
6605
6606         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
6607         TypeManager.ResolveExpressionTypes().
6608
6609         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
6610         instead of an Expression.
6611         (TypeExpr): This is now an abstract base class for `TypeExpression'.
6612         (TypeExpression): New public class; formerly known as `TypeExpr'.
6613
6614         * expression.cs (ComposedCast): Derive from TypeExpr.
6615
6616         * typemanager.cs (TypeManager.system_*_expr): These are now
6617         TypExpr's instead of Expression's.
6618         (TypeManager.ResolveExpressionTypes): New public static function;
6619         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
6620         of them.        
6621
6622 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
6623
6624         * expression.cs (New.DoResolve): Do not dereference value that
6625         might be a null return.
6626
6627         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
6628         sure that the constant value has the right type.  Fixes an
6629         unreported bug, similar to 50425.
6630
6631         * const.cs (Const.LookupConstantValue): Call
6632         ImplicitStandardConversionExists before doing a conversion to
6633         avoid havng the TypeManager.ChangeType do conversions.
6634
6635         Reduced the number of casts used
6636
6637         (Const.ChangeType): New routine to enable reuse of the constant
6638         type changing code from statement.
6639
6640         * typemanager.cs (ChangeType): Move common initialization to
6641         static global variables.
6642
6643         Fixes #50425.
6644
6645         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
6646         every value type to go through, even if it was void.  Fix that. 
6647
6648         * cs-tokenizer.cs: Use is_identifier_start_character on the start
6649         character of the define, and the is_identifier_part_character for
6650         the rest of the string.
6651
6652 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
6653
6654         * expression.cs (UnaryMutator.EmitCode): When I updated
6655         LocalVariableReference.DoResolve, I overdid it, and dropped an
6656         optimization done on local variable references.
6657
6658 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
6659
6660         * ecore.cs: Convert the return from Ldlen into an int.
6661
6662 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
6663
6664         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
6665         the accessibility, this is a special case for toplevel non-public
6666         classes (internal for instance).
6667
6668 2003-10-20  Nick Drochak <ndrochak@gol.com>
6669
6670         * ecore.cs: Fix typo and build.  Needed another right paren.
6671
6672 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
6673
6674         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
6675         `internal' case regular and protected, but not allowing protected
6676         to be evaluated later.  Bug 49840
6677
6678 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
6679
6680         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
6681         to kb.Nlast, and not the kb.nFirst to isolate the switch
6682         statement.
6683
6684         Extract the underlying type, so enumerations of long/ulong are
6685         treated like long/ulong.
6686
6687 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
6688
6689         * expression.cs (New): Overload the meaning of RequestedType to
6690         track the possible creation of the NewDelegate type, since
6691         DoResolve is invoked more than once for new constructors on field
6692         initialization.
6693
6694         See bugs: #48800 and #37014
6695
6696         * cs-parser.jay (declare_local_constants): Take an arraylist
6697         instead of a single constant.
6698
6699         (local_constant_declaration): It should take a
6700         constant_declarators, not a constant_declarator.  Fixes 49487
6701
6702         * convert.cs: Fix error report.
6703
6704 2003-10-13 Jackson Harper <jackson@ximian.com>
6705
6706         * typemanager.cs (TypeToCoreType): Add float and double this fixes
6707         bug #49611
6708         
6709 2003-11-03  Martin Baulig  <martin@ximian.com>
6710
6711         * expression.cs (ArrayAccess.GetStoreOpcode): Added
6712         `out bool has_type_arg'; if set, we need to pass the type to
6713         ig.Emit().
6714         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
6715         Stelem_Any/Ldelem_Any for generic parameters.   
6716
6717 2003-11-02  Martin Baulig  <martin@ximian.com>
6718
6719         * expression.cs (Invocation.EmitCall): Use
6720         `TypeManager.IsValueType()' to check whether it's a value type.
6721         Don't set `struct_call' when calling a method on a type parameter.
6722
6723 2003-11-02  Martin Baulig  <martin@ximian.com>
6724
6725         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
6726         and removed the TypeBuilder argument.
6727
6728         * typemanager.cs (TypeManager.IsValueType): Return
6729         `t.IsGenericParameter || t.IsValueType'.
6730
6731 2003-10-25  Martin Baulig  <martin@ximian.com>
6732
6733         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
6734         call ConstructedType.Resolve() on it.
6735
6736         * generic.cs (ConstructedType.Resolve): Set `type' on success.
6737
6738 2003-10-25  Martin Baulig  <martin@ximian.com>
6739
6740         * class.cs (TypeContainer.GetClassBases): Changed
6741         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
6742         CS8214 reporting here.
6743         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
6744         instead of a `Type' for our parent.  In case of a recursive
6745         declaration (see tests/gen-23.cs for an example), our parent is a
6746         ConstructedType and it doesn't have its type set.  So, first
6747         create our own TypeBuilder, then call constructed.Resolve() to get
6748         the parent's type and finally TypeBuilder.SetParent() it.
6749
6750         * ecore.cs (TypeExpr.Name): New public virtual property.
6751
6752         * generic.cs
6753         (ConstructedType): We're now a TypeExpr and not just an Expression.
6754         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
6755         arguments here; this is done later.
6756         (ConstructedType.Resolve): New public method to resolve the type
6757         arguments and bind them.
6758
6759 2003-10-21  Martin Baulig  <martin@ximian.com>
6760
6761         * convert.cs: Use `TypeManager.IsValueType' instead of
6762         'type.IsValueType' everywhere.
6763
6764         * typemanager.cs (TypeManager.IsValueType): Return true for type
6765         parameters.  The reason for this is that we need to box a type
6766         parameter when converting it to a reference type.
6767
6768         * cs-parser.jay: Added support for default value expressions.
6769
6770         * generics.cs (DefaultValueExpression): New public class.       
6771
6772 2003-10-17  Martin Baulig  <martin@ximian.com>
6773
6774         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
6775         TypeContainer so we can also use this for Interfaces.
6776         (TypeParameter.Resolve): Likewise.
6777
6778         * interface.cs (Interface.DefineType): Added support for generic
6779         interfaces.
6780
6781         * cs-parser.jay: Added support for generic structs and interfaces.
6782
6783 2003-10-17  Martin Baulig  <martin@ximian.com>
6784
6785         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
6786         call generic methods :-)
6787
6788 2003-10-16  Martin Baulig  <martin@ximian.com>
6789
6790         * cs-parser.jay (namespace_or_type_name): Only create a
6791         GenericMemberAccess if we actually have type arguments.
6792
6793 2003-10-13  Martin Baulig  <martin@ximian.com>
6794
6795         * class.cs (Method.Define): If we're a generic method, call
6796         TypeBuilder.DefineGenericMethod () before resolving
6797         the parameters.
6798         (MethodData): Added .ctor which takes an additional MethodBuilder
6799         argument; this is used for generic methods.
6800         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
6801         we already have a MethodBuilder.
6802
6803 2003-10-10  Martin Baulig  <martin@ximian.com>
6804
6805         * class.cs (Method): Added .ctor which takes a `GenericMethod'
6806         instead of a `DeclSpace'.  This is used for generic methods.
6807
6808         * cs-parser.jay (method_header): Added support for generic
6809         methods; create a `GenericMethod' instance and pass it to the
6810         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
6811         parameters and locals.
6812
6813         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
6814         since we already have the location.  Check whether we're a generic
6815         type declaration or a generic method and create the correct type
6816         parameter.
6817
6818         * generic.cs (TypeParameter.DefineMethod): New public method.
6819         (GenericMethod): New public class; derives from DeclSpace and is
6820         used for generic methods.       
6821
6822 2003-10-09  Martin Baulig  <martin@ximian.com>
6823
6824         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
6825         to the .ctor.
6826         (MethodCore.DoDefineParameters): Removed the TypeContainer
6827         argument; use the DeclSpace which was passed to the .ctor instead.
6828         (MethodCore.CheckParameter): Take a DeclSpace instead of a
6829         TypeContainer; we only need a DeclSpace here.
6830
6831 2003-10-09  Martin Baulig  <martin@ximian.com>
6832
6833         * class.cs (MethodData): Added additional `DeclSpace ds' argument
6834         to the .ctor.
6835         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
6836         EmitContext's .ctor.    
6837
6838 2003-10-09  Martin Baulig  <martin@ximian.com>
6839
6840         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
6841         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
6842         AsAccessible(), moved them as well.
6843
6844         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
6845
6846 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
6847
6848         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
6849         generation for >=, as spotted by Paolo, bug 48679.  
6850         Patch from David Waite.
6851
6852         * cs-tokenizer.cs: Add handling for #pragma.
6853
6854         * cs-parser.jay: Allow for both yield and yield return in the
6855         syntax.  The anti-cobolization of C# fight will go on!
6856
6857         * class.cs (TypeBuilder.DefineType): Catch error condition here
6858         (Parent.DefineType erroring out and returning null).
6859
6860         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6861         coping with enumerations variables, we were mistakenly processing
6862         them as a regular value type instead of built-in types.  Fixes the
6863         bug #48063
6864
6865         * typemanager.cs (IsBuiltinOrEnum): New method.
6866
6867 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
6868
6869         * cs-parser.jay: Upgrade: yield now needs the return clause.
6870
6871 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
6872
6873         * cs-parser.jay : Renamed yyName to yyNames related to jay.
6874
6875 2003-09-29  Martin Baulig  <martin@ximian.com>
6876
6877         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
6878         inflated generic methods.
6879
6880         * generics.cs (ConstructedType): Distinguish between open and
6881         closed constructed types; correctly resolve the arguments.
6882
6883 2003-09-22  Martin Baulig  <martin@ximian.com>
6884
6885         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
6886         all type arguments meet their constraints.
6887
6888 2003-09-19  Martin Baulig  <martin@ximian.com>
6889
6890         * decl.cs (MemberCache.SetupCacheForInterface): Take a
6891         `MemberCache parent' argument.  Normally, an interface doesn't
6892         have a parent type except System.Object, but we use this in gmcs
6893         for generic type parameters.
6894
6895 2003-09-18  Martin Baulig  <martin@ximian.com>
6896
6897         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
6898         on `type.IsInterface'; don't check whether the type has a parent
6899         to determine whether it's an interface.
6900
6901 2003-09-17  Martin Baulig  <martin@ximian.com>
6902
6903         * generic.cs (ConstructedType.ToString): Always use `name' as the
6904         type name.
6905
6906 2003-09-15  Martin Baulig  <martin@ximian.com>
6907
6908         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
6909
6910         * generic.cs (Constraints.Resolve): New public method; this is
6911         called to resolve the constraint types and to check whether all
6912         the constraints are correct.
6913         (Constraints.Types): New public property.
6914         (TypeParameter.Resolve): New public method; resolves all the
6915         type's constraints.
6916
6917         * class.cs (TypeContainer.DefineType): Call
6918         TypeParameter.Resolve() before actually defining the type.
6919
6920 2003-09-15  Martin Baulig  <martin@ximian.com>
6921
6922         * class.cs (TypeContainer.DefineType): Added an error flag to
6923         avoid reporting duplicate CS0146's ("class definition is
6924         circular.").
6925
6926         * driver.cs (Driver.MainDriver): Abort if
6927         RootContext.ResolveTree() reported any errors.
6928
6929 2003-09-07  Martin Baulig  <martin@ximian.com>
6930
6931         * report.cs (Error, Warning): Added overloaded versions which take
6932         a `params object[] args' and call String.Format().
6933
6934 2003-09-07  Martin Baulig  <martin@ximian.com>
6935
6936         * decl.cs (DeclSpace..ctor): Don't call
6937         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
6938         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
6939         (DeclSpace.RecordDecl): New method.
6940
6941         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
6942
6943 2003-09-02  Ravi Pratap  <ravi@ximian.com>
6944
6945         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
6946         value attributes to be applied to ParameterBuilders.
6947
6948         * class.cs (MethodCore.LabelParameters): Make static and more
6949         generic so that it can be used from other places - like interface
6950         methods, for instance.
6951
6952         * interface.cs (Interface.Emit): Call LabelParameters before
6953         emitting attributes on the InterfaceMethod.
6954
6955 2003-09-07  Martin Baulig  <martin@ximian.com>
6956
6957         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
6958         if the number of type parameters doesn't match.
6959
6960 2003-09-04  Martin Baulig  <martin@ximian.com>
6961
6962         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
6963         for arrays of generic type params (ie. `!0[]').
6964
6965 2003-09-04  Martin Baulig  <martin@ximian.com>
6966
6967         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
6968         for the moment.
6969
6970 2003-09-04  Martin Baulig  <martin@ximian.com>
6971
6972         * decl.cs (DeclSpace.LookupGeneric): New method.
6973         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
6974         moment.
6975
6976         * generic.cs (TypeParameterExpr): Take a TypeParameter as
6977         argument, not just a string.
6978         (TypeParameter.Define): New public method; this is called to
6979         actually define the generic parameter; after this, you can use the
6980         new `Type' property to get the type.
6981
6982 2003-09-04  Martin Baulig  <martin@ximian.com>
6983
6984         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
6985         is now an ArrayList; initialize the result of the `TypeParameters'
6986         property here.
6987         (DeclSpace.GetGenericData): Removed.
6988         (DeclSpace.LookupGeneric): Temporarily removed; we need to
6989         implement this in a different way.
6990         (DeclSpace.GetTypeParameters): Removed; there's now a
6991         `TypeParameters' property.
6992         (DeclSpace.TypeParameters): New public property.
6993
6994         * generic.cs (Constraints): Make this class public.
6995         (TypeParameter): New public class.
6996
6997 2003-09-04  Martin Baulig  <martin@ximian.com>
6998
6999         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
7000         generic parameters.
7001
7002         * class.cs (TypeContainer.DefineType): Call
7003         TypeBuilder.DefineGenericParameter () on all generic parameters if
7004         this is a generic type.
7005
7006 2003-08-28  Martin Baulig  <martin@ximian.com>
7007
7008         * sample-stack.il: Compile this with ilasm: "ilasm /dll
7009         sample-stack.il".
7010
7011         * sample-hello.cs: Compile this with gmcs: "gmcs
7012         /r:sample-stack.dll sample-hello.cs".
7013
7014 2003-08-28  Martin Baulig  <martin@ximian.com>
7015
7016         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
7017         the parameters to the generic type.
7018
7019 2003-08-28  Martin Baulig  <martin@ximian.com>
7020
7021         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
7022
7023 2003-08-28  Martin Baulig  <martin@ximian.com>
7024
7025         * cs-parser.jay (opt_type_argument_list): Use
7026         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
7027         (primary_expression): Replace `qualified_identifier' with `type_name'.
7028         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
7029
7030         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
7031         parser to check whether it is syntactically a type parameter list;
7032         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
7033         this case.
7034
7035 2003-08-26  Martin Baulig  <martin@ximian.com>
7036
7037         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
7038         resolving aliases; fixes #47927.
7039
7040 2003-08-26  Martin Baulig  <martin@ximian.com>
7041
7042         * statement.cs (Using.DoResolve): This is internally emitting a
7043         try/finally clause, so we need to set ec.NeedExplicitReturn if we
7044         do not always return.  Fixes #47681.
7045
7046 2003-08-26  Martin Baulig  <martin@ximian.com>
7047
7048         * decl.cs (MemberCore): Moved WarningNotHiding(),
7049         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
7050         into MemberBase.
7051         (AdditionResult): Make this nested in DeclSpace.
7052         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
7053         argument; call NamespaceEntry.Define() unless we're nested in a
7054         class or struct.
7055
7056         * namespace.cs (Namespace.DefineName): New public function.  This
7057         is called from DeclSpace's .ctor to add 
7058         (Namespace.Lookup): Include DeclSpaces in the lookup.
7059
7060         * class.cs (Operator): Derive from MemberBase, not MemberCore.
7061
7062         * const.cs (Const): Derive from MemberBase, not MemberCore.     
7063
7064 2003-08-25  Martin Baulig  <martin@ximian.com>
7065
7066         * convert.cs (Convert.ExplicitReferenceConversion): When
7067         converting from an interface type to a class, unbox if the target
7068         type is a struct type.  Fixes #47822.
7069
7070 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7071
7072         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
7073         #47854.
7074
7075 2003-08-22  Martin Baulig  <martin@ximian.com>
7076
7077         * class.cs (TypeManager.DefineType): When defining a nested type,
7078         call DefineType() on our parent; fixes #47801.
7079
7080 2003-08-22  Martin Baulig  <martin@ximian.com>
7081
7082         * class.cs (MethodData.Define): While checking if a method is an
7083         interface implementation, improve the test a bit more to fix #47654.
7084
7085 2003-08-22  Martin Baulig  <martin@ximian.com>
7086
7087         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
7088         correctly; fixes #47722.
7089
7090 2003-08-22  Martin Baulig  <martin@ximian.com>
7091
7092         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
7093         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
7094
7095         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
7096
7097 2003-08-22  Martin Baulig  <martin@ximian.com>
7098
7099         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
7100         can only be assigned in static constructors.  Fixes #47161.
7101
7102 2003-08-22  Martin Baulig  <martin@ximian.com>
7103
7104         Rewrote and improved the flow analysis code.
7105
7106         * flowbranching.cs (FlowBranching): Make this class abstract.
7107         (FlowBranching.CreateBranching): New static function to create a
7108         new flow branching.
7109         (FlowBranchingBlock, FlowBranchingException): New classes.
7110         (FlowBranching.UsageVector.Type): New public readonly field.
7111         (FlowBranching.UsageVector.Breaks): Removed the setter.
7112         (FlowBranching.UsageVector.Returns): Removed the setter.
7113         (FlowBranching.UsageVector): Added Break(), Return(),
7114         NeverReachable() and Throw() methods to modify the reachability.
7115         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
7116         done by FlowBranching.Merge().
7117         (FlowBranching.UsageVector.MergeChild): New method; merges the
7118         merge result into the current vector.
7119         (FlowBranching.Merge): New abstract method to merge a branching.
7120
7121 2003-08-12  Martin Baulig  <martin@ximian.com>
7122
7123         * expression.cs (Indirection.CacheTemporaries): Create the
7124         LocalTemporary with the pointer type, not its element type.
7125
7126 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
7127
7128         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
7129         token was a keyword or not.
7130
7131         Add `error' options where an IDENTIFIER was expected;  Provide
7132         CheckToken and CheckIdentifierToken convenience error reporting
7133         functions. 
7134
7135         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
7136
7137         * decl.cs: Rename `NamespaceEntry Namespace' public field into
7138         NameSpaceEntry NameSpaceEntry.
7139
7140         (LookupInterfaceOrClass): Avoid creating a full qualified name
7141         from namespace and name: avoid doing lookups when we know the
7142         namespace is non-existant.   Use new Tree.LookupByNamespace which
7143         looks up DeclSpaces based on their namespace, name pair.
7144
7145         * driver.cs: Provide a new `parser verbose' to display the
7146         exception thrown during parsing.  This is turned off by default
7147         now, so the output of a failure from mcs is more graceful.
7148
7149         * namespace.cs: Track all the namespaces defined in a hashtable
7150         for quick lookup.
7151
7152         (IsNamespace): New method
7153
7154 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
7155
7156         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
7157         we know that we need to concatenate (full typename can never be
7158         null). 
7159
7160         * class.cs: ditto.
7161
7162         * statement.cs: Use a bitfield;  Do not initialize to null things
7163         which are done by the constructor by default.
7164
7165         * cs-parser.jay: bug fix, parameter was 4, not 3.
7166
7167         * expression.cs: Just use the property;
7168
7169         * statement.cs: No need for GetVariableInfo method.
7170
7171 2003-08-08  Martin Baulig  <martin@ximian.com>
7172
7173         * flowanalysis.cs (FlowReturns): This is now nested in the
7174         `FlowBranching' class.
7175         (MyBitVector): Moved this here from statement.cs.
7176         (FlowBranching.SiblingType): New enum type.
7177         (FlowBranching.CreateSibling): Added `SiblingType' argument.
7178
7179 2003-08-07  Martin Baulig  <martin@ximian.com>
7180
7181         * flowanalysis.cs (FlowBranchingType): This is now nested in the
7182         `FlowBranching' class and called `BranchingType'.
7183
7184 2003-08-07  Martin Baulig  <martin@ximian.com>
7185
7186         * flowanalysis.cs: Moved all the control flow analysis code into
7187         its own file.
7188
7189 2003-08-07  Martin Baulig  <martin@ximian.com>
7190
7191         * assign.cs (Assign.DoResolve): `target' must either be an
7192         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
7193         #37319.
7194
7195 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
7196
7197         * expression.cs (BinaryMethod): This kind of expression is created by the
7198         Binary class if it determines that the operator has to be handled
7199         by a method.
7200
7201         (BinaryDelegate): This kind of expression is created if we are
7202         dealing with a + or - operator on delegates.
7203
7204         (Binary): remove method, argumetns, and DelegateOperator: when
7205         dealing with methods, 
7206
7207         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
7208
7209         * statement.cs (Block): use bitfields for the three extra booleans
7210         we had in use.   Remove unused topblock parameter.
7211
7212         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
7213
7214         * assign.cs: Drop extra unneeded tests.
7215
7216 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
7217
7218         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
7219
7220         * statement.cs (Foreach): Use VariableStorage instead of
7221         LocalBuilders.   
7222
7223         * codegen.cs (VariableStorage): New class used by clients that
7224         require a variable stored: locals or fields for variables that
7225         need to live across yield.
7226
7227         Maybe provide a convenience api for EmitThis+EmitLoad?
7228
7229         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
7230         these bad boys.
7231
7232 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
7233
7234         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
7235         RemapParameterLValue): New methods that are used to turn a
7236         precomputed FieldInfo into an expression like this:
7237
7238                 instance.FieldInfo
7239
7240         The idea is to use this instead of making LocalVariableReference
7241         have more than one meaning.
7242
7243         * cs-parser.jay: Add error production to BASE.
7244
7245         * ecore.cs: Deal with TypeManager.GetField returning null, which
7246         is now a valid return value.
7247
7248         (FieldExprNoAddress): New expression for Fields whose address can
7249         not be taken.
7250
7251         * expression.cs (LocalVariableReference): During the resolve
7252         phases, create new expressions if we are in a remapping context.
7253         Remove code that dealt with remapping here.
7254
7255         (ParameterReference): same.
7256
7257         (ProxyInstance): New expression, like the `This' expression, but
7258         it is born fully resolved.  We know what we are doing, so remove
7259         the errors that are targeted to user-provided uses of `this'.
7260
7261         * statement.cs (Foreach): our variable is now stored as an
7262         Expression;  During resolution, follow the protocol, dont just
7263         assume it will return this.
7264
7265 2003-08-06  Martin Baulig  <martin@ximian.com>
7266
7267         * support.cs (SeekableStreamReader.cs): New public class.
7268
7269         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
7270         SeekableStreamReader instead of the normal StreamReader.
7271
7272 2003-08-04  Martin Baulig  <martin@ximian.com>
7273
7274         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
7275         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
7276         deambiguate casts and delegate invocations.
7277         (parenthesized_expression): Use the new tokens to ensure this is
7278         not a cast of method invocation.
7279
7280         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
7281         when reading a `)' and Deambiguate_CloseParens () was previously
7282         called.
7283
7284         * expression.cs (ParenthesizedExpression): New class.  This is
7285         just used for the CS0075 test.
7286         (Binary.DoResolve): Check for CS0075.   
7287
7288 2003-07-29  Ravi Pratap  <ravi@ximian.com>
7289
7290         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
7291         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
7292         reference comparison.
7293
7294         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
7295         examine the ReturnType for equality - this is necessary in the
7296         cases of implicit and explicit operators whose signature also
7297         includes the return type.
7298
7299 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
7300
7301         * namespace.cs: Cache the result of the namespace computation,
7302         instead of computing it every time.
7303
7304 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
7305
7306         * decl.cs: Use a global arraylist that we reuse over invocations
7307         to avoid excesive memory consumption.  Reduces memory usage on an
7308         mcs compile by one meg (45 average).
7309
7310         * typemanager.cs (LookupTypeReflection): In .NET pointers are
7311         private, work around that.
7312
7313 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
7314
7315         * literal.cs (IntLiteral): Define Zero and One static literals. 
7316
7317         * cs-parser.jay (integer_literal): use static literals to reduce
7318         memory usage for the most used literals (0, 1 and -1).  211kb
7319         reduced in memory usage.
7320
7321         Replace all calls to `new ArrayList' with `new
7322         ArrayList(4)' which is a good average number for most allocations,
7323         and also requires only 16 bytes of memory for its buffer by
7324         default. 
7325
7326         This reduced MCS memory usage in seven megabytes for the RSS after
7327         bootstrapping.
7328
7329 2003-07-28  Ravi Pratap  <ravi@ximian.com>
7330
7331         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
7332         handle params methods the correct way by forming only one
7333         applicable set with params and normal methods in them. Earlier we
7334         were looking at params methods only if we found no normal methods
7335         which was not the correct thing to do.
7336
7337         (Invocation.BetterFunction): Take separate arguments indicating
7338         when candidate and the best method are params methods in their
7339         expanded form.
7340
7341         This fixes bugs #43367 and #46199.
7342
7343         * attribute.cs: Documentation updates.
7344
7345         (CheckAttribute): Rename to CheckAttributeTarget.
7346         (GetValidPlaces): Rename to GetValidTargets.
7347
7348         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
7349         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
7350
7351         Fixes bug #44468.
7352
7353 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
7354
7355         * codegen.cs: Compute IsGeneric correctly.
7356
7357         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
7358         resolution. 
7359
7360         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
7361         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
7362         regressions, and I was chasing more bugs than I required.
7363
7364         * interface.cs: Use expressions for base type names (like classes
7365         and structs have been doing for a while now), and resolve that.
7366         This patch should probably go into head as well.
7367
7368         This makes it one less user of FindType.
7369
7370 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
7371
7372         This compiler can not self host currently.  Need to fix that.
7373         
7374         * Makefile: compile to `gmcs.exe'
7375
7376         * driver.cs: Turn on v2 by default on gmcs.
7377
7378         * generic.cs (ConstructedType): Does no longer take a container
7379         type argument;  That will be taken care of later.
7380
7381         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
7382         Use SimpleName to resolve for now, so we can continue the work on
7383         the parser, until we get Type.GetType that understands generics.
7384
7385         (ConstructedType.ToString): Implement
7386
7387         (TypeArguments.Resolve): Resolve the child expressions as types. 
7388         
7389         * cs-parser.jay: Rename interface_constraints to
7390         type_parameter_constraints
7391
7392         (namespace_or_type_name): Only use constructed types for the basic
7393         construction, we will deal with identifier<...> later.
7394
7395         (type/type_name): No longer call DecomposeQI, as
7396         namespace_or_type_name is always decoded now.
7397         
7398 2003-07-22  Ravi Pratap  <ravi@ximian.com>
7399
7400         * expression.cs (Invocation.OverloadResolve): Follow the spec more
7401         closely: we eliminate methods in base types when we have an
7402         applicable method in a top-level type.
7403
7404         Please see section 14.5.5.1 for an exact description of what goes
7405         on. 
7406
7407         This fixes bug #45127 and a host of other related to corlib compilation.
7408
7409         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
7410         array is the method corresponding to the top-level type (this is
7411         because of the changes made to icall.c) so we change this
7412         accordingly.
7413
7414         (MethodGroupExpr.Name): This too.
7415
7416         * typemanager.cs (GetElementType): New method which does the right
7417         thing when compiling corlib. 
7418
7419         * everywhere: Make use of the above in the relevant places.
7420
7421 2003-07-22  Martin Baulig  <martin@ximian.com>
7422
7423         * cs-parser.jay (invocation_expression): Moved
7424         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
7425         `cast_expression', but create a InvocationOrCast which later
7426         resolves to either an Invocation or a Cast.
7427
7428         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
7429         method; call this before EmitStatement() to make sure that this
7430         expression can be used as a statement.
7431
7432         * expression.cs (InvocationOrCast): New class; resolves to either
7433         an Invocation or a Cast.
7434
7435         * statement.cs (StatementExpression): Call ResolveStatement() on
7436         the ExpressionStatement before emitting it.
7437
7438 2003-07-21  Martin Baulig  <martin@ximian.com>
7439
7440         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
7441         `ref' and `out' attributes match; fixes #46220.
7442         (MemberAccess.ResolveMemberAccess): You can't reference a type
7443         through an expression; fixes #33180.
7444         (Indexers.GetIndexersForType): Don't return the indexers from
7445         interfaces the class implements; fixes #46502.
7446
7447 2003-07-21  Martin Baulig  <martin@ximian.com>
7448
7449         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
7450         CS0661 checks; fixes bug #30442.
7451
7452 2003-07-21  Martin Baulig  <martin@ximian.com>
7453
7454         * decl.cs (AdditionResult): Added `Error'.
7455
7456         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
7457
7458         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
7459         cs0031.cs actually work.
7460
7461  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
7462  
7463         * cs-parser.jay (namespace_name): do not use
7464         namespace_or_type_name, use qualified_identifier, because
7465         namespace_or_type_name will soon return a composed expression
7466         instead of a string.
7467  
7468         (namespace_or_type_name): Instead of returning a string, now this
7469         production returns an expression.
7470  
7471         * codegen.cs (EmitContext): Setup IsGeneric property based on
7472         whether our DeclSpace is generic, our the method is generic.
7473  
7474         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
7475         the method is generic.
7476  
7477         * cs-parser.jay (type_arguments, opt_type_argument_list,
7478         type_parameters, type_parameter_list, opt_type_parameter_list,
7479         type_parameter,, opt_type_parameter_constraints_clauses,
7480         type_parameter_constraints_clauses,
7481         type_parameter_constraint_clause, type_parameter_constraint,
7482         interface_constraints): Add new production
7483  
7484         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
7485         DeclSpace is generic or not.
7486  
7487         (DeclSpace.SetParameterInfo): New routine, used to set the
7488         parameter info for a type.
7489  
7490         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
7491         returns a GenericTypeExpr
7492  
7493         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
7494         generic, lookup the generic argument.
7495  
7496         * attribute.cs: Do not allow TypeParameterExpressions in
7497         Attributes.
7498  
7499         * class.cs: Do not allow the Main method to be defined in a
7500         Generic container.
7501  
7502         * expression.cs (SizeOf): Do not allow generic types to be used as
7503         arguments to sizeof.
7504  
7505         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
7506         it: whether a type is generic or not.  Only works for types we are
7507         currently building for now.
7508         
7509 2003-07-20  Martin Baulig  <martin@ximian.com>
7510
7511         * namespace.cs: Fixed that bug which caused a crash when compiling
7512         the debugger's GUI.
7513
7514 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
7515
7516         * typemanager.cs (LookupTypeReflection): Never expose types which
7517         are NotPublic, NestedPrivate, NestedAssembly, or
7518         NestedFamANDAssem.  We used to return these, and later do a check
7519         that would report a meaningful error, but the problem is that we
7520         would not get the real match, if there was a name override.
7521
7522 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
7523
7524         * namespace.cs (Namespace, Name): Do not compute the namespace
7525         name dynamically, compute it in the constructor.  This reduced
7526         memory usage by 1697 KB.
7527
7528         * driver.cs: Use --pause to pause at the end.
7529
7530 2003-07-17  Peter Williams  <peter@newton.cx>
7531
7532         * Makefile: Change the name of the test target so that it doesn't
7533         conflict with the recursive test target.
7534
7535 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
7536
7537         * expression.cs (LocalVariableReference.Emit, EmitAssign,
7538         AddressOf): Do not use EmitThis, that was wrong, use the actual
7539         this pointer.
7540
7541 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
7542
7543         * class.cs (MethodData.Define): While checking if a method is an
7544         interface implementation, improve the test: If we are not public
7545         (use new test here: use the computed MethodAttributes directly,
7546         instead of the parsed modifier flags) check if the `implementing'
7547         method comes from an interface or not.
7548
7549         * pending.cs (VerifyPendingMethods): Slightly better error
7550         message.
7551
7552         * makefile: add test target that does the mcs bootstrap.
7553
7554 2003-07-16  Ravi Pratap  <ravi@ximian.com>
7555
7556         * interface.cs (Define): Do nothing here since there are no
7557         members to populate etc. Move the attribute emission out of here
7558         since this was just totally the wrong place to put it. Attribute
7559         application happens during the 'Emit' phase, not in the 'Define'
7560         phase.
7561
7562         (Emit): Add this method and move the attribute emission here
7563
7564         * rootcontext.cs (EmitCode): Call the Emit method on interface
7565         types too.
7566
7567 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
7568
7569         * expression.cs (OverloadResolve): Report error only if Location
7570         is not 'Null' which means that there was a probe going on.
7571
7572 2003-07-14  Martin Baulig  <martin@ximian.com>
7573
7574         * expression.cs (ConditionalLogicalOperator): New public class to
7575         implement user defined conditional logical operators.
7576         This is section 14.11.2 in the spec and bug #40505.
7577
7578 2003-07-14  Martin Baulig  <martin@ximian.com>
7579
7580         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
7581
7582 2003-07-14  Martin Baulig  <martin@ximian.com>
7583
7584         * codegen.cs (EmitContext.InFixedInitializer): New public field.
7585
7586         * ecore.cs (IVariable.VerifyFixed): New interface method.
7587
7588         * expression.cs (Unary.ResolveOperator): When resolving the `&'
7589         operator, check whether the variable is actually fixed.  Fixes bug
7590         #36055.  Set a variable definitely assigned when taking its
7591         address as required by the spec.
7592
7593         * statement.cs (LocalInfo.IsFixed): New field.
7594         (LocalInfo.MakePinned): Set `IsFixed' to true.
7595
7596 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
7597
7598         * attribute.cs (Attribute.Resolve): While doing a Member lookup
7599         for .ctors, ensure that we only ask for members declared in the
7600         attribute type (BindingFlags.DeclaredOnly).
7601
7602         Fixes bug #43632.
7603
7604         * expression.cs (Error_WrongNumArguments): Report error 1501
7605         correctly the way CSC does.
7606
7607 2003-07-13  Martin Baulig  <martin@ximian.com>
7608
7609         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
7610         lookup on the fully qualified name, to make things like "X.X" work
7611         where "X.X" is a fully qualified type name, but we also have a
7612         namespace "X" in the using list.  Fixes #41975.
7613
7614 2003-07-13  Martin Baulig  <martin@ximian.com>
7615
7616         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
7617         function. If we're a CompoundAssign, we need to create an embedded
7618         CompoundAssign, not an embedded Assign.
7619         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
7620         Fixes #45854.
7621
7622 2003-07-13  Martin Baulig  <martin@ximian.com>
7623
7624         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
7625         work to fix bug #46088.
7626
7627 2003-07-13  Ravi Pratap <ravi@ximian.com>
7628
7629         * class.cs (Operator.Emit): Do not emit attributes here - it is
7630         taken care of by the Method class that we delegate too. This takes
7631         care of bug #45876.
7632
7633 2003-07-10  Martin Baulig  <martin@ximian.com>
7634
7635         * expression.cs (TypeOfVoid): New class.
7636         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
7637
7638 2003-07-10  Martin Baulig  <martin@ximian.com>
7639
7640         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
7641         bug #35957.
7642
7643 2003-07-10  Martin Baulig  <martin@ximian.com>
7644
7645         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
7646         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
7647
7648         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
7649
7650         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
7651
7652 2003-07-10  Martin Baulig  <martin@ximian.com>
7653
7654         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
7655         of decimal.  Fixes #42850.
7656
7657         NOTE: I also fixed the created byte blob, but this doesn't work on
7658         the MS runtime and csc never produces any byte blobs for decimal
7659         arrays.
7660
7661 2003-07-10  Martin Baulig  <martin@ximian.com>
7662
7663         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
7664         structs; fixes #32068.
7665         (Block.AddChildVariableNames): Fixed #44302.
7666
7667 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7668
7669         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
7670
7671 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
7672
7673         * attribute.cs: And this test is onger needed.
7674
7675 2003-07-08  Martin Baulig  <martin@ximian.com>
7676
7677         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
7678         inaccessible types.  Fixes #36313.
7679
7680         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
7681
7682         * namespace.cs (NamespaceEntry): Create implicit entries for all
7683         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
7684         implicit entries for N1.N2 and N1.
7685
7686 2003-07-08  Martin Baulig  <martin@ximian.com>
7687
7688         Rewrote the handling of namespaces to fix a lot of the issues
7689         wrt. `using' aliases etc.
7690
7691         * namespace.cs (Namespace): Splitted this class into a
7692         per-assembly `Namespace' and a per-file `NamespaceEntry'.
7693
7694         * typemanager.cs (TypeManager.IsNamespace): Removed.
7695         (TypeManager.ComputeNamespaces): Only compute namespaces from
7696         loaded assemblies here, not the namespaces from the assembly we're
7697         currently compiling.
7698
7699 2003-07-08  Martin Baulig  <martin@ximian.com>
7700
7701         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
7702
7703 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
7704
7705         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
7706         already fixed it.  
7707
7708         I thought about the memory savings here, but LookupTypeReflection
7709         is used under already very constrained scenarios.  Compiling
7710         corlib or mcs only exposes one hit, so it would not really reduce
7711         any memory consumption.
7712
7713 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7714
7715         * typemanager.cs: fixes bug #45889 by only adding public types from
7716         other assemblies to the list of known types.
7717
7718 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
7719
7720         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
7721         on the type we resolved.
7722
7723 2003-07-05  Martin Baulig  <martin@ximian.com>
7724
7725         * pending.cs (PendingImplementation.ParentImplements): Don't
7726         create the proxy if the parent is abstract.
7727
7728         * class.cs (TypeContainer.DefineIndexers): Process explicit
7729         interface implementations first.  Fixes #37714.
7730
7731 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
7732
7733         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
7734         defined recursively;  but since we modify the input parameters
7735         (left is set to `this' temporarily), we reset this value if the
7736         left_is_explicit is false, which gives the original semantics to
7737         the code.  
7738
7739         * literal.cs (NullPointer): new class used to represent a null
7740         literal in a pointer context.
7741
7742         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
7743         type is a pointer, use a NullPointer object instead of a
7744         NullLiteral.   Closes 43687
7745
7746         (ExplicitConversion): Convert pointer values using
7747         the conv opcode to the proper type.
7748
7749         * ecore.cs (New): change ValueTypeVariable property into a method,
7750         that returns whether the valuetype is suitable for being used.
7751
7752         * expression.cs (Binary.DoNumericPromotions): Only return if we
7753         the int constant was a valid uint, and we can return both left and
7754         right as uints.  If not, we continue processing, to trigger the
7755         type conversion.  This fixes 39018.
7756
7757         * statement.cs (Block.EmitMeta): During constant resolution, set
7758         the CurrentBlock property on the emitcontext, so that we resolve
7759         constants propertly.
7760
7761 2003-07-02  Martin Baulig  <martin@ximian.com>
7762
7763         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
7764         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
7765
7766         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
7767         than emitting it here.
7768
7769         * statement.cs: Fixed some more flow analysis bugs.
7770
7771 2003-07-02  Martin Baulig  <martin@ximian.com>
7772
7773         * class.cs (MethodData.Define): When implementing interface
7774         methods, set Final unless we're Virtual.
7775
7776         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
7777         check work for interface methods.
7778
7779 2003-07-01  Martin Baulig  <martin@ximian.com>
7780
7781         * ecore.cs (EmitContext.This): Replaced this property with a
7782         GetThis() method which takes a Location argument.  This ensures
7783         that we get the correct error location for a CS0188.
7784
7785 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
7786
7787         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
7788         ImplicitStandardConversion.
7789
7790         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
7791
7792 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
7793
7794         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
7795         optimization.
7796
7797 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
7798
7799         * class.cs (Constructor.Define): Turn off initlocals for unsafe
7800         constructors.
7801
7802         (MethodData.Define): Turn off initlocals for unsafe methods.
7803
7804 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
7805
7806         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
7807         complete;  Fixes #37521.
7808
7809         * delegate.cs: Use Modifiers.TypeAttr to compute the
7810         TypeAttributes, instead of rolling our own.  This makes the flags
7811         correct for the delegates.
7812
7813 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
7814
7815         * class.cs (Constructor.Define): Set the private flag for static
7816         constructors as well.
7817
7818         * cs-parser.jay (statement_expression): Set the return value to
7819         null, to avoid a crash when we catch an error.
7820
7821 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
7822
7823         * cs-parser.jay: Applied patch from Jackson that adds support for
7824         extern and unsafe modifiers to destructor declarations.
7825
7826         * expression.cs: Report error 21 if the user is trying to index a
7827         System.Array.
7828
7829         * driver.cs: Add an error message, suggested by the bug report.
7830
7831         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
7832         if we do not have a ": this ()" constructor initializer.  Fixes 45149
7833
7834 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
7835
7836         * namespace.cs: Add some information to reduce FAQs.
7837
7838 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
7839
7840         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
7841         underlying enumeration types.  Fixes #43915.
7842
7843         * expression.cs: Treat ushort/short as legal values to be used in
7844         bitwise operations.
7845
7846 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
7847
7848         * delegate.cs: transfer custom attributes for paramenters from
7849         the delegate declaration to Invoke and BeginInvoke.
7850
7851 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
7852
7853         * attribute.cs: handle custom marshalers and emit marshal info
7854         for fields, too.
7855
7856 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
7857
7858         * makefile.gnu: Added anonymous.cs to the compiler sources.
7859
7860 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
7861
7862         * iterators.cs: Change the name of the proxy class to include two
7863         underscores.
7864
7865         * cs-parser.jay: Update grammar to include anonymous methods.
7866
7867         * anonymous.cs: new file.
7868
7869 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
7870
7871         * class.cs (Field.Define): Add missing test for pointers and
7872         safety. 
7873
7874 2003-05-27  Ravi Pratap  <ravi@ximian.com>
7875
7876         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
7877         we use the stobj opcode.
7878
7879         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
7880         since it wasn't the correct fix. 
7881
7882         It still is puzzling that we are required to use stobj for IntPtr
7883         which seems to be a ValueType.
7884
7885 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
7886
7887         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
7888         during regular simple name resolution.   Now, the trick is that
7889         instead of returning for processing the simplename, we do a
7890         TypeManager.LookupType (ie, a rooted lookup as opposed to a
7891         contextual lookup type).   If a match is found, return that, if
7892         not, return for further composition.
7893
7894         This fixes long-standing 30485.
7895
7896         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
7897         using the address to initialize an object, do an Stobj instead of
7898         using the regular Stelem.
7899
7900         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
7901         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
7902         Because if we are a BaseIndexerAccess that value will be true.
7903         Fixes 43643.
7904
7905         * statement.cs (GotoCase.Resolve): Return after reporting an
7906         error, do not attempt to continue. 
7907
7908         * expression.cs (PointerArithmetic.Emit): If our operand is a
7909         long, convert our constants to match the operand before
7910         multiplying.  Convert to I type before adding.   Fixes 43670.
7911
7912 2003-05-14  Ravi Pratap  <ravi@ximian.com>
7913
7914         * enum.cs (ImplicitConversionExists) : Rename to
7915         ImplicitEnumConversionExists to remove ambiguity. 
7916
7917         * ecore.cs (NullCast): New type of cast expression class which
7918         basically is very similar to EmptyCast with the difference being
7919         it still is a constant since it is used only to cast a null to
7920         something else
7921         (eg. (string) null)
7922
7923         * convert.cs (ImplicitReferenceConversion): When casting a null
7924         literal, we return a NullCast.
7925
7926         * literal.cs (NullLiteralTyped): Remove - I don't see why this
7927         should be around anymore.
7928
7929         The renaming (reported was slightly wrong). Corrections:
7930
7931         ConvertImplicitStandard -> ImplicitConversionStandard
7932         ConvertExplicitStandard -> ExplicitConversionStandard
7933
7934         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
7935         before passing them in !
7936
7937         * convert.cs (ImplicitConversionStandard): When comparing for
7938         equal expr and target types, ensure that expr is not a
7939         NullLiteral.
7940
7941         In general, we must not be checking (expr_type ==
7942         target_type) in the top level conversion methods
7943         (ImplicitConversion, ExplicitConversion etc). This checking is
7944         done in the methods that they delegate to.
7945
7946 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
7947
7948         * convert.cs: Move Error_CannotConvertType,
7949         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
7950         ImplicitNumericConversion, ImplicitConversionExists,
7951         ImplicitUserConversionExists, StandardConversionExists,
7952         FindMostEncompassedType, FindMostSpecificSource,
7953         FindMostSpecificTarget, ImplicitUserConversion,
7954         ExplicitUserConversion, GetConversionOperators,
7955         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
7956         TryImplicitIntConversion, Error_CannotConvertImplicit,
7957         ConvertImplicitRequired, ConvertNumericExplicit,
7958         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
7959         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
7960         its own file.
7961
7962         Perform the following renames:
7963
7964         StandardConversionExists -> ImplicitStandardConversionExists
7965         ConvertImplicit -> ImplicitConversion
7966         ConvertImplicitStandard -> ImplicitStandardConversion
7967         TryImplicitIntConversion -> ImplicitIntConversion
7968         ConvertImplicitRequired -> ImplicitConversionRequired
7969         ConvertNumericExplicit -> ExplicitNumericConversion
7970         ConvertReferenceExplicit -> ExplicitReferenceConversion
7971         ConvertExplicit -> ExplicitConversion
7972         ConvertExplicitStandard -> ExplicitStandardConversion
7973
7974 2003-05-19  Martin Baulig  <martin@ximian.com>
7975
7976         * statement.cs (TypeInfo.StructInfo): Made this type protected.
7977         (TypeInfo): Added support for structs having structs as fields.
7978
7979         * ecore.cs (FieldExpr): Implement IVariable.
7980         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
7981         VariableInfo for the field.
7982
7983 2003-05-18  Martin Baulig  <martin@ximian.com>
7984
7985         * expression.cs (This.DoResolve): Report a CS0027 if we're
7986         emitting a field initializer.
7987
7988 2003-05-18  Martin Baulig  <martin@ximian.com>
7989
7990         * expression.cs (This.ResolveBase): New public function.
7991         (This.DoResolve): Check for CS0188.
7992
7993         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
7994         This.Resolve().
7995
7996         * ecore.cs (MethodGroupExpr.DoResolve): Set the
7997         `instance_expression' to null if we don't have any non-static
7998         methods.
7999
8000 2003-05-18  Martin Baulig  <martin@ximian.com>
8001
8002         Reworked the way how local variables and parameters are handled by
8003         the flow analysis code.
8004
8005         * statement.cs (TypeInfo, VariableMap): New public classes.
8006         (VariableInfo): New public class.  This is now responsible for
8007         checking whether a variable has been assigned.  It is used for
8008         parameters and local variables.
8009         (Block.EmitMeta): Take the InternalParameters as argument; compute
8010         the layout of the flow vectors here.
8011         (Block.LocalMap, Block.ParameterMap): New public properties.
8012         (FlowBranching): The .ctor doesn't get the InternalParameters
8013         anymore since Block.EmitMeta() now computes the layout of the flow
8014         vector.
8015         (MyStructInfo): This class is now known as `StructInfo' and nested
8016         in `TypeInfo'; we don't access this directly anymore.
8017
8018         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
8019         property and removed IsAssigned(), IsFieldAssigned(),
8020         SetAssigned() and SetFieldAssigned(); we now call them on the
8021         VariableInfo so we don't need to duplicate this code everywhere.
8022
8023         * expression.cs (ParameterReference): Added `Block block' argument
8024         to the .ctor.
8025         (LocalVariableReference, ParameterReference, This): The new
8026         VariableInfo class is now responsible for all the definite
8027         assignment stuff.
8028
8029         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
8030         IsParameterAssigned, SetParameterAssigned): Removed.
8031
8032 2003-05-18  Martin Baulig  <martin@ximian.com>
8033
8034         * typemanager.cs (InitCoreTypes): Try calling
8035         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
8036         the 3-args-version.  Corlib now also needs our `void_type'.
8037         (GetMethod): Added overloaded version which takes an optional
8038         `bool report_errors' to allow lookups of optional methods.
8039
8040 2003-05-12  Martin Baulig  <martin@ximian.com>
8041
8042         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
8043         only used for locals and not for parameters.
8044
8045 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
8046
8047         * support.cs (InternalParameters.ParameterType): Return the
8048         ExternalType of the parameter.
8049
8050         * parameter.cs (Parameter.ExternalType): drop the two arguments,
8051         they were unused.
8052
8053 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
8054
8055         * class.cs (MethodData.Define): Do not set the `newslot' on
8056         interface members, if they are also flagged as "override".
8057
8058         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
8059         better code for ++i and i++.  This only works for static fields
8060         and local variables.
8061
8062         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
8063         want to pull the DeclSpace out of the builder_to_declspace instead
8064         of the TypeBuilder (like in TypeContainer.FindMembers).
8065
8066         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
8067         instead of LookupTypeContainer.  Fixes the crash on .NET for
8068         looking up interface members.
8069
8070         * const.cs: Create our own emit context during the Definition
8071         stage, so that constants are evaluated in the proper context, when
8072         a recursive definition happens.
8073
8074 2003-05-11  Martin Baulig  <martin@ximian.com>
8075
8076         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
8077         new block for a switch section.
8078         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
8079         the adding/lookup in the switch block.  Fixes #39828.
8080
8081 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
8082
8083         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
8084         functionality: I needed to convert the data after I had performed
8085         the add/sub operation into the operands type size.
8086
8087         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
8088         pass the type for the box operation, otherwise the resulting
8089         object would have been of type object.
8090
8091         (BoxedCast): Add constructor to specify the type to box as.
8092
8093 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
8094
8095         * iterators.cs: I was reusing the `count' variable inadvertently,
8096         take steps to not allow this to happen.
8097
8098 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
8099
8100         * attribute.cs (Attribute.Resolve): Params attributes are encoded
8101         by creating an array at the point where the params starts and
8102         putting all those arguments there, then adjusting the size of the
8103         array.
8104
8105 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
8106
8107         * expression.cs (New.AddressOf): Implement interface
8108         IMemoryLocation.  This is used when the `new' operator is used in
8109         the context of an invocation to a method on a value type.
8110
8111         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
8112         example. 
8113
8114         * namespace.cs: Also check the using aliases here.
8115
8116         * driver.cs: Move the test for using validity after the types have
8117         been entered, so we do a single pass that also includes the using
8118         aliases. 
8119
8120         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
8121         in the regular case.   CreateSiblingForFinally is doing extra
8122         error checking.
8123
8124         * attribute.cs (GetAttributeArgumentExpression): Store the result
8125         on an out value, and use the return value to indicate failure
8126         instead of using null (which is a valid return for Constant.GetValue).
8127
8128         * statement.cs: Perform the analysis flow for the increment
8129         portion after the statement, because this will be the real flow of
8130         execution.  Fixes #42385
8131
8132         * codegen.cs (EmitContext.EmitArgument,
8133         EmitContext.EmitStoreArgument): New helper functions when the
8134         RemapToProxy flag is set.
8135
8136         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
8137         function.
8138
8139         Add support for remapping parameters. 
8140
8141         * iterators.cs: Propagate parameter values;  Store parameter
8142         values in the proxy classes.
8143
8144 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
8145
8146         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
8147         need a proxy reference;  I do not know what I was thinking
8148
8149         * cs-parser.jay (constructor_initializer): catch another error,
8150         and display nice message.
8151
8152         (field_declaration): catch void field declaration
8153         to flag a better error. 
8154
8155         * class.cs (MemberBase.CheckBase): Report an error instead of a
8156         warning if a new protected member is declared in a struct. 
8157         (Field.Define): catch the error of readonly/volatile.
8158
8159         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
8160
8161         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
8162         volatile variable is taken
8163
8164 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
8165
8166         * statement.cs (Fixed.Resolve): Report an error if we are not in
8167         an unsafe context.
8168
8169 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
8170
8171         * typemanager.cs: reuse the code that handles type clashes for
8172         delegates and enumerations.
8173
8174         * class.cs (Report28): Always report.
8175
8176         * expression.cs (EncodeAsAttribute): Allow nulls here.
8177
8178 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
8179
8180         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
8181         the functionality for testing whether an expression is valid for
8182         an attribute here.  Also handle the case of arrays of elements
8183         being stored. 
8184
8185         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
8186         encoding a linear array into an array of objects that are suitable
8187         to be passed to an CustomAttributeBuilder.
8188
8189         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
8190
8191         * ecore.cs: (FieldExpr): Handle field remapping here.
8192
8193         * iteratators.cs: Pass the instance variable (if the method is an
8194         instance method) to the constructors, so we can access the field
8195         variables on the class.
8196
8197         TODO: Test this with structs.  I think the THIS variable on
8198         structs might have to be a pointer, and not a refenrece
8199
8200 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
8201
8202         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
8203         local variables to fields in a proxy class.
8204
8205         * iterators.cs (PopulateProxy): Rename our internal fields to
8206         <XXX>.  
8207         Create a <THIS> field if we are an instance method, so we can
8208         reference our parent container variables.
8209         (MapVariable): Called back from the EmitContext code to enter a
8210         new variable to field mapping into the proxy class (we just create
8211         a FieldBuilder).
8212
8213         * expression.cs
8214         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
8215         for using the remapped locals to fields.
8216
8217         I placed the code here, because that gives the same semantics to
8218         local variables, and only changes the Emit code.
8219
8220         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
8221         statements inside iterators.
8222         (VariableInfo): Add a FieldBuilder for the cases when we are
8223         remapping local variables to fields in a proxy class
8224
8225         * ecore.cs (SimpleNameResolve): Avoid testing two times for
8226         current_block != null.
8227
8228         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
8229         not cope with strings, as it has been moved to the
8230         TableSwitchEmit.  Fixed bug in switch generation.
8231
8232         * expression.cs (New.DoResolve): Provide more context for the user
8233         when reporting an error.
8234
8235         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
8236         pointers. 
8237
8238         * expression.cs (MemberAccess.DoResolve): When we get a type back,
8239         check the permissions for it.  Note than in a type-resolution
8240         context the check was already present in DeclSpace.ResolveType,
8241         but was missing from the MemberAccess.
8242
8243         (ArrayCreation.CheckIndices): warn if the user has
8244         more nested levels of expressions, but there are no more
8245         dimensions specified.  Avoids crash on bug 41906.
8246
8247 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
8248
8249         * statement.cs (Block): replace Implicit bool, for a generic
8250         flags.   
8251         New flag: `Unchecked'.  This is used during the EmitMeta phase
8252         (which is out-of-line with the regular Resolve/Emit process for a
8253         statement, as this is done ahead of time, but still gets a chance
8254         to call constant resolve).
8255
8256         (Block.Flags): new enum for adding a new flag.
8257
8258         (Block.EmitMeta): track the state of unchecked.
8259
8260         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
8261         to enable constant resolution to work there as well.
8262
8263 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
8264
8265         * typemanager.cs (ienumerable_type): Also look up
8266         System.Collections.IEnumerable. 
8267
8268 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
8269
8270         TODO: Test more than one conditional per method.
8271
8272         * class.cs (Indexer.Define): Report the location where the user is
8273         referencing the unsupported feature.
8274
8275         (MethodData): Overload the use of `conditionals' to
8276         minimize the creation of needless ArrayLists.   This saves roughly
8277         212kb on my machine.
8278
8279         (Method): Implement the new IIteratorContainer interface.
8280         (Method.SetYields): Implement the method by setting the ModFlags
8281         to contain METHOD_YIELDS.
8282
8283         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
8284         which just got set to null.
8285
8286         * iterators.cs: New file.
8287
8288         (Yield, YieldBreak): New statements.
8289
8290         * statement.cs (Return.Resolve): Flag an error if we are used in
8291         an iterator method.
8292
8293         * codegen.cs (InIterator): New flag set if the code is being
8294         compiled in an iterator method.
8295
8296         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
8297         internal modifier, and we just use it to avoid adding extra
8298         fields, as this is seldom used.  
8299
8300         * cs-parser.jay: Add yield_statement (yield and yield break).
8301
8302         * driver.cs: New flag -v2 to turn on version 2 features. 
8303
8304         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
8305         hashtable when v2 is enabled.
8306
8307 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
8308
8309         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
8310         there is already a namespace defined with this name.
8311
8312         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
8313         people upgraded their corlibs.
8314
8315         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
8316         always use fully qualified types, no need to use the compiler
8317         front end.
8318
8319         (TypeManager.IsNamespace): Use binarysearch.
8320
8321         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
8322         AddDelegate): I did not quite use the new IsValid API properly: I
8323         have to pass the short-name and the fullname.  I was passing only
8324         the basename instead of the fullname sometimes. 
8325
8326         (TypeContainer.DefineType): call NamespaceClash.
8327
8328         * interface.cs (Interface.DefineType): use NamespaceClash before
8329         defining the type.
8330
8331         * delegate.cs (Delegate.DefineType): use NamespaceClash before
8332         defining the type.
8333
8334         * enum.cs: (Enum.DefineType): use NamespaceClash before
8335         defining the type.
8336
8337         * typemanager.cs (: 3-line patch that gives us some tasty 11%
8338         speed increase.  First, use the negative_hits cache when we get a
8339         negative.  Second, add the type with its full original name
8340         instead of the new . and + encoded name (reflection uses + to
8341         separate type from a nested type).  Use LookupTypeReflection
8342         directly which bypasses the type->name hashtable (that we already
8343         know does not contain the type.
8344
8345         * decl.cs (DeclSpace.ResolveTypeExpr): track the
8346         location/container type. 
8347
8348         * driver.cs: When passing utf8, use directly the UTF8Encoding.
8349
8350 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
8351
8352         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
8353
8354         * delegate.cs (NewDelegate.Resolve): Test whether an instance
8355         method is being referenced in the method group from a static
8356         context, and report error 120 if so.
8357
8358         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
8359         Error118. 
8360
8361         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
8362         is created, we create the A namespace).
8363
8364         * cs-parser.jay: A namespace also introduces a DeclarationFound.
8365         Fixes #41591
8366
8367 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
8368
8369         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
8370         invocation to ModuleBuilder.GetType with the same values will
8371         return a new type instance, so we need to cache its return
8372         values. 
8373
8374         * expression.cs (Binary.ResolveOperator): Only allow the compare
8375         operators on enums if they are of the same type.
8376
8377         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
8378         types of ValueType on their own case.  Before we were giving them
8379         the same treatment as objects.
8380
8381         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
8382         fullname.  Short name is used to compare against container name.
8383         Fullname is used to check against defined namespace names.
8384
8385         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
8386         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
8387
8388         (Method.CheckBase): Call parent.
8389         (MemberBase.CheckBase): Check for protected members on sealed
8390         classes.
8391         (PropertyBase.CheckBase): Call parent.
8392         (Field.Define): Call parent.
8393
8394         * report.cs: Negative error codes are now mapped to 8000 - code,
8395         so that the display is render more nicely.
8396
8397         * typemanager.cs: Do not use try/catch, instead report a regular
8398         error. 
8399
8400         (GetPointerType, GetReferenceType): These methods provide
8401         mechanisms to obtain the T* and T& from a T.  We had the code
8402         previously scattered around the code base, and it also used
8403         TypeManager.LookupType that would go through plenty of caches.
8404         This one goes directly to the type source.
8405
8406         In some places we did the Type.GetType followed by
8407         ModuleBuilder.GetType, but not in others, so this unifies the
8408         processing as well.
8409
8410         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
8411         statements now that we have namespace information.
8412
8413         * typemanager.cs (IsNamespace): New method, returns whether the
8414         string presented is a namespace or not.
8415
8416         (ComputeNamespaces): New public entry point, computes the list of
8417         available namespaces, using the GetNamespaces API call in Mono, or
8418         the slower version in MS.NET.   
8419
8420         Now before we start the semantic analysis phase, we have a
8421         complete list of namespaces including everything that the user has
8422         provided.
8423
8424         Deleted old code to cache namespaces in .nsc files.
8425
8426 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
8427
8428         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
8429         class/struct location definition Location for the implicit
8430         constructor location.
8431
8432         (Operator.Define): Use the location of the operator for the
8433         implicit Method definition.
8434
8435         (Constructor.Emit): use the constructor location for the implicit
8436         base initializer constructor.
8437
8438         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
8439         and the Expression class now contains two new methods:
8440
8441         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
8442         isolate type lookup from the rest of the resolution process.
8443
8444         Since we use Expressions to hold type definitions due to the way
8445         we parse the input we have historically overloaded Resolve to
8446         perform the Type lookups if a special flag is passed.  Now this is
8447         eliminated and two methods take their place. 
8448
8449         The differences in the two methods between xStep and xTerminal is
8450         that xStep is involved in our current lookup system that uses
8451         SimpleNames to compose a name, while xTerminal is used just to
8452         catch the case where the simplename lookup failed.
8453
8454 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
8455
8456         * expression.cs (ResolveMemberAccess): Remove redundant code.
8457         TypeExpr expressions are always born fully resolved.
8458
8459         * interface.cs (PopulateMethod): Do not lookup the types twice.
8460         We were doing it once during SemanticAnalysis and once during
8461         PopulateMethod.
8462
8463         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
8464         in local variable type definitions, were being returned as a
8465         SimpleName (we decomposed everything into a string), that is
8466         because primary_expression was being used instead of a type in the
8467         grammar (reduce/reduce conflicts).
8468
8469         The part that was wrong is that we converted the expression into a
8470         string (an oversimplification in one hand, compounded with primary
8471         expressions doing string concatenation).
8472
8473         So things like:
8474
8475         A.B.C [] x;
8476
8477         Would return "A.B.C[]" as a SimpleName.  This stopped things like
8478         using clauses from working on this particular context.  And a type
8479         was being matched directly against "A.B.C[]".
8480
8481         We now use the correct approach, and allow for ComposedCast to be
8482         part of the unary expression.  So the "A.B.C []" become a composed
8483         cast of "A.B.C" (as a nested group of MemberAccess with a
8484         SimpleName at the end) plus the rank composition "[]". 
8485
8486         Also fixes 35567
8487
8488 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
8489
8490         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
8491         for the access level checking.
8492
8493         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
8494         `TypeContainer container', because I kept getting confused when I
8495         was debugging this code.
8496
8497         * expression.cs (Indexers): Instead of tracking getters/setters,
8498         we now track them in parallel.  We create one arraylist less, but
8499         most importantly it is possible now for the LValue code to find a
8500         matching get for a set.
8501
8502         (IndexerAccess.DoResolveLValue): Update the code.
8503         GetIndexersForType has been modified already to extract all the
8504         indexers from a type.  The code assumed it did not.
8505
8506         Also make the code set the correct return type for the indexer.
8507         This was fixed a long time ago for properties, but was missing for
8508         indexers.  It used to be void_type.
8509
8510         (Binary.Emit): Test first for doubles instead of
8511         floats, as they are more common.
8512
8513         (Binary.EmitBranchable): Use the .un version of the branch opcodes
8514         when dealing with floats and the <=, >= operators.  This fixes bug
8515         #39314 
8516
8517         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
8518         to load the array value by emitting a load on the foreach variable
8519         type.  This was incorrect.  
8520
8521         We now emit the code to load an element using the the array
8522         variable type, and then we emit the conversion operator.
8523
8524         Fixed #40176
8525
8526 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
8527
8528         * attribute.cs: Avoid allocation of ArrayLists in the common case.
8529
8530 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
8531
8532         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
8533         test for protection before we test for signatures. 
8534
8535         (MethodSignature.ToString): implement.
8536
8537         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
8538         to the case where we reduced into a LongConstant.
8539
8540         * decl.cs (CheckAccessLevel): If the type is an array, we can not
8541         depend on whether the information is acurrate, because the
8542         Microsoft runtime will always claim that the array type is public,
8543         regardless of the real state.
8544
8545         If the type is a pointer, another problem happens: the type is
8546         reported as non-public in Microsoft.  
8547
8548         In both cases we have to call CheckAccessLevel recursively with
8549         the underlying type as the argument to be tested.
8550
8551 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
8552
8553         * assign.cs (Assign.Emit): If we are dealing with a compound
8554         assignment expression, we should use the code path that stores the
8555         intermediate result in a temporary value.  This fixes #40903.
8556
8557         *expression.cs (Indirection.ToString): Provide ToString method for
8558         debugging. 
8559
8560 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
8561
8562         * class.cs: Null out fields holding references to Block objects so
8563         they can be garbage collected.
8564
8565         * expression.cs (OverloadResolve): Remove unused local.
8566
8567 2003-04-07  Martin Baulig  <martin@ximian.com>
8568
8569         * codegen.cs (EmitContext.CurrentFile): New public field.
8570         (EmitContext.Mark): Use the CurrentFile to check whether the
8571         location is in the correct file.
8572         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
8573
8574 2003-04-07  Martin Baulig  <martin@ximian.com>
8575
8576         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
8577
8578         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
8579         location.  [FIXME: The location argument which gets passed to this
8580         method is sometimes wrong!]
8581
8582 2003-04-07  Nick Drochak <ndrochak@gol.com>
8583
8584         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
8585
8586 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
8587
8588         * expression.cs (Indirection.EmitAssign): We were using the
8589         temporary, but returning immediately instead of continuing the
8590         EmitAssing flow.
8591
8592 2003-04-06  Martin Baulig  <martin@ximian.com>
8593
8594         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
8595         if it's a nested child, but also deriving from the outer class.
8596         See test 190.cs.
8597
8598         * typemanager.cs (IsNestedChildOf): Make this work if it's a
8599         nested child, but also deriving from the outer class.  See
8600         test-190.cs.
8601         (FilterWithClosure): We may access private members of the outer
8602         class if we're a nested child and deriving from the outer class.
8603         (RealMemberLookup): Only set `closure_private_ok' if the
8604         `original_bf' contained BindingFlags.NonPublic.
8605
8606 2003-04-05  Martin Baulig  <martin@ximian.com>
8607
8608         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
8609         probe if its a type parameter, and if so, flag an error.
8610
8611         * decl.cs: Move here the SetParameterInfo code from class.cs.
8612         Handle IsGeneric here.
8613
8614         Handle a variety of errors in the parameter info definition.
8615
8616         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
8617         type parameters here.
8618
8619         * cs-parser.jay (class_declaration): report errors for parameters
8620         here as well.
8621
8622 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
8623
8624         * generic.cs: New file, contains support code for generics.
8625
8626         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
8627         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
8628
8629         Update parser for the above removals.
8630
8631         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
8632         now taken care of in the parser.
8633
8634 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
8635
8636         * class.cs (Event.Define): Do not allow abstract events to have
8637         initializers. 
8638
8639 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
8640
8641         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
8642         block in event declarations.
8643
8644         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
8645         value type, get its address.
8646
8647         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
8648         leaving a class on the stack instead of a boolean value (int
8649         0/1).  Change the code so we compare against null, and then the
8650         result against zero.
8651
8652         * class.cs (TypeContainer.GetClassBases): We were checking for the
8653         parent class being sealed too late.
8654
8655         * expression.cs (Binary.Emit): For <= and >= when dealing with
8656         floating point values, use cgt.un and clt.un instead of cgt and
8657         clt alone.
8658
8659 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
8660
8661         * statement.cs: Apply the same optimization as MS: skip the 
8662         GetEnumerator returning an IEnumerator, and use the one returning a 
8663         CharEnumerator instead. This allows us to avoid the try-finally block 
8664         and the boxing.
8665
8666 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
8667
8668         * cs-parser.jay: Attributes cannot be applied to
8669                          namespaces. Fixes #40473
8670
8671 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8672
8673         * class.cs:
8674         (Add*): check if the name is valid using the full name for constants,
8675         fields, properties and events.
8676
8677 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
8678
8679         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
8680         char constants to be part of the enumeration.
8681
8682         * expression.cs (Conditional.DoResolve): Add support for operator
8683         true. Implements the missing functionality from 14.12
8684
8685         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
8686         operator true/false as required by the spec.
8687
8688         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
8689         implicit conversion to boolean.
8690
8691         * statement.cs (Statement.ResolveBoolean): A boolean expression is
8692         also one where the type implements `operator true'. 
8693
8694         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
8695         get an expression that will invoke operator true based on an
8696         expression.  
8697
8698         (GetConversionOperators): Removed the hack that called op_True
8699         here.  
8700
8701         (Expression.ResolveBoolean): Move this from Statement.
8702
8703 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
8704
8705         * ecore.cs (FieldExpr): do not allow initialization of initonly
8706         fields on derived classes
8707
8708 2003-03-13  Martin Baulig  <martin@ximian.com>
8709
8710         * statement.cs (Block.Emit): Call ig.BeginScope() and
8711         ig.EndScope() when compiling with debugging info; call
8712         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
8713
8714 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
8715
8716         * expression.cs (Indexers): Do not construct immediately, allow
8717         for new members to be appended as we go.  Fixes 38143
8718
8719 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8720
8721         * expression.cs: save/restore context when resolving an unchecked
8722         expression.
8723
8724 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
8725
8726         * cfold.cs: Catch division by zero in modulus operator during
8727         constant folding.
8728
8729 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
8730
8731         * interface.cs (Interface.DefineMembers): Avoid defining members
8732         twice. 
8733
8734 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
8735
8736         * driver.cs: handle the +/- options for -noconfig
8737
8738         * statement.cs (Unckeched.Resolve): Also track the state of
8739         unchecked in the Resolve phase.
8740
8741 2003-02-27  Martin Baulig  <martin@ximian.com>
8742
8743         * ecore.cs (Expression.MemberLookup): Don't create a
8744         MethodGroupExpr for something which is not a method.  Fixes #38291.
8745
8746 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
8747
8748         * class.cs (MemberBase.CheckParameters): Also check that the type
8749         is unmanaged if it is a pointer.
8750
8751         * expression.cs (SizeOf.Resolve): Add location information.
8752
8753         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
8754         a managed type is declared.
8755
8756         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
8757         parameter modifiers as well.  Fixes bug 38606
8758
8759         * class.cs: Very sad.  Am backing out the speed up changes
8760         introduced by the ArrayList -> Array in the TypeContainer, as they
8761         were not actually that much faster, and introduced a bug (no error
8762         reports on duplicated methods).
8763
8764         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
8765         source first, this will guarantee that we have a valid expression
8766         before calling in lower levels functions that will require a
8767         resolved object.  Then use this original_source in the
8768         target.ResolveLValue instead of the original source that was
8769         passed to us.
8770
8771         Another change.  Use target.Resolve instead of LValueResolve.
8772         Although we are resolving for LValues, we will let the Assign code
8773         take care of that (it will be called again from Resolve).  This
8774         basically allows code like this:
8775
8776         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
8777         class Y { void A (X x) { x [0] += o; }
8778
8779         The problem was that the indexer was trying to resolve for
8780         set_Item (idx, object o) and never finding one.  The real set_Item
8781         was set_Item (idx, X).  By delaying the process we get the right
8782         semantics. 
8783
8784         Fixes bug 36505
8785
8786 2003-02-23  Martin Baulig  <martin@ximian.com>
8787
8788         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
8789         while calling DoEmit ().
8790
8791         * codegen.cs (EmitContext.Mark): Don't mark locations in other
8792         source files; if you use the #line directive inside a method, the
8793         compiler stops emitting line numbers for the debugger until it
8794         reaches the end of the method or another #line directive which
8795         restores the original file.
8796
8797 2003-02-23  Martin Baulig  <martin@ximian.com>
8798
8799         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
8800
8801 2003-02-23  Martin Baulig  <martin@ximian.com>
8802
8803         * statement.cs (Block.AddChildVariableNames): We need to call this
8804         recursively, not just for our immediate children.
8805
8806 2003-02-23  Martin Baulig  <martin@ximian.com>
8807
8808         * class.cs (Event.Define): Always make the field private, like csc does.
8809
8810         * typemanager.cs (TypeManager.RealMemberLookup): Make events
8811         actually work, fixes bug #37521.
8812
8813 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
8814
8815         * delegate.cs: When creating the various temporary "Parameters"
8816         classes, make sure that we call the ComputeAndDefineParameterTypes
8817         on those new parameters (just like we do with the formal ones), to
8818         allow them to be resolved in the context of the DeclSpace.
8819
8820         This fixes the bug that Dick observed in Bugzilla #38530.
8821
8822 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
8823
8824         * expression.cs (ResolveMemberAccess): When resolving a constant,
8825         do not attempt to pull a constant if the value was not able to
8826         generate a valid constant.
8827
8828         * const.cs (LookupConstantValue): Do not report more errors than required.
8829
8830 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8831
8832         * expression.cs: fixes bug #38328.
8833
8834 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
8835
8836         * class.cs: Changed all the various members that can be part of a
8837         class from being an ArrayList to be an Array of the right type.
8838         During the DefineType type_list, interface_list, delegate_list and
8839         enum_list are turned into types, interfaces, delegates and enums
8840         arrays.  
8841
8842         And during the member population, indexer_list, event_list,
8843         constant_list, field_list, instance_constructor_list, method_list,
8844         operator_list and property_list are turned into their real arrays.
8845
8846         Although we could probably perform this operation earlier, for
8847         good error reporting we need to keep the lists and remove the
8848         lists for longer than required.
8849
8850         This optimization was triggered by Paolo profiling the compiler
8851         speed on the output of `gen-sample-program.pl' perl script. 
8852
8853         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
8854         not crash in methods like MemberLookupFailed that use this field.  
8855
8856         This problem arises when the compiler fails to resolve a type
8857         during interface type definition for example.
8858
8859 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
8860
8861         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
8862         inherit from System.Object, so we have to stop at null, not only
8863         when reaching System.Object.
8864
8865 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
8866
8867         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
8868         DeclaredOnly because the parent indexer might have had a different
8869         name, but did not loop until the top of the hierarchy was reached.
8870
8871         The problem this one fixes is 35492: when a class implemented an
8872         indexer from an interface, we were getting the interface method
8873         (which was abstract) and we were flagging an error (can not invoke
8874         abstract method).
8875
8876         This also keeps bug 33089 functioning, and test-148 functioning.
8877
8878         * typemanager.cs (IsSpecialMethod): The correct way of figuring
8879         out if a method is special is to see if it is declared in a
8880         property or event, or whether it is one of the predefined operator
8881         names.   This should fix correctly #36804.
8882
8883 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
8884
8885         The goal here is to remove the dependency on EmptyCast.Peel ().
8886         Killing it completely.
8887
8888         The problem is that currently in a number of places where
8889         constants are expected, we have to "probe" for an EmptyCast, and
8890         Peel, which is not the correct thing to do, as this will be
8891         repetitive and will likely lead to errors. 
8892
8893         The idea is to remove any EmptyCasts that are used in casts that
8894         can be reduced to constants, so we only have to cope with
8895         constants. 
8896
8897         This bug hunt was triggered by Bug 37363 and the desire to remove
8898         the duplicate pattern where we were "peeling" emptycasts to check
8899         whether they were constants.  Now constants will always be
8900         constants.
8901
8902         * ecore.cs: Use an enumconstant here instead of wrapping with
8903         EmptyCast.  
8904
8905         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
8906         throwing me off.  By handling this we can get rid of a few hacks.
8907
8908         * statement.cs (Switch): Removed Peel() code.
8909
8910 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
8911
8912         * class.cs: Location information for error 508
8913
8914         * expression.cs (New.DoResolve): Add a guard against double
8915         resolution of an expression.  
8916
8917         The New DoResolve might be called twice when initializing field
8918         expressions (see EmitFieldInitializers, the call to
8919         GetInitializerExpression will perform a resolve on the expression,
8920         and later the assign will trigger another resolution
8921
8922         This leads to bugs (#37014)
8923
8924         * delegate.cs: The signature for EndInvoke should contain any ref
8925         or out parameters as well.  We were not doing this in the past. 
8926
8927         * class.cs (Field.Define): Do not overwrite the type definition
8928         inside the `volatile' group.  Turns out that volatile enumerations
8929         were changing the type here to perform a validity test, which
8930         broke conversions. 
8931
8932 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
8933
8934         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
8935         and structs, we do not want to load the instance variable
8936
8937         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
8938         enum_type has to be handled like an object reference (implicit
8939         conversions exists from this to object), but the regular IsClass
8940         and IsValueType tests will never return true for this one.
8941
8942         Also we use TypeManager.IsValueType instead of type.IsValueType,
8943         just for consistency with the rest of the code (this is only
8944         needed if we ever use the construct exposed by test-180.cs inside
8945         corlib, which we dont today).
8946
8947 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
8948
8949         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
8950         just InternalCall.
8951
8952 2003-02-09  Martin Baulig  <martin@ximian.com>
8953
8954         * namespace.cs (Namespace..ctor): Added SourceFile argument.
8955         (Namespace.DefineNamespaces): New static public method; this is
8956         called when we're compiling with debugging to add all namespaces
8957         to the symbol file.
8958
8959         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
8960         pass it to the Namespace's .ctor.
8961
8962         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
8963         and MethodBase arguments; pass the namespace ID to the symwriter;
8964         pass the MethodBase instead of the token to the symwriter.
8965         (SymbolWriter.DefineNamespace): New method to add a namespace to
8966         the symbol file.
8967
8968 2003-02-09  Martin Baulig  <martin@ximian.com>
8969
8970         * symbolwriter.cs: New file.  This is a wrapper around
8971         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
8972         methods here in near future.
8973
8974 2003-02-09  Martin Baulig  <martin@ximian.com>
8975
8976         * codegen.cs (EmitContext.Mark): Just pass the arguments to
8977         ILGenerator.MarkSequencePoint() which are actually used by the
8978         symbol writer.
8979
8980 2003-02-09  Martin Baulig  <martin@ximian.com>
8981
8982         * location.cs (SourceFile): New public sealed class.  This
8983         contains the name and an index which is used in the location's token.
8984         (Location): Reserve an appropriate number of bits in the token for
8985         the source file instead of walking over that list, this gives us a
8986         really huge performance improvement when compiling with debugging.
8987
8988         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
8989         `SourceFile' argument instead of a string.
8990         (Driver.ProcessFile): Add all the files via Location.AddFile(),
8991         but don't parse/tokenize here, we need to generate the list of all
8992         source files before we do that.
8993         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
8994         the files.
8995
8996         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
8997         instead of a string.
8998
8999         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
9000         of a string.
9001
9002 2003-02-09  Martin Baulig  <martin@ximian.com>
9003
9004         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
9005         filename on `#line default'.
9006
9007 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
9008
9009         * statement.cs: don't clear the pinned var when the fixed statement
9010         returns from the method (fixes bug#37752).
9011
9012 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
9013
9014         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
9015         to IsValueType.
9016
9017 2003-02-07  Martin Baulig  <martin@ximian.com>
9018
9019         * driver.cs: Removed the `--debug-args' command line argument.
9020
9021         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
9022         automatically by the AsssemblyBuilder.
9023         (CodeGen.InitializeSymbolWriter): We don't need to call any
9024         initialization function on the symbol writer anymore.  This method
9025         doesn't take any arguments.
9026
9027 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
9028
9029         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
9030         from referenced assemblies as well.
9031
9032 2003-02-02  Martin Baulig  <martin@ximian.com>
9033
9034         * class.cs (MethodData.Emit): Generate debugging info for external methods.
9035
9036 2003-02-02  Martin Baulig  <martin@ximian.com>
9037
9038         * class.cs (Constructor.Emit): Open the symbol writer before
9039         emitting the constructor initializer.
9040         (ConstructorInitializer.Emit): Call ec.Mark() to allow
9041         single-stepping through constructor initializers.
9042
9043 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
9044
9045         * class.cs: Handle error 549: do not allow virtual methods in
9046         sealed classes. 
9047
9048 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
9049
9050         * decl.cs: Check access levels when resolving types
9051
9052 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
9053
9054         * statement.cs: Add parameters and locals set in catch blocks that might 
9055         return to set vector
9056
9057 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
9058
9059         * class.cs (Operator): Set the SpecialName flags for operators.
9060
9061         * expression.cs (Invocation.DoResolve): Only block calls to
9062         accessors and operators on SpecialName methods.
9063
9064         (Cast.TryReduce): Handle conversions from char constants.
9065
9066
9067 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
9068
9069         * statement.cs: small memory and time optimization in FlowBranching.
9070
9071 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
9072
9073         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
9074         problem that the last fix but in the other sid (Set).
9075
9076         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
9077         access when there is no indexer in the hierarchy.
9078
9079 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
9080
9081         * class.cs: Combine some if statements.
9082
9083 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9084
9085         * driver.cs: fixed bug #37187.
9086
9087 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
9088
9089         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
9090         any indexer, it's needed to build a list with all the indexers in the
9091         hierarchy (AllGetters), else we have problems. Fixes #35653.
9092
9093 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
9094
9095         * class.cs (MethodData.Define): It is wrong for an interface
9096         implementation to be static in both cases: explicit and implicit.
9097         We were only handling this in one case.
9098
9099         Improve the if situation there to not have negations.
9100
9101         * class.cs (Field.Define): Turns out that we do not need to check
9102         the unsafe bit on field definition, only on usage.  Remove the test.
9103
9104 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9105
9106         * driver.cs: use assembly.Location instead of Codebase (the latest
9107         patch made mcs fail when using MS assemblies).
9108
9109 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
9110
9111         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
9112         get the path to *corlib.dll.
9113
9114 2003-01-21  Nick Drochak <ndrochak@gol.com>
9115
9116         * cs-tokenizer.cs:
9117         * pending.cs:
9118         * typemanager.cs: Remove compiler warnings
9119
9120 2003-01-20  Duncan Mak  <duncan@ximian.com>
9121
9122         * AssemblyInfo.cs: Bump the version number to 0.19.
9123
9124 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9125
9126         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
9127
9128 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
9129
9130         * class.cs (Constructor::Emit): Emit debugging info for constructors.
9131
9132 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
9133
9134         * cs-parser.jay: Small fix: we were not comparing the constructor
9135         name correctly.   Thanks to Zoltan for the initial pointer.
9136
9137 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
9138
9139         * cs-tokenizer.cs: Set file name when specified with #line
9140
9141 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
9142
9143         * cs-parser.jay: Only perform the constructor checks here if we
9144         are named like the class;  This will help provider a better
9145         error.  The constructor path is taken when a type definition is
9146         not found, but most likely the user forgot to add the type, so
9147         report that rather than the constructor error.
9148
9149 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
9150
9151         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
9152         allocations.
9153
9154 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
9155
9156         * cs-parser.jay: Add cleanup call.
9157
9158 2003-01-13  Duncan Mak  <duncan@ximian.com>
9159
9160         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
9161         consistent with other methods.
9162
9163 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
9164
9165         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
9166
9167 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
9168
9169         * attribute.cs: only set GuidAttr to true when we have a
9170         GuidAttribute.
9171
9172 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9173
9174         * ecore.cs:
9175         * expression.cs:
9176         * typemanager.cs: fixes to allow mcs compile corlib with the new
9177         Type.IsSubclassOf fix.
9178
9179 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
9180
9181         * expression.cs (LocalVariableReference.DoResolve): Classify a
9182         constant as a value, not as a variable.   Also, set the type for
9183         the variable.
9184
9185         * cs-parser.jay (fixed_statement): take a type instead of a
9186         pointer_type, so we can produce a better error message later.
9187
9188         * statement.cs (Fixed.Resolve): Flag types that are not pointers
9189         as an error.  
9190
9191         (For.DoEmit): Make inifinite loops have a
9192         non-conditional branch back.
9193
9194         (Fixed.DoEmit): First populate the pinned variables, then emit the
9195         statement, then clear the variables.  Before I was emitting the
9196         code once for each fixed piece.
9197
9198
9199 2003-01-08  Martin Baulig  <martin@ximian.com>
9200
9201         * statement.cs (FlowBranching.MergeChild): A break in a
9202         SWITCH_SECTION does not leave a loop.  Fixes #36155.
9203
9204 2003-01-08  Martin Baulig  <martin@ximian.com>
9205
9206         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
9207         lives in the same number space than `param_map'.  Fixes #36154.
9208
9209 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
9210
9211         * cs-parser.jay (constructor_declaration): Set the
9212         Constructor.ModFlags before probing for it.  This makes the
9213         compiler report 514, 515 and 132 (the code was there, but got
9214         broken). 
9215
9216         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
9217         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
9218         (GotoCase.Resolve): Set `Returns' to ALWAYS.
9219
9220 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
9221
9222         * enum.cs: create the enum static fields using the enum type.
9223
9224 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
9225
9226         * class.cs: don't try to create the ParamBuilder for the return
9227         type if it's not needed (and handle it breaking for the ms runtime
9228         anyway).
9229
9230 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
9231
9232         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
9233
9234 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
9235
9236         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
9237         the command.   This showed up while compiling the JANET source
9238         code, which used \r as its only newline separator.
9239
9240 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
9241
9242         * class.cs (Method.Define): If we are an operator (because it
9243         reuses our code), then set the SpecialName and HideBySig.  #36128
9244
9245 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
9246
9247         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
9248         exception, report error 120 `object reference required'.
9249
9250         * driver.cs: Add --pause option, used during to measure the size
9251         of the process as it goes with --timestamp.
9252
9253         * expression.cs (Invocation.DoResolve): Do not allow methods with
9254         SpecialName to be invoked.
9255
9256 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
9257
9258         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
9259         number before adding it.
9260
9261 2002-12-21  Ravi Pratap  <ravi@ximian.com>
9262
9263         * ecore.cs (StandardImplicitConversion): When in an unsafe
9264         context, we allow conversion between void * to any other pointer
9265         type. This fixes bug #35973.
9266
9267 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
9268
9269         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
9270         is not thrown when extensionless outputs are used 
9271
9272 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9273
9274         * rootcontext.cs: fixed compilation of corlib.
9275
9276 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
9277
9278         * attribute.cs (Attributes.Contains): Add new method.
9279
9280         * class.cs (MethodCore.LabelParameters): if the parameter is an
9281         `out' parameter, check that no attribute `[In]' has been passed.
9282
9283         * enum.cs: Handle the `value__' name in an enumeration.
9284
9285 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
9286
9287         * decl.cs: Added special case to allow overrides on "protected
9288         internal" methods
9289
9290 2002-12-18  Ravi Pratap  <ravi@ximian.com>
9291
9292         * attribute.cs (Attributes.AddAttributeSection): Rename to this
9293         since it makes much more sense.
9294
9295         (Attributes.ctor): Don't require a Location parameter.
9296
9297         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
9298
9299         * attribute.cs (ApplyAttributes): Remove extra Location parameters
9300         since we already have that information per attribute.
9301
9302         * everywhere : make appropriate changes.
9303
9304         * class.cs (LabelParameters): Write the code which actually
9305         applies attributes to the return type. We can't do this on the MS
9306         .NET runtime so we flag a warning in the case an exception is
9307         thrown.
9308
9309 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
9310
9311         * const.cs: Handle implicit null conversions here too.
9312
9313 2002-12-17  Ravi Pratap  <ravi@ximian.com>
9314
9315         * class.cs (MethodCore.LabelParameters): Remove the extra
9316         Type [] parameter since it is completely unnecessary. Instead
9317         pass in the method's attributes so that we can extract
9318         the "return" attribute.
9319
9320 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
9321
9322         * cs-parser.jay (parse): Use Report.Error to flag errors instead
9323         of ignoring it and letting the compile continue.
9324
9325         * typemanager.cs (ChangeType): use an extra argument to return an
9326         error condition instead of throwing an exception.
9327
9328 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
9329
9330         * expression.cs (Unary.TryReduce): mimic the code for the regular
9331         code path.  Perform an implicit cast in the cases where we can
9332         implicitly convert to one of the integral types, and then reduce
9333         based on that constant.   This fixes bug #35483.
9334
9335 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9336
9337         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
9338
9339 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9340
9341         * namespace.cs: fixed bug #35489.
9342
9343 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
9344
9345         * class.cs: Remove some dead code.
9346
9347         * cs-parser.jay: Estimate the number of methods needed
9348         (RootContext.MethodCount);
9349
9350         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
9351         numbers instead of StringBuilders.
9352
9353         * support.cs (PtrHashtable): Add constructor with initial size;
9354         We can now reduce reallocations of the method table.
9355
9356 2002-12-10  Ravi Pratap  <ravi@ximian.com>
9357
9358         * attribute.cs (ApplyAttributes): Keep track of the emitted
9359         attributes on a per-target basis. This fixes bug #35413.
9360
9361 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
9362
9363         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
9364         default to the Windows 1252 encoding.
9365
9366         (UnixParseOption): Support version, thanks to Alp for the missing
9367         pointer. 
9368
9369         * AssemblyInfo.cs: Add nice assembly information.
9370
9371         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
9372         (bug 35169).
9373
9374         * cs-parser.jay: Allow a trailing comma before the close bracked
9375         in the attribute_section production.
9376
9377         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
9378         address of the instance was being taken, I will take this out,
9379         because we take the address of the object immediately here.
9380
9381 2002-12-09  Ravi Pratap  <ravi@ximian.com>
9382
9383         * typemanager.cs (AreMultipleAllowed): Take care of the most
9384         obvious case where attribute type is not in the current assembly -
9385         stupid me ;-)
9386
9387 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
9388
9389         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
9390         definitions, instead of doing that afterwards.  
9391
9392         Also we use a nice little hack, depending on the constructor, we
9393         know if we are a "composed" name or a simple name.  Hence, we
9394         avoid the IndexOf test, and we avoid 
9395
9396         * codegen.cs: Add code to assist in a bug reporter to track down
9397         the source of a compiler crash. 
9398
9399 2002-12-07  Ravi Pratap  <ravi@ximian.com>
9400
9401         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
9402         types have been emitted for a given element and flag an error
9403         if something which does not have AllowMultiple set is used more
9404         than once.
9405
9406         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
9407         attribute types and their corresponding AllowMultiple properties
9408
9409         (AreMultipleAllowed): Check the property for a given type.
9410
9411         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
9412         property in the case we have a TypeContainer.
9413
9414         (Attributes.AddAttribute): Detect duplicates and just skip on
9415         adding them. This trivial fix catches a pretty gross error in our
9416         attribute emission - global attributes were being emitted twice!
9417
9418         Bugzilla bug #33187 is now fixed.
9419
9420 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
9421
9422         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
9423         instead of pp_and).
9424
9425         * expression.cs (Binary.ResolveOperator): I can only use the
9426         Concat (string, string, string) and Concat (string, string,
9427         string, string) if the child is actually a concatenation of
9428         strings. 
9429
9430 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
9431
9432         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
9433         context where we need a 2-character lookahead.
9434
9435         * pending.cs (PendingImplementation): Rework so we can keep track
9436         of interface types all the time, and flag those which were
9437         implemented by parents as optional.
9438
9439 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
9440
9441         * expression.cs (Binary.ResolveOperator): Use
9442         String.Concat(string,string,string) or
9443         String.Concat(string,string,string,string) when possible. 
9444
9445         * typemanager: More helper methods.
9446
9447
9448 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
9449
9450         * pending.cs: remove the bogus return from GetMissingInterfaces()
9451         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
9452
9453 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9454
9455         * namespace.cs: avoid duplicated 'using xxx' being added to
9456         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
9457         when we get more than one 'using' statement for the same namespace.
9458         Report a CS0105 warning for it.
9459
9460 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
9461
9462         * cs-tokenizer.cs (consume_identifier): use read directly, instead
9463         of calling getChar/putback, uses internal knowledge of it.    
9464
9465         (xtoken): Reorder tokenizer so most common patterns are checked
9466         first.  This reduces the compilation time in another 5% (from 8.11s
9467         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
9468
9469         The parsing time is 22% of the compilation in mcs, and from that
9470         64% is spent on the tokenization process.  
9471
9472         I tried using a binary search for keywords, but this is slower
9473         than the hashtable.  Another option would be to do a couple of
9474         things:
9475
9476                 * Not use a StringBuilder, instead use an array of chars,
9477                   with a set value.  Notice that this way we could catch
9478                   the 645 error without having to do it *afterwards*.
9479
9480                 * We could write a hand-parser to avoid the hashtable
9481                   compares altogether.
9482
9483         The identifier consumption process takes 37% of the tokenization
9484         time.  Another 15% is spent on is_number.  56% of the time spent
9485         on is_number is spent on Int64.Parse:
9486
9487                 * We could probably choose based on the string length to
9488                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
9489                   computations. 
9490
9491         Another 3% is spend on wrapping `xtoken' in the `token' function.
9492
9493         Handle 0xa0 as whitespace (#34752)
9494
9495 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
9496
9497         * typemanager.cs (IsCLRType): New routine to tell whether a type
9498         is one of the builtin types.  
9499
9500         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
9501         typecode in more places instead of doing pointer comparissions.
9502         We could leverage some knowledge about the way the typecodes are
9503         laid out.
9504
9505         New code to cache namespaces in assemblies, it is currently not
9506         invoked, to be used soon.
9507
9508         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
9509
9510         * expression.cs (Binary.ResolveOperator): specially handle
9511         strings, and do not perform user-defined operator overloading for
9512         built-in types.
9513
9514 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
9515
9516         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
9517         internalcall as it is a pretty simple operation;  Avoid whenever
9518         possible to call Char.IsLetter.
9519
9520         (consume_identifier): Cut by half the number of
9521         hashtable calls by merging the is_keyword and GetKeyword behavior.
9522
9523         Do not short-circuit, because if we do, we
9524         report errors (ie, #if false && true would produce an invalid
9525         directive error);
9526
9527
9528 2002-11-24  Martin Baulig  <martin@ximian.com>
9529
9530         * expression.cs (Cast.TryReduce): If we're in checked syntax,
9531         check constant ranges and report a CS0221.  Fixes #33186.
9532
9533 2002-11-24  Martin Baulig  <martin@ximian.com>
9534
9535         * cs-parser.jay: Make this work for uninitialized variable
9536         declarations in the `for' initializer.  Fixes #32416.
9537
9538 2002-11-24  Martin Baulig  <martin@ximian.com>
9539
9540         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
9541         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
9542
9543 2002-11-24  Martin Baulig  <martin@ximian.com>
9544
9545         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
9546         argument; if true, we also check for user-defined conversions.
9547         This is only needed if both arguments are of a user-defined type.
9548         Fixes #30443, added test-175.cs.
9549         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
9550
9551         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
9552
9553 2002-11-24  Martin Baulig  <martin@ximian.com>
9554
9555         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
9556         function to get the store opcode.
9557         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
9558         only emit the Ldelema if the store opcode is Stobj.  You must run
9559         both test-34 and test-167 to test this.  Fixes #34529.
9560
9561 2002-11-23  Martin Baulig  <martin@ximian.com>
9562
9563         * ecore.cs (Expression.MemberLookup): Added additional
9564         `qualifier_type' argument which is used when we're being called
9565         from MemberAccess.DoResolve() and null if we're called from a
9566         SimpleName lookup.
9567         (Expression.MemberLookupFailed): New method to report errors; this
9568         does the CS1540 check and reports the correct error message.
9569
9570         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
9571         argument for the CS1540 check and redone the way how we're dealing
9572         with private members.  See the comment in the source code for details.
9573         (FilterWithClosure): Reverted this back to revision 1.197; renamed
9574         `closure_start_type' to `closure_qualifier_type' and check whether
9575         it's not null.  It was not this filter being broken, it was just
9576         being called with the wrong arguments.
9577
9578         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
9579         and pass it the correct `qualifier_type'; this also does the error
9580         handling for us.
9581
9582 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
9583
9584         * expression.cs (Invocation.EmitParams): If the we are dealing
9585         with a non-built-in value type, load its address as well.
9586
9587         (ArrayCreation): Use a a pretty constant instead
9588         of the hardcoded value 2.   Use 6 instead of 2 for the number of
9589         static initializers.  
9590
9591         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
9592         because they are not really value types, just glorified integers. 
9593
9594         * driver.cs: Do not append .exe, the CSC compiler does not do it.
9595
9596         * ecore.cs: Remove redundant code for enumerations, make them use
9597         the same code path as everything else, fixes the casting issue
9598         with enumerations in Windows.Forms.
9599
9600         * attribute.cs: Do only cast to string if it is a string, the
9601         validation happens later.
9602
9603         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
9604         people upgrade their corlibs.
9605
9606         * ecore.cs: Oops, enumerations were not following the entire code path
9607
9608 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
9609
9610         * typemanager.cs (FilterWithClosure): Commented out the test for
9611         1540 in typemanager.cs, as it has problems when accessing
9612         protected methods from a parent class (see test-174.cs). 
9613
9614         * attribute.cs (Attribute.ValidateGuid): new method.
9615         (Attribute.Resolve): Use above.
9616
9617 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
9618
9619         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
9620
9621         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
9622         handling for enumerations, as we only needed the TypeContainer
9623         functionality to begin with (this is required for the fix below to
9624         work for enums that reference constants in a container class for
9625         example). 
9626
9627         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
9628
9629         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
9630         a valid TypeBuilder to perform lookups on.o
9631
9632         * class.cs (InheritableMemberSignatureCompare): Use true in the
9633         call to GetGetMethod and GetSetMethod, because we are comparing
9634         the signature, and we need to get the methods *even* if they are
9635         private. 
9636
9637         (PropertyBase.CheckBase): ditto.
9638
9639         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
9640         GotoCase.Resolve): Use Peel on EmpytCasts.
9641
9642         * ecore.cs (EmptyCast): drop child, add Peel method.
9643
9644 2002-11-17  Martin Baulig  <martin@ximian.com>
9645
9646         * ecore.cs (EmptyCast.Child): New public property.
9647
9648         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
9649         label resolved to an EmptyCast.  Fixes #34162.
9650         (GotoCase.Resolve): Likewise.
9651         (Block.EmitMeta): Likewise.
9652
9653 2002-11-17  Martin Baulig  <martin@ximian.com>
9654
9655         * expression.cs (Invocation.BetterConversion): Prefer int over
9656         uint; short over ushort; long over ulong for integer literals.
9657         Use ImplicitConversionExists instead of StandardConversionExists
9658         since we also need to check for user-defined implicit conversions.
9659         Fixes #34165.  Added test-173.cs.
9660
9661 2002-11-16  Martin Baulig  <martin@ximian.com>
9662
9663         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
9664         with the `true' and `false' literals.  Fixes #33151.
9665
9666 2002-11-16  Martin Baulig  <martin@ximian.com>
9667
9668         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
9669         October 22nd; don't do the cs1540 check for static members.
9670
9671         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
9672         now using our own filter here and doing the cs1540 check again.
9673
9674 2002-11-16  Martin Baulig  <martin@ximian.com>
9675
9676         * support.cs (InternalParameters): Don't crash if we don't have
9677         any fixed parameters.  Fixes #33532.
9678
9679 2002-11-16  Martin Baulig  <martin@ximian.com>
9680
9681         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
9682         when looking up static methods to make this work on Windows.
9683         Fixes #33773.
9684
9685 2002-11-16  Martin Baulig  <martin@ximian.com>
9686
9687         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
9688         a setter rather than using PropertyInfo.CanWrite.
9689
9690 2002-11-15  Nick Drochak  <ndrochak@gol.com>
9691
9692         * class.cs: Allow acces to block member by subclasses. Fixes build
9693         breaker.
9694
9695 2002-11-14  Martin Baulig  <martin@ximian.com>
9696
9697         * class.cs (Constructor.Emit): Added the extern/block check.
9698         Fixes bug #33678.
9699
9700 2002-11-14  Martin Baulig  <martin@ximian.com>
9701
9702         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
9703         iteration while looking for indexers, this is needed because the
9704         indexer may have a different name in our base classes.  Fixed the
9705         error reporting (no indexers at all, not get accessor, no
9706         overloaded match).  Fixes bug #33089.
9707         (IndexerAccess.DoResolveLValue): Likewise.
9708
9709 2002-11-14  Martin Baulig  <martin@ximian.com>
9710
9711         * class.cs (PropertyBase.CheckBase): Make this work for multiple
9712         indexers.  Fixes the first part of bug #33089.
9713         (MethodSignature.InheritableMemberSignatureCompare): Added support
9714         for properties.
9715
9716 2002-11-13  Ravi Pratap  <ravi@ximian.com>
9717
9718         * attribute.cs (Attribute.Resolve): Catch the
9719         NullReferenceException and report it since it isn't supposed to
9720         happen. 
9721
9722 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
9723
9724         * expression.cs (Binary.EmitBranchable): Also handle the cases for
9725         LogicalOr and LogicalAnd that can benefit from recursively
9726         handling EmitBranchable.  The code now should be nice for Paolo.
9727
9728 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
9729
9730         * typemanager.cs (LookupType): Added a negative-hit hashtable for
9731         the Type lookups, as we perform quite a number of lookups on
9732         non-Types.  This can be removed once we can deterministically tell
9733         whether we have a type or a namespace in advance.
9734
9735         But this might require special hacks from our corlib.
9736
9737         * TODO: updated.
9738
9739         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
9740         and double which avoids a conversion from an integer to a double.
9741
9742         * expression.cs: tiny optimization, avoid calling IsConstant,
9743         because it effectively performs the lookup twice.
9744
9745 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
9746
9747         But a bogus return here to keep the semantics of the old code
9748         until the Mono runtime is fixed.
9749
9750         * pending.cs (GetMissingInterfaces): New method used to remove all
9751         the interfaces that are already implemented by our parent
9752         classes from the list of pending methods. 
9753
9754         * interface.cs: Add checks for calls after ResolveTypeExpr.
9755
9756 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
9757
9758         * class.cs (Class.Emit): Report warning 67: event not used if the
9759         warning level is beyond 3.
9760
9761         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
9762         being a NullLiteral.
9763
9764         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
9765         specifiers. 
9766
9767         * class.cs (TypeContainer.GetClassBases): Cover a missing code
9768         path that might fail if a type can not be resolved.
9769
9770         * expression.cs (Binary.Emit): Emit unsigned versions of the
9771         operators. 
9772
9773         * driver.cs: use error 5.
9774
9775 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
9776
9777         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
9778
9779 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
9780
9781         * cs-parser.jay (switch_section): A beautiful patch from Martin
9782         Baulig that fixed 33094.
9783
9784 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
9785
9786         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
9787         Check whether the base is abstract and report an error if so.
9788
9789         * expression.cs (IndexerAccess.DoResolveLValue,
9790         IndexerAccess.DoResolve): ditto. 
9791
9792         (Invocation.DoResolve): ditto.
9793
9794         (Invocation.FullMethodDesc): Improve the report string.
9795
9796         * statement.cs (Block): Eliminate IsVariableDefined as it is
9797         basically just a wrapper for GetVariableInfo.
9798
9799         * ecore.cs (SimpleName): Use new 
9800
9801         * support.cs (ReflectionParamter.ParameterType): We unwrap the
9802         type, as we return the actual parameter ref/unref state on a
9803         different call.
9804
9805 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
9806
9807         * support.cs: Return proper flags REF/OUT fixing the previous
9808         commit.  
9809
9810         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
9811         not used to mean `ref' but `ref or out' in ParameterReference
9812
9813         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
9814         full type signature instead of calling TypeManger.CSharpName
9815         ourselves. 
9816
9817         * support.cs (InternalParameters.ParameterDesc): Do not compare
9818         directly to the modflags, because REF/OUT will actually be bitsets
9819         if set. 
9820
9821         * delegate.cs (VerifyMethod): Check also the modifiers.
9822
9823         * cs-tokenizer.cs: Fix bug where floating point values with an
9824         exponent where a sign was missing was ignored.
9825
9826         * driver.cs: Allow multiple assemblies to be specified in a single
9827         /r: argument
9828
9829 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
9830
9831         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
9832         because identifiers after a parenthesis would end up in this kind
9833         of production, and we needed to desamiguate it for having casts
9834         like:
9835
9836                 (UserDefinedType *) xxx
9837
9838 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
9839
9840         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
9841         we should set on the Bindingflags.NonPublic, but not turn on
9842         private_ok.  private_ok controls whether a Private member is
9843         returned (this is chekced on the filter routine), while the
9844         BindingFlags.NonPublic just controls whether private/protected
9845         will be allowed.   This fixes the problem part of the problem of
9846         private properties being allowed to be used in derived classes.
9847
9848         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
9849         so we can call the children DoResolveLValue method (this will
9850         properly signal errors on lvalue assignments to base properties)
9851
9852         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
9853         getter are null, and we have a property info, we know that this
9854         happened because the lookup failed, so we report an error 122 for
9855         protection level violation.
9856
9857         We also silently return if setter and getter are null in the
9858         resolve functions, this condition only happens if we have flagged
9859         the error before.  This is the other half of the problem. 
9860
9861         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
9862         not have accessibility information, that is why we were returning
9863         true in the filter function in typemanager.cs.
9864
9865         To properly report 122 (property is inaccessible because of its
9866         protection level) correctly, we report this error in ResolveAccess
9867         by failing if both the setter and the getter are lacking (ie, the
9868         lookup failed). 
9869
9870         DoResolve and DoLResolve have been modified to check for both
9871         setter/getter being null and returning silently, the reason being
9872         that I did not want to put the knowledge about this error in upper
9873         layers, like:
9874
9875         int old = Report.Errors;
9876         x = new PropertyExpr (...);
9877         if (old != Report.Errors)
9878                 return null;
9879         else
9880                 return x;
9881
9882         So the property expr is returned, but it is invalid, so the error
9883         will be flagged during the resolve process. 
9884
9885         * class.cs: Remove InheritablePropertySignatureCompare from the
9886         class, as we no longer depend on the property signature to compute
9887         whether it is possible to implement a method or not.
9888
9889         The reason is that calling PropertyInfo.GetGetMethod will return
9890         null (in .NET, in Mono it works, and we should change this), in
9891         cases where the Get Method does not exist in that particular
9892         class.
9893
9894         So this code:
9895
9896         class X { public virtual int A { get { return 1; } } }
9897         class Y : X { }
9898         class Z : Y { public override int A { get { return 2; } } }
9899
9900         Would fail in Z because the parent (Y) would not have the property
9901         defined.  So we avoid this completely now (because the alternative
9902         fix was ugly and slow), and we now depend exclusively on the
9903         method names.
9904
9905         (PropertyBase.CheckBase): Use a method-base mechanism to find our
9906         reference method, instead of using the property.
9907
9908         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
9909         routines are gone now.
9910
9911         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
9912         names, they were incorrectly named.
9913
9914         * cs-tokenizer.cs: Return are more gentle token on failure. 
9915
9916         * pending.cs (PendingImplementation.InterfaceMethod): This routine
9917         had an out-of-sync index variable, which caused it to remove from
9918         the list of pending methods the wrong method sometimes.
9919
9920 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
9921
9922         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
9923         CanWrite, because those refer to this particular instance of the
9924         property, and do not take into account the fact that we can
9925         override single members of a property.
9926
9927         Constructor requires an EmitContext.  The resolution process does
9928         not happen here, but we need to compute the accessors before,
9929         because the resolution does not always happen for properties.
9930
9931         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
9932         subclass, before we did not update this flag, but we did update
9933         bindingflags. 
9934
9935         (GetAccessors): Drop this routine, as it did not work in the
9936         presence of partially overwritten set/get methods. 
9937
9938         Notice that this broke the cs1540 detection, but that will require
9939         more thinking. 
9940
9941 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9942
9943         * class.cs:
9944         * codegen.cs:
9945         * driver.cs: issue a warning instead of an error if we don't support
9946         debugging for the platform. Also ignore a couple of errors that may
9947         arise when trying to write the symbols. Undo my previous patch.
9948
9949 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9950
9951         * driver.cs: ignore /debug switch except for Unix platforms.
9952
9953 2002-10-23  Nick Drochak  <ndrochak@gol.com>
9954
9955         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
9956
9957 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
9958
9959         * driver.cs: Do not make mcs-debug conditional, so we do not break
9960         builds that use it.
9961
9962         * statement.cs (UsageVector.MergeChildren): I would like Martin to
9963         review this patch.  But basically after all the children variables
9964         have been merged, the value of "Breaks" was not being set to
9965         new_breaks for Switch blocks.  I think that it should be set after
9966         it has executed.  Currently I set this to the value of new_breaks,
9967         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
9968         conservative, but I do not understand this code very well.
9969
9970         I did not break anything in the build, so that is good ;-)
9971
9972         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
9973
9974 2002-10-20  Mark Crichton  <crichton@gimp.org>
9975
9976         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
9977
9978 2002-10-20  Nick Drochak  <ndrochak@gol.com>
9979
9980         * cfold.cs: Fixed compile blocker.
9981
9982 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
9983
9984         * driver.cs: I was chekcing the key, not the file.
9985
9986 2002-10-19  Ravi Pratap  <ravi@ximian.com>
9987
9988         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
9989         message that we were generating - we just need to silently return
9990         a null.
9991
9992 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
9993
9994         * class.cs (Event.Define): Change my previous commit, as this
9995         breaks the debugger.  This is a temporary hack, as it seems like
9996         the compiler is generating events incorrectly to begin with.
9997
9998         * expression.cs (Binary.ResolveOperator): Added support for 
9999         "U operator - (E x, E y)"
10000
10001         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
10002         y)".
10003
10004         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
10005         init-only variables, but this path did not take into account that
10006         there might be also instance readonly variables.  Correct this
10007         problem. 
10008
10009         This fixes bug 32253
10010
10011         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
10012         delegates as well.
10013
10014         * driver.cs: Change the extension for modules to `netmodule'
10015
10016         * cs-parser.jay: Improved slightly the location tracking for
10017         the debugger symbols.
10018
10019         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
10020         modifiers that were specified instead of the hardcoded value
10021         (FamAndAssem).  This was basically ignoring the static modifier,
10022         and others.  Fixes 32429.
10023
10024         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
10025         fixed a bug in the process (32476)
10026
10027         * expression.cs (ArrayAccess.EmitAssign): Patch from
10028         hwang_rob@yahoo.ca that fixes bug 31834.3
10029
10030 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
10031
10032         * driver.cs: Make the module extension .netmodule.
10033
10034 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
10035
10036         * driver.cs: Report an error if the resource file is not found
10037         instead of crashing.
10038
10039         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
10040         false, like Emit does.
10041
10042 2002-10-16  Nick Drochak  <ndrochak@gol.com>
10043
10044         * typemanager.cs: Remove unused private member.  Also reported mcs
10045         bug to report this as a warning like csc.
10046
10047 2002-10-15  Martin Baulig  <martin@gnome.org>
10048
10049         * statement.cs (Statement.Emit): Made this a virtual method; emits
10050         the line number info and calls DoEmit().
10051         (Statement.DoEmit): New protected abstract method, formerly knows
10052         as Statement.Emit().
10053
10054         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
10055
10056 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
10057
10058         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
10059         have fixed a remaining problem: not every AddXXXX was adding a
10060         fully qualified name.  
10061
10062         Now everyone registers a fully qualified name in the DeclSpace as
10063         being defined instead of the partial name.  
10064
10065         Downsides: we are slower than we need to be due to the excess
10066         copies and the names being registered this way.  
10067
10068         The reason for this is that we currently depend (on the corlib
10069         bootstrap for instance) that types are fully qualified, because
10070         we dump all the types in the namespace, and we should really have
10071         types inserted into the proper namespace, so we can only store the
10072         basenames in the defined_names array.
10073
10074 2002-10-10  Martin Baulig  <martin@gnome.org>
10075
10076         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
10077         from bug #31834, see the bug report for a testcase which is
10078         miscompiled.
10079
10080 2002-10-10  Martin Baulig  <martin@gnome.org>
10081
10082         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
10083         flow analysis code for this.
10084
10085         * statement.cs (Do, While, For): Tell the flow analysis code about
10086         infinite loops.
10087         (FlowBranching.UsageVector): Added support for infinite loops.
10088         (Block.Resolve): Moved the dead code elimination here and use flow
10089         analysis to do it.
10090
10091 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
10092
10093         * class.cs (Field.Define): Catch cycles on struct type
10094         definitions. 
10095
10096         * typemanager.cs (IsUnmanagedtype): Do not recursively check
10097         fields if the fields are static.  We only need to check instance
10098         fields. 
10099
10100         * expression.cs (As.DoResolve): Test for reference type.
10101
10102         * statement.cs (Using.ResolveExpression): Use
10103         ConvertImplicitRequired, not ConvertImplicit which reports an
10104         error on failture
10105         (Using.ResolveLocalVariableDecls): ditto.
10106
10107         * expression.cs (Binary.ResolveOperator): Report errors in a few
10108         places where we had to.
10109
10110         * typemanager.cs (IsUnmanagedtype): Finish implementation.
10111
10112 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
10113
10114         * expression.cs: Use StoreFromPtr instead of extracting the type
10115         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
10116
10117         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
10118         an enumeration value to a System.Enum, but System.Enum is not a
10119         value type, but an class type, so we need to box.
10120
10121         (Expression.ConvertExplicit): One codepath could return
10122         errors but not flag them.  Fix this.  Fixes #31853
10123
10124         * parameter.cs (Resolve): Do not allow void as a parameter type.
10125
10126 2002-10-06  Martin Baulig  <martin@gnome.org>
10127
10128         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
10129         if it's a class type and not a struct.  Fixes #31815.
10130
10131 2002-10-06  Martin Baulig  <martin@gnome.org>
10132
10133         * statement.cs: Reworked the flow analysis code a bit to make it
10134         usable for dead code elimination.
10135
10136 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10137
10138         * cs-parser.jay: allow empty source files. Fixes bug #31781.
10139
10140 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
10141
10142         * expression.cs (ComposedCast.DoResolveType): A quick workaround
10143         to fix the test 165, will investigate deeper.
10144
10145 2002-10-04  Martin Baulig  <martin@gnome.org>
10146
10147         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
10148         finally blocks actually work.
10149         (Try.Resolve): We don't need to create a sibling for `finally' if
10150         there is no finally block.
10151
10152 2002-10-04  Martin Baulig  <martin@gnome.org>
10153
10154         * class.cs (Constructor.Define): The default accessibility for a
10155         non-default constructor is private, not public.
10156
10157 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
10158
10159         * class.cs (Constructor): Make AllowedModifiers public, add
10160         EXTERN.
10161
10162         * cs-parser.jay: Perform the modifiers test here, as the
10163         constructor for the Constructor class usually receives a zero
10164         because of the way we create it (first we create, later we
10165         customize, and we were never checking the modifiers).
10166
10167         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
10168         is a version of LookupTypeReflection that includes the type-name
10169         cache.  This can be used as a fast path for functions that know
10170         the fully qualified name and are only calling into *.GetType() to
10171         obtain a composed type.
10172
10173         This is also used by TypeManager.LookupType during its type
10174         composition.
10175
10176         (LookupType): We now also track the real type name, as sometimes
10177         we can get a quey for the real type name from things like
10178         ComposedCast.  This fixes bug 31422.
10179
10180         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
10181         complete type fullname, it does not have to go through the type
10182         resolution system to obtain the composed version of the type (for
10183         obtaining arrays or pointers).
10184
10185         (Conditional.Emit): Use the EmitBoolExpression to
10186         generate nicer code, as requested by Paolo.
10187
10188         (ArrayCreation.CheckIndices): Use the patch from
10189         hwang_rob@yahoo.ca to validate the array initializers. 
10190
10191 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
10192
10193         * class.cs (ConstructorInitializer.Emit): simplify code by using
10194         Invocation.EmitCall, and at the same time, fix the bugs in calling
10195         parent constructors that took variable arguments. 
10196
10197         * ecore.cs (Expression.ConvertNumericExplicit,
10198         Expression.ImplicitNumericConversion): Remove the code that
10199         manually wrapped decimal (InternalTypeConstructor call is now gone
10200         as well).
10201
10202         * expression.cs (Cast.TryReduce): Also handle decimal types when
10203         trying to perform a constant fold on the type.
10204
10205         * typemanager.cs (IsUnmanagedtype): Partially implemented.
10206
10207         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
10208         that only turned off an error report, and did nothing else. 
10209
10210 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
10211
10212         * driver.cs: Handle and ignore /fullpaths
10213
10214 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
10215
10216         * expression.cs (Binary.ResolveOperator): Catch the case where
10217         DoNumericPromotions returns true, 
10218
10219         (Binary.DoNumericPromotions): Simplify the code, and the tests.
10220
10221 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
10222
10223         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
10224         report error 70.
10225
10226 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
10227
10228         * ecore.cs (ConvertNumericExplicit): It is not enough that the
10229         conversion exists, but it is also required that the conversion be
10230         performed.  This manifested in "(Type64Enum) 2".  
10231
10232         * class.cs (TypeManager.AddMethod): The fix is not to change
10233         AddEnum, because that one was using a fully qualified name (every
10234         DeclSpace derivative does), but to change the AddMethod routine
10235         that was using an un-namespaced name.  This now correctly reports
10236         the duplicated name.
10237
10238         Revert patch until I can properly fix it.  The issue
10239         is that we have a shared Type space across all namespaces
10240         currently, which is wrong.
10241
10242         Options include making the Namespace a DeclSpace, and merge
10243         current_namespace/current_container in the parser.
10244
10245 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
10246
10247         * cs-parser.jay: Improve error reporting when we get a different
10248         kind of expression in local_variable_type and
10249         local_variable_pointer_type. 
10250
10251         Propagate this to avoid missleading errors being reported.
10252
10253         * ecore.cs (ImplicitReferenceConversion): treat
10254         TypeManager.value_type as a target just like object_type.   As
10255         code like this:
10256
10257         ValueType v = 1;
10258
10259         Is valid, and needs to result in the int 1 being boxed before it
10260         is assigned to the value type v.
10261
10262         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
10263         to validate the enumeration name.
10264
10265         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
10266         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
10267         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
10268
10269         * ecore.cs (TryImplicitIntConversion): When doing an
10270         implicit-enumeration-conversion, check if the type is 64-bits and
10271         perform a conversion before passing to EnumConstant.
10272
10273 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
10274
10275         * decl.cs (Error_AmbiguousTypeReference); New routine used to
10276         report ambiguous type references.  Unlike the MS version, we
10277         report what the ambiguity is.   Innovation at work ;-)
10278
10279         (DeclSpace.FindType): Require a location argument to
10280         display when we display an ambiguous error.
10281
10282         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
10283
10284         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
10285
10286         * expression.cs (EmitDynamicInitializers): Apply patch from
10287         hwang_rob@yahoo.ca that fixes the order in which we emit our
10288         initializers. 
10289
10290 2002-09-21  Martin Baulig  <martin@gnome.org>
10291
10292         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
10293         delegate takes no arguments.
10294
10295 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
10296
10297         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
10298         from integers.
10299
10300         * expression.cs: Extract the underlying type.
10301
10302         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
10303
10304         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
10305
10306 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
10307
10308         * class.cs (TypeContainer.DefineType): We can not use the nice
10309         PackingSize with the size set to 1 DefineType method, because it
10310         will not allow us to define the interfaces that the struct
10311         implements.
10312
10313         This completes the fixing of bug 27287
10314
10315         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
10316         means also structs.  This fixes part of the problem. 
10317         (Expresion.ImplicitReferenceConversionExists): ditto.
10318
10319         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
10320         error if there were no errors reported during the type lookup
10321         process, to avoid duplicates or redundant errors.  Without this
10322         you would get an ambiguous errors plus a type not found.  We have
10323         beaten the user enough with the first error.  
10324
10325         (DeclSparce.FindType): Emit a warning if we have an ambiguous
10326         reference. 
10327
10328         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
10329         during the resolution process, stop the lookup, this avoids
10330         repeated error reports (same error twice).
10331
10332         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
10333
10334         * typemanager.cs (LookupType): Redo the type lookup code to match
10335         the needs of System.Reflection.  
10336
10337         The issue is that System.Reflection requires references to nested
10338         types to begin with a "+" sign instead of a dot.  So toplevel
10339         types look like: "NameSpace.TopLevelClass", and nested ones look
10340         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
10341         levels. 
10342
10343 2002-09-19  Martin Baulig  <martin@gnome.org>
10344
10345         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
10346         says that a method always returns or always throws an exception,
10347         don't report the CS0161.
10348
10349         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
10350         set `Returns = new_returns'.
10351
10352 2002-09-19  Martin Baulig  <martin@gnome.org>
10353
10354         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
10355         to an enum constant, check for a CS0176.
10356
10357 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
10358
10359         * class.cs (TypeContainer.CheckPairedOperators): Now we check
10360         for operators that must be in pairs and report errors.
10361
10362         * ecore.cs (SimpleName.DoResolveType): During the initial type
10363         resolution process, when we define types recursively, we must
10364         check first for types in our current scope before we perform
10365         lookups in the enclosing scopes.
10366
10367         * expression.cs (MakeByteBlob): Handle Decimal blobs.
10368
10369         (Invocation.VerifyArgumentsCompat): Call
10370         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
10371         I thought we were supposed to always call this, but there are a
10372         few places in the code where we dont do it.
10373
10374 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
10375
10376         * driver.cs: Add support in -linkres and -resource to specify the
10377         name of the identifier.
10378
10379 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
10380
10381         * ecore.cs (StandardConversionExists): Sync with the conversion
10382         code: allow anything-* to void* conversions.
10383
10384         (FindMostSpecificSource): Use an Expression argument
10385         instead of a Type, because we might be handed over a Literal which
10386         gets a few more implicit conversions that plain types do not.  So
10387         this information was being lost.
10388
10389         Also, we drop the temporary type-holder expression when not
10390         required.
10391
10392 2002-09-17  Martin Baulig  <martin@gnome.org>
10393
10394         * class.cs (PropertyBase.CheckBase): Don't check the base class if
10395         this is an explicit interface implementation.
10396
10397 2002-09-17  Martin Baulig  <martin@gnome.org>
10398
10399         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
10400         different `IndexerName' attributes.
10401
10402         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
10403         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
10404         virtual CommonResolve().
10405
10406 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
10407
10408         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
10409         and convert that to the UnderlyingType.
10410
10411         * statement.cs (Foreach.Resolve): Indexers are just like variables
10412         or PropertyAccesses.
10413
10414         * cs-tokenizer.cs (consume_string): Track line numbers and columns
10415         inside quoted strings, we were not doing this before.
10416
10417 2002-09-16  Martin Baulig  <martin@gnome.org>
10418
10419         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
10420         resolve it.  This is needed for the definite assignment check of the
10421         instance expression, fixes bug #29846.
10422         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
10423
10424 2002-09-16  Nick Drochak  <ndrochak@gol.com>
10425
10426         * parameter.cs: Fix compile error.  Cannot reference static member
10427         from an instance object.  Is this an mcs bug?
10428
10429 2002-09-14  Martin Baulig  <martin@gnome.org>
10430
10431         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
10432         multiple times.  Fixes bug #30295, added test-166.cs.
10433
10434 2002-09-14  Martin Baulig  <martin@gnome.org>
10435
10436         * statement.cs (Block.Emit): Don't emit unreachable code.
10437         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
10438         `break' statements.
10439         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
10440
10441 2002-09-14  Martin Baulig  <martin@gnome.org>
10442
10443         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
10444         is set.
10445
10446 2002-09-14  Martin Baulig  <martin@gnome.org>
10447
10448         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
10449         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
10450         be false on the ms runtime.
10451
10452 2002-09-13  Martin Baulig  <martin@gnome.org>
10453
10454         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
10455         the CS0038 error message.
10456
10457 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
10458
10459         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
10460         constant inside, return it.
10461
10462 2002-09-12  Martin Baulig  <martin@gnome.org>
10463
10464         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
10465         implicit conversion can be done between enum types.
10466
10467         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
10468         check whether an implicit conversion to the current enum's UnderlyingType
10469         exists and report an error if not.
10470
10471         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
10472         without debugging support.
10473
10474         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
10475         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
10476
10477 2002-09-12  Martin Baulig  <martin@gnome.org>
10478
10479         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
10480
10481         * ecore.cs (IMemberExpr.DeclaringType): New property.
10482         (SimpleName.SimpleNameResolve): Check whether we're accessing a
10483         nonstatic member of an outer type (CS0038).
10484
10485 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
10486
10487         * driver.cs: Activate the using-error detector at warning level
10488         4 (at least for MS-compatible APIs).
10489
10490         * namespace.cs (VerifyUsing): Small buglett fix.
10491
10492         * pending.cs (PendingImplementation): pass the container pointer. 
10493
10494         * interface.cs (GetMethods): Allow for recursive definition.  Long
10495         term, I would like to move every type to support recursive
10496         definitions, not the current ordering mechanism that we have right
10497         now.
10498
10499         The situation is this: Attributes are handled before interfaces,
10500         so we can apply attributes to interfaces.  But some attributes
10501         implement interfaces, we will now handle the simple cases
10502         (recursive definitions will just get an error).  
10503
10504         * parameter.cs: Only invalidate types at the end if we fail to
10505         lookup all types.  
10506
10507 2002-09-09  Martin Baulig  <martin@gnome.org>
10508
10509         * ecore.cs (PropertyExpr.Emit): Also check for
10510         TypeManager.system_int_array_get_length so this'll also work when
10511         compiling corlib.  Fixes #30003.
10512
10513 2002-09-09  Martin Baulig  <martin@gnome.org>
10514
10515         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
10516         and throw an exception if we can't get the type's size.  Fixed #30040,
10517         added test-165.cs.
10518
10519 2002-09-09  Martin Baulig  <martin@gnome.org>
10520
10521         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
10522
10523         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
10524         context.  Fixes bug #30027.
10525
10526         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
10527         virtual functions.  Fixes bug #30043, added test-164.cs.
10528
10529 2002-09-08  Ravi Pratap  <ravi@ximian.com>
10530
10531         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
10532
10533 2002-09-08  Nick Drochak  <ndrochak@gol.com>
10534
10535         * driver.cs: Use an object to get the windows codepage since it's not a
10536         static property.
10537
10538 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
10539
10540         * statement.cs (For.Emit): for infinite loops (test == null)
10541         return whether there is a break inside, not always "true".
10542
10543         * namespace.cs (UsingEntry): New struct to hold the name of the
10544         using definition, the location where it is defined, and whether it
10545         has been used in a successful type lookup.
10546
10547         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
10548         strings.
10549
10550         * decl.cs: ditto.
10551
10552 2002-09-06  Ravi Pratap  <ravi@ximian.com>
10553
10554         * attribute.cs : Fix incorrect code which relied on catching
10555         a NullReferenceException to detect a null being passed in
10556         where an object was expected.
10557
10558 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
10559
10560         * statement.cs (Try): flag the catch variable as assigned
10561
10562         * expression.cs (Cast): Simplified by using ResolveType instead of
10563         manually resolving.
10564
10565         * statement.cs (Catch): Fix bug by using ResolveType.
10566
10567 2002-09-06  Ravi Pratap  <ravi@ximian.com>
10568
10569         * expression.cs (BetterConversion): Special case for when we have
10570         a NullLiteral as the argument and we have to choose between string
10571         and object types - we choose string the way csc does.
10572
10573         * attribute.cs (Attribute.Resolve): Catch the
10574         NullReferenceException and report error #182 since the Mono
10575         runtime no more has the bug and having this exception raised means
10576         we tried to select a constructor which takes an object and is
10577         passed a null.
10578
10579 2002-09-05  Ravi Pratap  <ravi@ximian.com>
10580
10581         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
10582         message (1502, 1503) when we can't locate a method after overload
10583         resolution. This is much more informative and closes the bug
10584         Miguel reported.
10585
10586         * interface.cs (PopulateMethod): Return if there are no argument
10587         types. Fixes a NullReferenceException bug.
10588
10589         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
10590         expressions too. Previously we were checking only in one place for
10591         positional arguments leaving out named arguments.
10592
10593         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
10594         type to the enum type is not allowed. Remove code corresponding to
10595         that.
10596
10597         (ConvertNumericExplicit): Allow explicit conversions from
10598         the underlying type to enum type. This precisely follows the spec
10599         and closes a bug filed by Gonzalo.
10600
10601 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10602
10603         * compiler.csproj:
10604         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
10605
10606 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
10607
10608         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
10609         it was important that we stored the right value after the
10610         reduction in `converted'.
10611
10612 2002-09-04  Martin Baulig  <martin@gnome.org>
10613
10614         * location.cs (Location.SymbolDocument): Use full pathnames for the
10615         source files.
10616
10617 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
10618
10619         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
10620         of the expression resolve mechanism, because that will catch the
10621         SimpleName error failures.
10622
10623         (Conditional): If we can not resolve the
10624         expression, return, do not crash.
10625
10626 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10627
10628         * cs-tokenizer.cs:
10629         (location): display token name instead of its number.
10630
10631 2002-08-28  Martin Baulig  <martin@gnome.org>
10632
10633         * expression.cs (Binary.ResolveOperator): Don't silently return
10634         but return an error if an operator cannot be applied between two
10635         enum types.
10636
10637 2002-08-28  Martin Baulig  <martin@gnome.org>
10638
10639         * class.cs (Constructor.Define): Set the permission attributes
10640         correctly instead of making all constructors public.
10641
10642 2002-08-28  Martin Baulig  <martin@gnome.org>
10643
10644         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
10645         for private members before reporting a CS0103; if we find anything,
10646         it's a CS0122.
10647
10648 2002-08-28  Martin Baulig  <martin@gnome.org>
10649
10650         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
10651         to check whether `closure_start_type == closure_invocation_type',
10652         we also need to check whether `m.DeclaringType == closure_invocation_type'
10653         before bypassing the permission checks.  We might be accessing
10654         protected/private members from the base class.
10655         (TypeManager.RealMemberLookup): Only set private_ok if private
10656         members were requested via BindingFlags.NonPublic.
10657
10658         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
10659
10660         * expression.cs (MemberAccess.ResolveMemberAccess): Set
10661         MethodGroupExpr.IsExplicitImpl if appropriate.
10662         (Invocation.DoResolve): Don't report the CS0120 for explicit
10663         interface implementations.
10664
10665 2002-08-27  Martin Baulig  <martin@gnome.org>
10666
10667         * expression.cs (Invocation.DoResolve): If this is a static
10668         method and we don't have an InstanceExpression, we must report
10669         a CS0120.
10670
10671 2002-08-25  Martin Baulig  <martin@gnome.org>
10672
10673         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
10674         `==' between a valuetype and an object.
10675
10676 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
10677
10678         * ecore.cs (TypeExpr): Provide a ToString method.
10679
10680 2002-08-24  Martin Baulig  <martin@gnome.org>
10681
10682         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
10683         now called proggie.dbg and it's a binary file.
10684
10685 2002-08-23  Martin Baulig  <martin@gnome.org>
10686
10687         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
10688
10689 2002-08-23  Martin Baulig  <martin@gnome.org>
10690
10691         * struct.cs (MyStructInfo.ctor): Make this work with empty
10692         structs; it's not allowed to use foreach() on null.
10693
10694 2002-08-23  Martin Baulig  <martin@gnome.org>
10695
10696         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
10697         writer the full pathname of the generated assembly.
10698
10699 2002-08-23  Martin Baulig  <martin@gnome.org>
10700
10701         * statements.cs (FlowBranching.UsageVector.MergeChildren):
10702         A `finally' block never returns or breaks; improved handling of
10703         unreachable code.
10704
10705 2002-08-23  Martin Baulig  <martin@gnome.org>
10706
10707         * statement.cs (Throw.Resolve): Allow `throw null'.
10708
10709 2002-08-23  Martin Baulig  <martin@gnome.org>
10710
10711         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
10712         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
10713         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
10714         MemberLookup would return a wrong event if this is an explicit
10715         interface implementation and the class has an event with the same
10716         name.
10717
10718 2002-08-23  Martin Baulig  <martin@gnome.org>
10719
10720         * statement.cs (Block.AddChildVariableNames): New public method.
10721         (Block.AddChildVariableName): Likewise.
10722         (Block.IsVariableNameUsedInChildBlock): Likewise.
10723         (Block.AddVariable): Check whether a variable name has already
10724         been used in a child block.
10725
10726         * cs-parser.jay (declare_local_variables): Mark all variable names
10727         from the current block as being used in a child block in the
10728         implicit block.
10729
10730 2002-08-23  Martin Baulig  <martin@gnome.org>
10731
10732         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
10733         find the symbol writer.
10734
10735         * driver.cs: csc also allows the arguments to /define being
10736         separated by commas, not only by semicolons.
10737
10738 2002-08-23  Martin Baulig  <martin@gnome.org>
10739
10740         * interface.cs (Interface.GetMembers): Added static check for events.
10741
10742 2002-08-15  Martin Baulig  <martin@gnome.org>
10743
10744         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
10745         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
10746
10747         * ecore.cs (Expression.MemberLookup): Added documentation and explained
10748         why the MethodData.EmitDestructor() change was necessary.
10749
10750 2002-08-20  Martin Baulig  <martin@gnome.org>
10751
10752         * class.cs (TypeContainer.FindMembers): Added static check for events.
10753
10754         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
10755
10756         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
10757         use Type.GetEvents(), not Type.FindMembers().
10758
10759 2002-08-20  Martin Baulig  <martin@gnome.org>
10760
10761         * decl.cs (MemberCache): Added a special method cache which will
10762         be used for method-only searched.  This ensures that a method
10763         search will return a MethodInfo with the correct ReflectedType for
10764         inherited methods.      
10765
10766 2002-08-20  Martin Baulig  <martin@gnome.org>
10767
10768         * decl.cs (DeclSpace.FindMembers): Made this public.
10769
10770 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10771
10772         * delegate.cs: fixed build on windows.
10773         [FIXME:  Filed as bug #29150: MCS must report these errors.]
10774
10775 2002-08-19  Ravi Pratap  <ravi@ximian.com>
10776
10777         * ecore.cs (StandardConversionExists): Return a false
10778         if we are trying to convert the void type to anything else
10779         since that is not allowed.
10780
10781         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
10782         we flag error 70 in the event an event is trying to be accessed
10783         directly from outside the declaring type.
10784
10785 2002-08-20  Martin Baulig  <martin@gnome.org>
10786
10787         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
10788         MemberCache from typemanager.cs to decl.cs.
10789
10790 2002-08-19  Martin Baulig  <martin@gnome.org>
10791
10792         * class.cs (TypeContainer): Implement IMemberContainer.
10793         (TypeContainer.DefineMembers): Create the MemberCache.
10794         (TypeContainer.FindMembers): Do better BindingFlags checking; only
10795         return public members if BindingFlags.Public was given, check
10796         whether members are static.
10797
10798 2002-08-16  Martin Baulig  <martin@gnome.org>
10799
10800         * decl.cs (DeclSpace.Define): Splitted this in Define and
10801         DefineMembers.  DefineMembers is called first and initializes the
10802         MemberCache.
10803
10804         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
10805         DefineMembers() on all our DeclSpaces.
10806
10807         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
10808         but call DefineMembers() on all nested interfaces.  We call their
10809         Define() in our new Define() function.
10810
10811         * interface.cs (Interface): Implement IMemberContainer.
10812         (Interface.Define): Moved all code except the attribute stuf to
10813         DefineMembers().
10814         (Interface.DefineMembers): Initialize the member cache.
10815
10816         * typemanager.cs (IMemberFinder): Removed this interface, we don't
10817         need this anymore since we can use MemberCache.FindMembers directly.
10818
10819 2002-08-19  Martin Baulig  <martin@gnome.org>
10820
10821         * typemanager.cs (MemberCache): When creating the cache for an
10822         interface type, add all inherited members.
10823         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
10824         to `out bool used_cache' and documented it.
10825         (TypeManager.MemberLookup): If we already used the cache in the first
10826         iteration, we don't need to do the interfaces check.
10827
10828 2002-08-19  Martin Baulig  <martin@gnome.org>
10829
10830         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
10831         here from IMemberFinder and don't implement this interface anymore.
10832         (DeclSpace.MemberCache): Moved here from IMemberFinder.
10833
10834         * typemanager.cs (IMemberFinder): This interface is now only used by
10835         classes which actually support the member cache.
10836         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
10837         since we only put DeclSpaces into this Hashtable.
10838         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
10839         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
10840
10841 2002-08-16  Martin Baulig  <martin@gnome.org>
10842
10843         * typemanager.cs (ICachingMemberFinder): Removed.
10844         (IMemberFinder.MemberCache): New property.
10845         (TypeManager.FindMembers): Merged this with RealFindMembers().
10846         This function will never be called from TypeManager.MemberLookup()
10847         so we can't use the cache here, just the IMemberFinder.
10848         (TypeManager.MemberLookup_FindMembers): Check whether the
10849         IMemberFinder has a MemberCache and call the cache's FindMembers
10850         function.
10851         (MemberCache): Rewrote larger parts of this yet another time and
10852         cleaned it up a bit.
10853
10854 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
10855
10856         * driver.cs (LoadArgs): Support quoting.
10857
10858         (Usage): Show the CSC-like command line arguments.
10859
10860         Improved a few error messages.
10861
10862 2002-08-15  Martin Baulig  <martin@gnome.org>
10863
10864         * typemanager.cs (IMemberContainer.Type): New property.
10865         (IMemberContainer.IsInterface): New property.
10866
10867         The following changes are conditional to BROKEN_RUNTIME, which is
10868         defined at the top of the file.
10869
10870         * typemanager.cs (MemberCache.MemberCache): Don't add the base
10871         class'es members, but add all members from TypeHandle.ObjectType
10872         if we're an interface.
10873         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
10874         is the current type.
10875         (MemberCache.CacheEntry.Container): Removed this field.
10876         (TypeHandle.GetMembers): Include inherited members.
10877
10878 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10879
10880         * typemanager.cs: fixed compilation and added a comment on a field that
10881         is never used.
10882
10883 2002-08-15  Martin Baulig  <martin@gnome.org>
10884
10885         * class.cs (ConstructorInitializer.Resolve): In the
10886         Expression.MemberLookup call, use the queried_type as
10887         invocation_type.
10888
10889         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
10890         declared' attribute, it's always true.
10891         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
10892         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
10893         temporary wrapper for FindMembers which tells MemberLookup whether
10894         members from the base classes are included in the return value.
10895         This will go away soon.
10896         (TypeManager.MemberLookup): Use this temporary hack here; once the
10897         new MemberCache is completed, we don't need to do the DeclaredOnly
10898         looping here anymore since the MemberCache will take care of this.
10899         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
10900         (MemberCache): When creating the MemberCache for a class, get
10901         members from the current class and all its base classes.
10902         (MemberCache.CacheEntry.Container): New field.  This is a
10903         temporary hack until the Mono runtime is fixed to distinguish
10904         between ReflectedType and DeclaringType.  It allows us to use MCS
10905         with both the MS runtime and the unfixed Mono runtime without
10906         problems and without accecting performance.
10907         (MemberCache.SearchMembers): The DeclaredOnly looping from
10908         TypeManager.MemberLookup is now done here.      
10909
10910 2002-08-14  Martin Baulig  <martin@gnome.org>
10911
10912         * statement.cs (MyStructInfo.MyStructInfo): Don't call
10913         Type.GetFields on dynamic types but get the fields from the
10914         corresponding TypeContainer.
10915         (MyStructInfo.GetStructInfo): Added check for enum types.
10916
10917         * typemanager.cs (MemberList.IsSynchronized): Implemented.
10918         (MemberList.SyncRoot): Implemented.
10919         (TypeManager.FilterWithClosure): No need to check permissions if
10920         closure_start_type == closure_invocation_type, don't crash if
10921         closure_invocation_type is null.
10922
10923 2002-08-13  Martin Baulig  <martin@gnome.org>
10924
10925         Rewrote TypeContainer.FindMembers to use a member cache.  This
10926         gives us a speed increase of about 35% for the self-hosting MCS
10927         build and of about 15-20% for the class libs (both on GNU/Linux).
10928
10929         * report.cs (Timer): New class to get enhanced profiling.  This
10930         whole class is "TIMER" conditional since it remarkably slows down
10931         compilation speed.
10932
10933         * class.cs (MemberList): New class.  This is an IList wrapper
10934         which we're now using instead of passing MemberInfo[]'s around to
10935         avoid copying this array unnecessarily.
10936         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
10937         (ICachingMemberFinder, IMemberContainer): New interface.
10938         (TypeManager.FilterWithClosure): If `criteria' is null, the name
10939         has already been checked, otherwise use it for the name comparision.
10940         (TypeManager.FindMembers): Renamed to RealMemberFinder and
10941         provided wrapper which tries to use ICachingMemberFinder.FindMembers
10942         if possible.  Returns a MemberList, not a MemberInfo [].
10943         (TypeHandle): New class, implements IMemberContainer.  We create
10944         one instance of this class per type, it contains a MemberCache
10945         which is used to do the member lookups.
10946         (MemberCache): New class.  Each instance of this class contains
10947         all members of a type and a name-based hash table.
10948         (MemberCache.FindMembers): This is our new member lookup
10949         function.  First, it looks up all members of the requested name in
10950         the hash table.  Then, it walks this list and sorts out all
10951         applicable members and returns them.
10952
10953 2002-08-13  Martin Baulig  <martin@gnome.org>
10954
10955         In addition to a nice code cleanup, this gives us a performance
10956         increase of about 1.4% on GNU/Linux - not much, but it's already
10957         half a second for the self-hosting MCS compilation.
10958
10959         * typemanager.cs (IMemberFinder): New interface.  It is used by
10960         TypeManager.FindMembers to call FindMembers on a TypeContainer,
10961         Enum, Delegate or Interface.
10962         (TypeManager.finder_to_member_finder): New PtrHashtable.
10963         (TypeManager.finder_to_container): Removed.
10964         (TypeManager.finder_to_delegate): Removed.
10965         (TypeManager.finder_to_interface): Removed.
10966         (TypeManager.finder_to_enum): Removed.
10967
10968         * interface.cs (Interface): Implement IMemberFinder.
10969
10970         * delegate.cs (Delegate): Implement IMemberFinder.
10971
10972         * enum.cs (Enum): Implement IMemberFinder.
10973
10974         * class.cs (TypeContainer): Implement IMemberFinder.
10975
10976 2002-08-12  Martin Baulig  <martin@gnome.org>
10977
10978         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
10979
10980 2002-08-12  Martin Baulig  <martin@gnome.org>
10981
10982         * ecore.cs (ITypeExpression): New interface for expressions which
10983         resolve to a type.
10984         (TypeExpression): Renamed to TypeLookupExpression.
10985         (Expression.DoResolve): If we're doing a types-only lookup, the
10986         expression must implement the ITypeExpression interface and we
10987         call DoResolveType() on it.
10988         (SimpleName): Implement the new ITypeExpression interface.
10989         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
10990         hack, the situation that we're only looking up types can't happen
10991         anymore when this method is called.  Moved the type lookup code to
10992         DoResolveType() and call it.
10993         (SimpleName.DoResolveType): This ITypeExpression interface method
10994         is now doing the types-only lookup.
10995         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
10996         (ResolveFlags): Added MaskExprClass.
10997
10998         * expression.cs (MemberAccess): Implement the ITypeExpression
10999         interface.
11000         (MemberAccess.DoResolve): Added support for a types-only lookup
11001         when we're called via ITypeExpression.DoResolveType().
11002         (ComposedCast): Implement the ITypeExpression interface.
11003
11004         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
11005         Expression.Resolve() with ResolveFlags.Type instead.
11006
11007 2002-08-12  Martin Baulig  <martin@gnome.org>
11008
11009         * interface.cs (Interface.Define): Apply attributes.
11010
11011         * attribute.cs (Attribute.ApplyAttributes): Added support for
11012         interface attributes.
11013
11014 2002-08-11  Martin Baulig  <martin@gnome.org>
11015
11016         * statement.cs (Block.Emit): Only check the "this" variable if we
11017         do not always throw an exception.
11018
11019         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
11020         whether the property has a set accessor.
11021
11022 2002-08-11  Martin Baulig  <martin@gnome.org>
11023
11024         Added control flow analysis support for structs.
11025
11026         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
11027         with control flow analysis turned off.
11028         (IVariable): New interface.
11029         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
11030         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
11031         (FieldExpr.DoResolve): Resolve the instance expression with flow
11032         analysis turned off and do the definite assignment check after the
11033         resolving when we know what the expression will resolve to.
11034
11035         * expression.cs (LocalVariableReference, ParameterReference):
11036         Implement the new IVariable interface, only call the flow analysis
11037         code if ec.DoFlowAnalysis is true.
11038         (This): Added constructor which takes a Block argument.  Implement
11039         the new IVariable interface.
11040         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
11041         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
11042         This does the definite assignment checks for struct members.
11043
11044         * class.cs (Constructor.Emit): If this is a non-static `struct'
11045         constructor which doesn't have any initializer, call
11046         Block.AddThisVariable() to tell the flow analysis code that all
11047         struct elements must be initialized before control returns from
11048         the constructor.
11049
11050         * statement.cs (MyStructInfo): New public class.
11051         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
11052         argument to this indexer.  If non-zero, check an individual struct
11053         member, not the whole struct.
11054         (FlowBranching.CheckOutParameters): Check struct members.
11055         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
11056         overloaded versions of these methods which take an additional
11057         `int field_idx' argument to check struct members.
11058         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
11059         overloaded versions of these methods which take an additional
11060         `string field_name' argument to check struct member.s
11061         (VariableInfo): Implement the IVariable interface.
11062         (VariableInfo.StructInfo): New public property.  Returns the
11063         MyStructInfo instance of the variable if it's a struct or null.
11064         (Block.AddThisVariable): New public method.  This is called from
11065         Constructor.Emit() for non-static `struct' constructor which do
11066         not have any initializer.  It creates a special variable for the
11067         "this" instance variable which will be checked by the flow
11068         analysis code to ensure that all of the struct's fields are
11069         initialized before control returns from the constructor.
11070         (UsageVector): Added support for struct members.  If a
11071         variable/parameter is a struct with N members, we reserve a slot
11072         in the usage vector for each member.  A struct is considered fully
11073         initialized if either the struct itself (slot 0) or all its
11074         members are initialized.
11075
11076 2002-08-08  Martin Baulig  <martin@gnome.org>
11077
11078         * driver.cs (Driver.MainDriver): Only report an error CS5001
11079         if there were no compilation errors.
11080
11081         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
11082         `UnsafeContext' property to determine whether the parent is in
11083         unsafe context rather than checking the parent's ModFlags:
11084         classes nested in an unsafe class are unsafe as well.
11085
11086 2002-08-08  Martin Baulig  <martin@gnome.org>
11087
11088         * statement.cs (UsageVector.MergeChildren): Distinguish between
11089         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
11090         we return.  Added test17() and test18() to test-154.cs.
11091
11092 2002-08-08  Martin Baulig  <martin@gnome.org>
11093
11094         * typemanager.cs (TypeManager.FilterWithClosure): If we have
11095         Family access, make sure the invoking type isn't a subclass of the
11096         queried type (that'd be a CS1540).
11097
11098         * ecore.cs (Expression.MemberLookup): Added overloaded version of
11099         this method which takes an additional `Type invocation_type'.
11100
11101         * expression.cs (BaseAccess.DoResolve): Use the base type as
11102         invocation and query type.
11103         (MemberAccess.DoResolve): If the lookup failed and we're about to
11104         report a CS0122, try a lookup with the ec.ContainerType - if this
11105         succeeds, we must report a CS1540.
11106
11107 2002-08-08  Martin Baulig  <martin@gnome.org>
11108
11109         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
11110         (MethodGroupExpr): Implement the IMemberExpr interface.
11111
11112         * expression (MemberAccess.ResolveMemberAccess): No need to have
11113         any special code for MethodGroupExprs anymore, they're now
11114         IMemberExprs.   
11115
11116 2002-08-08  Martin Baulig  <martin@gnome.org>
11117
11118         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
11119         Family, FamANDAssem and FamORAssem permissions.
11120         (TypeManager.IsSubclassOrNestedChildOf): New public method.
11121
11122 2002-08-08  Martin Baulig  <martin@gnome.org>
11123
11124         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
11125         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
11126         or loop block.
11127
11128 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
11129
11130         * driver.cs: implemented /resource option to embed managed resources.
11131
11132 2002-08-07  Martin Baulig  <martin@gnome.org>
11133
11134         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
11135         (FieldBase.HasFieldInitializer): New public property.
11136         (FieldBase.GetInitializerExpression): New public method.  Resolves and
11137         returns the field initializer and makes sure it is only resolved once.
11138         (TypeContainer.EmitFieldInitializers): Call
11139         FieldBase.GetInitializerExpression to get the initializer, this ensures
11140         that it isn't resolved multiple times.
11141
11142         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
11143         the resolving process (SimpleName/MemberLookup) that we're currently
11144         emitting a field initializer (which must not access any instance members,
11145         this is an error CS0236).
11146
11147         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
11148         argument, if the `IsFieldInitializer' flag is set, we must report and
11149         error CS0236 and not an error CS0120.   
11150
11151 2002-08-07  Martin Baulig  <martin@gnome.org>
11152
11153         * ecore.cs (IMemberExpr): New public interface.
11154         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
11155         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
11156         if the expression is an IMemberExpr.
11157
11158         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
11159         to be null, implicitly default to `this' if we're non-static in
11160         this case.  Simplified the code a lot by using the new IMemberExpr
11161         interface.  Also fixed bug #28176 here.
11162
11163 2002-08-06  Martin Baulig  <martin@gnome.org>
11164
11165         * cs-parser.jay (SimpleLookup): Removed.  We need to create
11166         ParameterReferences during semantic analysis so that we can do a
11167         type-only search when resolving Cast, TypeOf and SizeOf.
11168         (block): Pass the `current_local_parameters' to the Block's
11169         constructor.
11170
11171         * class.cs (ConstructorInitializer): Added `Parameters parameters'
11172         argument to the constructor.
11173         (ConstructorInitializer.Resolve): Create a temporary implicit
11174         block with the parameters.
11175
11176         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
11177         references here if we aren't doing a type-only search.
11178
11179         * statement.cs (Block): Added constructor which takes a
11180         `Parameters parameters' argument.
11181         (Block.Parameters): New public property.
11182
11183         * support.cs (InternalParameters.Parameters): Renamed `parameters'
11184         to `Parameters' and made it public readonly.
11185
11186 2002-08-06  Martin Baulig  <martin@gnome.org>
11187
11188         * ecore.cs (Expression.Warning): Made this public as well.
11189
11190         * report.cs (Report.Debug): Print the contents of collections.
11191
11192 2002-08-06  Martin Baulig  <martin@gnome.org>
11193
11194         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
11195         used to tell Resolve() which kinds of expressions it may return.
11196         (Expression.Resolve): Added overloaded version of this method which
11197         takes a `ResolveFlags flags' argument.  This can be used to tell
11198         Resolve() which kinds of expressions it may return.  Reports a
11199         CS0118 on error.
11200         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
11201         ResolveFlags.SimpleName.
11202         (Expression.Error118): Added overloaded version of this method which
11203         takes a `ResolveFlags flags' argument.  It uses the flags to determine
11204         which kinds of expressions are allowed.
11205
11206         * expression.cs (Argument.ResolveMethodGroup): New public method.
11207         Resolves an argument, but allows a MethodGroup to be returned.
11208         This is used when invoking a delegate.
11209
11210         * TODO: Updated a bit.
11211
11212 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11213
11214         Fixed compilation with csc.
11215
11216         * ecore.cs: Expression.Error made public. Is this correct? Should
11217         Warning be made public too?
11218
11219         * expression.cs: use ea.Location instead of ea.loc.
11220         [FIXME:  Filed as bug #28607: MCS must report these errors.]
11221
11222 2002-08-06  Martin Baulig  <martin@gnome.org>
11223
11224         * ecore.cs (Expression.loc): Moved the location here instead of
11225         duplicating it in all derived classes.
11226         (Expression.Location): New public property.
11227         (Expression.Error, Expression.Warning): Made them non-static and
11228         removed the location argument.
11229         (Expression.Warning): Added overloaded version which takes an
11230         `int level' argument.
11231         (Expression.Error118): Make this non-static and removed the
11232         expression and location arguments.
11233         (TypeExpr): Added location argument to the constructor.
11234
11235         * expression.cs (StaticCallExpr): Added location argument to
11236         the constructor.
11237         (Indirection, PointerArithmetic): Likewise.
11238         (CheckedExpr, UnCheckedExpr): Likewise.
11239         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
11240         (StringPtr): Likewise.
11241
11242
11243 2002-08-05  Martin Baulig  <martin@gnome.org>
11244
11245         * expression.cs (BaseAccess.DoResolve): Actually report errors.
11246
11247         * assign.cs (Assign.DoResolve): Check whether the source
11248         expression is a value or variable.
11249
11250         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
11251         while resolving the corresponding blocks.
11252
11253         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
11254         an error, don't silently return null.
11255
11256         * statement.cs (Block.AddVariable): Do the error reporting here
11257         and distinguish between CS0128 and CS0136.
11258         (Block.DoResolve): Report all unused labels (warning CS0164).
11259         (LabeledStatement): Pass the location to the constructor.
11260         (LabeledStatement.HasBeenReferenced): New property.
11261         (LabeledStatement.Resolve): Set it to true here.
11262
11263         * statement.cs (Return.Emit): Return success even after reporting
11264         a type mismatch error (CS0126 or CS0127), this is what csc does and
11265         it avoids confusing the users with any consecutive errors.
11266
11267 2002-08-05  Martin Baulig  <martin@gnome.org>
11268
11269         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
11270
11271         * const.cs (Const.LookupConstantValue): Catch circular definitions.
11272
11273         * expression.cs (MemberAccess.DoResolve): Silently return if an
11274         error has already been reported.
11275
11276         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
11277         error has already been reported.
11278
11279 2002-08-05  Martin Baulig  <martin@gnome.org>
11280
11281         * statement.cs (UsageVector): Only initialize the `parameters'
11282         vector if we actually have any "out" parameters.
11283
11284 2002-08-05  Martin Baulig  <martin@gnome.org>
11285
11286         * expression.cs (Binary.ResolveOperator): When combining delegates,
11287         they must have the same type.
11288
11289 2002-08-05  Martin Baulig  <martin@gnome.org>
11290
11291         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
11292         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
11293         work with the ms runtime and we also don't need it: if we're a
11294         PropertyBuilder and not in the `indexer_arguments' hash, then we
11295         are a property and not an indexer.
11296
11297         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
11298         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
11299         since the latter one doesn't work with the ms runtime.
11300
11301 2002-08-03  Martin Baulig  <martin@gnome.org>
11302
11303         Fixed bugs #27998 and #22735.
11304
11305         * class.cs (Method.IsOperator): New public field.
11306         (Method.CheckBase): Report CS0111 if there's already a method
11307         with the same parameters in the current class.  Report CS0508 when
11308         attempting to change the return type of an inherited method.
11309         (MethodData.Emit): Report CS0179 if a method doesn't have a body
11310         and it's not marked abstract or extern.
11311         (PropertyBase): New abstract base class for Property and Indexer.
11312         (PropertyBase.CheckBase): Moved here from Property and made it work
11313         for indexers.
11314         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
11315         the same so we can reuse it there.
11316         (Property, Indexer): Derive from PropertyBase.
11317         (MethodSignature.inheritable_property_signature_filter): New delegate
11318         to find properties and indexers.
11319
11320         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
11321         argument and improved error reporting.
11322
11323         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
11324         EmptyReadOnlyParameters and made it a property.
11325
11326         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
11327         version of this method which takes a `PropertyInfo indexer'.
11328         (TypeManager.RegisterIndexer): New method.
11329
11330         * class.cs: Added myself as author of this file :-)
11331
11332 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11333
11334         * class.cs: fixed compilation on windoze.
11335
11336 2002-08-03  Martin Baulig  <martin@gnome.org>
11337
11338         * interface.cs (Interface.GetInterfaceBases): Check whether all
11339         base interfaces are at least as accessible than the current one.
11340
11341         * class.cs (TypeContainer.GetClassBases): Check whether base types
11342         are at least as accessible than the current type.
11343         (TypeContainer.AsAccessible): Implemented and made non-static.
11344         (MemberBase.CheckParameters): Report errors if the accessibility
11345         checks fail.
11346
11347         * delegate.cs (Delegate.Delegate): The default visibility is
11348         internal for top-level types and private for nested types.
11349         (Delegate.Define): Report errors if the accessibility checks fail.
11350
11351         * enum.cs (Enum.Enum): The default visibility is internal for
11352         top-level types and private for nested types.
11353         (Enum.DefineType): Compute the correct visibility.
11354
11355         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
11356         function which takes a `bool is_toplevel' instead of a TypeContainer.
11357
11358         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
11359         builtin type.
11360
11361 2002-08-02  Martin Baulig  <martin@gnome.org>
11362
11363         * expression.cs (LocalVariableReferenc): Added constructor which
11364         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
11365         (LocalVariableReference.IsReadOnly): New property.
11366         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
11367         variable is readonly, use our own readonly flag to do this; you can
11368         use the new constructor to get a writable reference to a read-only
11369         variable.
11370
11371         * cs-parser.jay (foreach_statement, using_statement): Get a writable
11372         reference to the local variable.
11373
11374 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
11375
11376         * rootcontext.cs (ResolveCore): Also include System.Exception
11377
11378         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
11379         we reach an EmptyStatement.
11380
11381         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
11382         is also fine.
11383
11384         * expression.cs (Binary.ResolveOperator): Check error result in
11385         two places.
11386
11387         use brtrue/brfalse directly and avoid compares to null.
11388
11389 2002-08-02  Martin Baulig  <martin@gnome.org>
11390
11391         * class.cs (TypeContainer.Define): Define all nested interfaces here.
11392         Fixes bug #28407, added test-155.cs.
11393
11394 2002-08-01  Martin Baulig  <martin@gnome.org>
11395
11396         * class.cs (Event.EmitDefaultMethod): Make this work with static
11397         events.  Fixes #28311, added verify-3.cs.
11398
11399 2002-08-01  Martin Baulig  <martin@gnome.org>
11400
11401         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
11402         `is_disposable' fields.
11403         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
11404         `hm.is_disposable' if we're using the collection pattern.
11405         (Foreach.EmitCollectionForeach): Use the correct type for the
11406         enumerator's local variable, only emit the try/finally block if
11407         necessary (fixes #27713).
11408
11409 2002-08-01  Martin Baulig  <martin@gnome.org>
11410
11411         * ecore.cs (Expression.report118): Renamed to Error118 and made
11412         it public static.
11413
11414         * statement.cs (Throw.Resolve): Check whether the expression is of
11415         the correct type (CS0118) and whether the type derives from
11416         System.Exception (CS0155).
11417         (Catch.Resolve): New method.  Do the type lookup here and check
11418         whether it derives from System.Exception (CS0155).
11419         (Catch.CatchType, Catch.IsGeneral): New public properties.
11420
11421         * typemanager.cs (TypeManager.exception_type): Added.
11422
11423 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
11424
11425         * driver.cs: Updated About function.
11426
11427 2002-07-31  Martin Baulig  <martin@gnome.org>
11428
11429         Implemented Control Flow Analysis.
11430
11431         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
11432         (EmitContext.CurrentBranching): Added.
11433         (EmitContext.StartFlowBranching): Added.
11434         (EmitContext.EndFlowBranching): Added.
11435         (EmitContext.KillFlowBranching): Added.
11436         (EmitContext.IsVariableAssigned): Added.
11437         (EmitContext.SetVariableAssigned): Added.
11438         (EmitContext.IsParameterAssigned): Added.
11439         (EmitContext.SetParameterAssigned): Added.
11440         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
11441         Added control flow analysis stuff here.
11442
11443         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
11444         resolve the expression as lvalue.
11445         (LocalVariableReference.DoResolve): Check whether the variable has
11446         already been assigned.
11447         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
11448         the parameter as assigned here.
11449         (ParameterReference.DoResolve): Check whether the parameter has already
11450         been assigned.
11451         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
11452         expression as lvalue.
11453
11454         * statement.cs (FlowBranching): New class for the flow analysis code.
11455         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
11456         (LabeledStatement.IsDefined): New public property.
11457         (LabeledStatement.AddUsageVector): New public method to tell flow
11458         analyis that the label may be reached via a forward jump.
11459         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
11460         flow analysis.
11461         (VariableInfo.Number): New public field.  This is used by flow analysis
11462         to number all locals of a block.
11463         (Block.CountVariables): New public property.  This is the number of
11464         local variables in this block (including the locals from all parent
11465         blocks).
11466         (Block.EmitMeta): Number all the variables.
11467
11468         * statement.cs: Added flow analysis support to all classes.
11469
11470 2002-07-31  Martin Baulig  <martin@gnome.org>
11471
11472         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
11473         To get debugging messages, compile mcs with /define:MCS_DEBUG and
11474         then use this argument.
11475
11476         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
11477
11478         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
11479         use this to specify /define options.
11480
11481 2002-07-29  Martin Baulig  <martin@gnome.org>
11482
11483         * statement.cs (Fixed): Moved all code that does variable lookups
11484         and resolvings from Emit to Resolve.
11485
11486         * statement.cs (For): Moved all code that does variable lookups
11487         and resolvings from Emit to Resolve.
11488
11489         * statement.cs (Using): Moved all code that does variable lookups
11490         and resolvings from Emit to Resolve.
11491
11492 2002-07-29  Martin Baulig  <martin@gnome.org>
11493
11494         * attribute.cs (Attribute.Resolve): Explicitly catch a
11495         System.NullReferenceException when creating the
11496         CustromAttributeBuilder and report a different warning message.
11497
11498 2002-07-29  Martin Baulig  <martin@gnome.org>
11499
11500         * support.cs (ParameterData.ParameterName): Added method to
11501         get the name of a parameter.
11502
11503         * typemanager.cs (TypeManager.IsValueType): New public method.
11504
11505 2002-07-29  Martin Baulig  <martin@gnome.org>
11506
11507         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
11508         is a flag which specifies that it's either ref or out.
11509         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
11510         the out parameter to `out Parameter.Modifier mod', also set the
11511         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
11512
11513         * support.cs (InternalParameters.ParameterModifier): Distinguish
11514         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
11515         Parameter.Modifier.ISBYREF flag if it's either ref or out.
11516
11517         * expression.cs (Argument.GetParameterModifier): Distinguish
11518         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
11519         Parameter.Modifier.ISBYREF flag if it's either ref or out.
11520
11521 2002-07-29  Martin Baulig  <martin@gnome.org>
11522
11523         * expression.cs (ParameterReference.ParameterReference): Added
11524         `Location loc' argument to the constructor.
11525
11526         * cs-parser.jay: Pass location to ParameterReference.
11527
11528 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
11529
11530         * statement.cs (Try): Initialize the location.
11531
11532         * cs-parser.jay: pass location to Try.
11533
11534         * expression.cs (Unary.Reduce): Change the prototype to return
11535         whether a constant fold could be performed or not.  The result is
11536         returned in an out parameters.  In the case of Indirection and
11537         AddressOf, we want to perform the full tests.
11538
11539 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
11540
11541         * statement.cs (Statement.Emit): Flag dead code.
11542
11543 2002-07-27  Andrew Birkett  <andy@nobugs.org>
11544
11545         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
11546
11547 2002-07-27  Martin Baulig  <martin@gnome.org>
11548
11549         * class.cs (MethodData.Define): Put back call to
11550         TypeManager.AddMethod(), accidentally commented this out.
11551
11552         * report.cs (Debug): New public method to print debugging information,
11553         this is `[Conditional ("DEBUG")]'.
11554
11555 2002-07-26  Martin Baulig  <martin@gnome.org>
11556
11557         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
11558         (switch_statement): Push the current_block to the switch_stack and
11559         pop it again when we're done with the switch.
11560         (switch_section): The new block is a child of the current_block.
11561         Fixes bug #24007, added test-152.cs.
11562
11563 2002-07-27  Martin Baulig  <martin@gnome.org>
11564
11565         * expression.cs (Invocation.EmitArguments): When calling a varargs
11566         function with only its fixed arguments, we need to pass an empty
11567         array.
11568
11569 2002-07-27  Martin Baulig  <martin@gnome.org>
11570
11571         Mono 0.13 has been released.
11572
11573 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
11574
11575         * driver.cs: Rename --resource to --linkres, because that is what
11576         we do currently, we dont support --resource yet.
11577
11578         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
11579
11580 2002-07-25  Martin Baulig  <martin@gnome.org>
11581
11582         * class.cs (MethodData): New public class.  This is a `method builder'
11583         class for a method or one accessor of a Property/Indexer/Event.
11584         (MethodData.GetMethodFlags): Moved here from MemberBase.
11585         (MethodData.ApplyAttributes): Likewise.
11586         (MethodData.ApplyObsoleteAttribute): Likewise.
11587         (MethodData.ApplyConditionalAttribute): Likewise.
11588         (MethodData.ApplyDllImportAttribute): Likewise.
11589         (MethodData.CheckAbstractAndExternal): Likewise.
11590         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
11591         (MethodData.Emit): Formerly known as Method.Emit().
11592         (MemberBase): Moved everything which was specific to a single
11593         accessor/method to MethodData.
11594         (Method): Create a new MethodData and call Define() and Emit() on it.
11595         (Property, Indexer, Event): Create a new MethodData objects for each
11596         accessor and call Define() and Emit() on them.
11597
11598 2002-07-25  Martin Baulig  <martin@gnome.org>
11599
11600         Made MethodCore derive from MemberBase to reuse the code from there.
11601         MemberBase now also checks for attributes.
11602
11603         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
11604         (MemberBase.GetMethodFlags): Moved here from class Method and marked
11605         as virtual.
11606         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
11607         `CallingConventions cc' and `Attributes opt_attrs' arguments.
11608         (MemberBase.ApplyAttributes): New virtual method; applies the
11609         attributes to a method or accessor.
11610         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
11611         (MemberBase.ApplyConditionalAttribute): Likewise.
11612         (MemberBase.ApplyDllImportAttribute): Likewise.
11613         (MemberBase.CheckAbstractAndExternal): Likewise.
11614         (MethodCore.ParameterTypes): This is now a property instead of a
11615         method, it's initialized from DoDefineParameters().
11616         (MethodCore.ParameterInfo): Removed the set accessor.
11617         (MethodCore.DoDefineParameters): New protected virtual method to
11618         initialize ParameterTypes and ParameterInfo.
11619         (Method.GetReturnType): We can now simply return the MemberType.
11620         (Method.GetMethodFlags): Override the MemberBase version and add
11621         the conditional flags.
11622         (Method.CheckBase): Moved some code from Define() here, call
11623         DoDefineParameters() here.
11624         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
11625         here to avoid some larger code duplication.
11626         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
11627         ensure that abstract and external accessors don't declare a body.
11628
11629         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
11630         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
11631         lookup in the attribute's parent classes, so we need to abort as soon
11632         as we found the first match.
11633         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
11634         the attribute has no arguments.
11635
11636         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
11637         of a Method.
11638
11639 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11640
11641         * cs-parser.jay: reverted previous patch.
11642
11643 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11644
11645         * cs-parser.jay: fixed bug #22119.
11646
11647 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11648
11649         * attribute.cs: fixed compilation. The error was:
11650         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
11651         be assigned to before control leaves the current method."
11652         [FIXME:  Filed as bug #28186: MCS must report this error.]
11653
11654 2002-07-25  Martin Baulig  <martin@gnome.org>
11655
11656         * attribute.cs (Attribute.Conditional_GetConditionName): New static
11657         method to pull the condition name ouf of a Conditional attribute.
11658         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
11659         the obsolete message and error flag out of an Obsolete attribute.
11660
11661         * class.cs (Method.GetMethodFlags): New public method to get the
11662         TypeManager.MethodFlags for this method.
11663         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
11664         private methods.
11665         (Method.Define): Get and apply the Obsolete and Conditional attributes;
11666         if we're overriding a virtual function, set the new private variable
11667         `parent_method'; call the new TypeManager.AddMethod().
11668
11669         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
11670         the MethodBuilder and the Method in a PtrHashtable.
11671         (TypeManager.builder_to_method): Added for this purpose.
11672         (TypeManager.MethodFlags): Added IsObsoleteError.
11673         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
11674         Obsolete and Conditional arguments in MethodBuilders.  If we discover
11675         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
11676         the message from the attribute.
11677
11678 2002-07-24  Martin Baulig  <martin@gnome.org>
11679
11680         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
11681         preprocessor directives, ensure that the argument to #define/#undef is
11682         exactly one identifier and that it's actually an identifier.
11683
11684         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
11685         did not work ....
11686
11687 2002-07-24  Martin Baulig  <martin@gnome.org>
11688
11689         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
11690         initialize it to TypeManager.object_type in the constructor.
11691         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
11692         of the `hm.get_current' method if we're using the collection pattern.
11693         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
11694         for the explicit conversion to make it work when we're using the collection
11695         pattern and the `Current' property has a different return type than `object'.
11696         Fixes #27713.
11697
11698 2002-07-24  Martin Baulig  <martin@gnome.org>
11699
11700         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
11701         does not match, but don't report any errors.  This method is called in
11702         order for all methods in a MethodGroupExpr until a matching method is
11703         found, so we don't want to bail out if the first method doesn't match.
11704         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
11705         matches, report the 123.  Fixes #28070.
11706
11707 2002-07-24  Martin Baulig  <martin@gnome.org>
11708
11709         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
11710         TypeManager.TypeToCoreType() to the top of the method so the
11711         following equality checks will work.  Fixes #28107.
11712
11713 2002-07-24  Martin Baulig  <martin@gnome.org>
11714
11715         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
11716         operand is of type uint, and the other operand is of type sbyte,
11717         short or int, the operands are converted to type long." -
11718         Actually do what this comment already told us.  Fixes bug #28106,
11719         added test-150.cs.
11720
11721 2002-07-24  Martin Baulig  <martin@gnome.org>
11722
11723         * class.cs (MethodBase): New abstract class.  This is now a base
11724         class for Property, Indexer and Event to avoid some code duplication
11725         in their Define() and DefineMethods() methods.
11726         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
11727         generic methods for Define() and DefineMethods().
11728         (FieldBase): Derive from MemberBase, not MemberCore.
11729         (Property): Derive from MemberBase, not MemberCore.
11730         (Property.DefineMethod): Moved all the code from this method to the
11731         new MethodBase.DefineAccessor(), just call it with appropriate
11732         argumetnts.
11733         (Property.Define): Call the new Property.DoDefine(), this does some
11734         sanity checks and we don't need to duplicate the code everywhere.
11735         (Event): Derive from MemberBase, not MemberCore.
11736         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
11737         accessors, this will also make them work with interface events.
11738         (Indexer): Derive from MemberBase, not MemberCore.
11739         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
11740         (Indexer.Define): Use the new MethodBase functions.
11741
11742         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
11743         argument to the constructor.
11744         (Interface.FindMembers): Added support for interface events.
11745         (Interface.PopluateEvent): Implemented.
11746
11747         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
11748
11749 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
11750
11751         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
11752         but this is required to check for a method name being the same as
11753         the containing class.  
11754
11755         Handle this now.
11756
11757 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11758
11759         * interface.cs: initialize variable.
11760
11761 2002-07-23  Martin Baulig  <martin@gnome.org>
11762
11763         Implemented the IndexerName attribute in interfaces.
11764
11765         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
11766         name if this is an explicit interface implementation.
11767         (Indexer.InterfaceIndexerName): New public variable.  If we're
11768         implementing an interface indexer, this is the IndexerName in that
11769         interface.  Otherwise, it's the IndexerName.
11770         (Indexer.DefineMethod): If we're implementing interface indexer,
11771         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
11772         and Pending.ImplementIndexer methods.
11773         (Indexer.Define): Also define the PropertyBuilder if we're
11774         implementing an interface indexer and this is neither an explicit
11775         interface implementation nor do the IndexerName match the one in
11776         the interface.
11777
11778         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
11779         If a method is defined here, then we always need to create a proxy
11780         for it.  This is used when implementing interface indexers.
11781         (Pending.IsInterfaceIndexer): New public method.
11782         (Pending.ImplementIndexer): New public method.
11783         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
11784         This is used when implementing interface indexers to define a proxy
11785         if necessary.
11786         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
11787         define a proxy if necessary.
11788
11789         * interface.cs (Interface.IndexerName): New public variable.
11790         (Interface.PopulateIndexer): Set the IndexerName.
11791         (Interface.DefineIndexers): New private method.  Populate all the
11792         indexers and make sure their IndexerNames match.
11793
11794         * typemanager.cs (IndexerPropertyName): Added support for interface
11795         indexers.
11796
11797 2002-07-22  Martin Baulig  <martin@gnome.org>
11798
11799         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
11800         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
11801         ret if HasReturnLabel.
11802         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
11803         variables.
11804
11805         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
11806         and set the ec.LoopBeginTryCatchLevel.
11807         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
11808         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
11809         the current ec.TryCatchLevel, the branch goes out of an exception
11810         block.  In this case, we need to use Leave and not Br.
11811
11812 2002-07-22  Martin Baulig  <martin@gnome.org>
11813
11814         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
11815         block unless the block does not always return or it is contained in
11816         another try { ... } catch { ... } block.  Fixes bug #26506.
11817         Added verify-1.cs to the test suite.
11818
11819 2002-07-22  Martin Baulig  <martin@gnome.org>
11820
11821         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
11822         then we do not always return.  Fixes bug #24985.
11823
11824 2002-07-22  Martin Baulig  <martin@gnome.org>
11825
11826         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
11827         lookup on a per-class level; ie. walk up the class hierarchy until we
11828         found at least one applicable method, then choose the best among them.
11829         Fixes bug #24463 and test-29.cs.
11830
11831 2002-07-22  Martin Baulig  <martin@gnome.org>
11832
11833         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
11834         return types of the methods.  The return type is not part of the
11835         signature and we must not check it to make the `new' modifier work.
11836         Fixes bug #27999, also added test-147.cs.
11837         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
11838
11839         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
11840         on the method's return type.
11841
11842 2002-07-21  Martin Baulig  <martin@gnome.org>
11843
11844         * assign.cs: Make this work if the rightmost source is a constant and
11845         we need to do an implicit type conversion.  Also adding a few more tests
11846         to test-38.cs which should have caught this.
11847
11848         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
11849         target in the makefile for this.  The makefile.gnu is primarily intended
11850         for end-users who don't want to debug the compiler.
11851
11852 2002-07-21  Martin Baulig  <martin@gnome.org>
11853
11854         * assign.cs: Improved the Assign class so it can now handle embedded
11855         assignments (X = Y = Z = something).  As a side-effect this'll now also
11856         consume less local variables.  test-38.cs now passes with MCS, added
11857         a few new test cases to that test.
11858
11859 2002-07-20  Martin Baulig  <martin@gnome.org>
11860
11861         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
11862         instructions.  Fixes bug #27977, also added test-146.cs.
11863
11864 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11865
11866         * cs-tokenizer.cs: fixed getHex ().
11867
11868 2002-07-19  Martin Baulig  <martin@gnome.org>
11869
11870         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
11871         not Type.GetType() to lookup the array type.  This is needed when
11872         we're constructing an array of a user-defined type.
11873         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
11874         single-dimensional arrays, but also for single-dimensial arrays of
11875         type decimal.
11876
11877 2002-07-19  Martin Baulig  <martin@gnome.org>
11878
11879         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
11880         this function is called, it's not allowed to share LocalBuilders
11881         among ILGenerators.
11882
11883 2002-07-19  Martin Baulig  <martin@gnome.org>
11884
11885         * expression.cs (Argument.Resolve): Report an error 118 when trying
11886         to pass a type as argument.
11887
11888 2002-07-18  Martin Baulig  <martin@gnome.org>
11889
11890         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
11891         Conv_R_Un for the signed `long' type.
11892
11893 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
11894
11895         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
11896         `expr' for the temporary result, as that will fail if we do
11897         multiple resolves on the same expression.
11898
11899 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
11900
11901         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
11902         ec.TypeContainer for looking up aliases. 
11903
11904         * class.cs (TypeContainer): Remove LookupAlias from here.
11905
11906         * decl.cs (DeclSpace); Move here.
11907
11908 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
11909
11910         * class.cs (FindMembers): Only call filter if the constructor
11911         bulider is not null.
11912
11913         Also handle delegates in `NestedTypes' now.  Now we will perform
11914         type lookups using the standard resolution process.  This also
11915         fixes a bug.
11916
11917         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
11918         This uses Expressions (the limited kind that can be parsed by the
11919         tree) instead of strings.
11920
11921         * expression.cs (ComposedCast.ToString): Implement, used to flag
11922         errors since now we have to render expressions.
11923
11924         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
11925         FormArrayType. 
11926
11927         * ecore.cs (SimpleName.ToString): ditto.
11928
11929         * cs-parser.jay: Instead of using strings to assemble types, use
11930         Expressions to assemble the type (using SimpleName, ComposedCast,
11931         MemberAccess).  This should fix the type lookups in declarations,
11932         because we were using a different code path for this.
11933
11934         * statement.cs (Block.Resolve): Continue processing statements
11935         even when there is an error.
11936
11937 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
11938
11939         * class.cs (Event.Define): Also remove the `remove' method from
11940         the list of pending items.
11941
11942         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
11943         generate more compact code. 
11944
11945 2002-07-17  Martin Baulig  <martin@gnome.org>
11946
11947         * const.cs (Const.LookupConstantValue): Add support for constant
11948         `unchecked' and `checked' expressions.
11949         Also adding test case test-140.cs for this.
11950
11951 2002-07-17  Martin Baulig  <martin@gnome.org>
11952
11953         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
11954         check whether mi.ReturnType implements the IEnumerator interface; the
11955         `==' and the IsAssignableFrom() will fail in this situation.
11956
11957 2002-07-16  Ravi Pratap  <ravi@ximian.com>
11958
11959         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
11960         here too.
11961
11962 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11963
11964         * expression.cs: fixed bug #27811.
11965
11966 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
11967
11968         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
11969         Molaro: when we are a ref, the value already contains a pointer
11970         value, do not take the address of it.
11971
11972 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
11973         * removed mb-parser.jay and mb-tokenizer.cs
11974
11975 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
11976
11977         * expression.cs: check against the building corlib void type.
11978
11979 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
11980
11981         * ecore.cs: fix for valuetype static readonly fields: when 
11982         initializing them, we need their address, not the address of a copy.
11983
11984 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
11985
11986         * typemanager.cs: register also enum_type in corlib.
11987
11988 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
11989
11990         * class.cs: allow calling this (but not base) initializers in structs.
11991
11992 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
11993
11994         * ecore.cs: make sure we compare against the building base types
11995         in GetTypeSize ().
11996
11997 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
11998
11999         * typemanager.cs: fix TypeToCoreType() to handle void and object
12000         (corlib gets no more typerefs after this change).
12001
12002 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
12003
12004         * expression.cs (ArrayCreation.EmitArrayArguments): use
12005         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
12006
12007         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
12008         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
12009         array indexes, the runtime actually forbids them.
12010
12011         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
12012         for array arguments here.
12013
12014         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
12015         instead of the default for ValueTypes.
12016
12017         (New.DoEmit): Use IsValueType instead of
12018         IsSubclassOf (value_type)
12019         (New.DoResolve): ditto.
12020         (Invocation.EmitCall): ditto.
12021
12022         * assign.cs (Assign): ditto.
12023
12024         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
12025         Statements *are* currently doing part of their resolution during
12026         Emit.  
12027
12028         Expressions do always resolve during resolve, but statements are
12029         only required to propagate resolution to their children.
12030
12031 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
12032
12033         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
12034
12035         (LoadAssembly): Do not add the dll if it is already specified
12036
12037         (MainDriver): Add the System directory to the link path at the end,
12038         after all the other -L arguments. 
12039
12040         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
12041         wrong opcode for loading bytes and bools (ldelem.i1 instead of
12042         ldelem.u1) and using the opposite for sbytes.
12043
12044         This fixes Digger, and we can finally run it.
12045
12046         * driver.cs (UnixParseOption): Move the option parsing here.  
12047         (CSCParseOption): Implement CSC-like parsing of options.
12048
12049         We now support both modes of operation, the old Unix way, and the
12050         new CSC-like way.  This should help those who wanted to make cross
12051         platform makefiles.
12052
12053         The only thing broken is that /r:, /reference: and /lib: are not
12054         implemented, because I want to make those have the same semantics
12055         as the CSC compiler has, and kill once and for all the confussion
12056         around this.   Will be doing this tomorrow.
12057
12058         * statement.cs (Unsafe.Resolve): The state is checked during
12059         resolve, not emit, so we have to set the flags for IsUnsfe here.
12060
12061 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
12062
12063         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
12064         not catch the Error_ObjectRefRequired in SimpleName (as it is
12065         possible to have a class/instance variable name that later gets
12066         deambiguated), we have to check this here.      
12067
12068 2002-07-10  Ravi Pratap  <ravi@ximian.com>
12069
12070         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
12071         make static and put into Expression.
12072
12073         (Event.Define): Register the private field of the event with the 
12074         TypeManager so that GetFieldFromEvent can get at it.
12075
12076         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
12077         keep track of the private field associated with an event which
12078         has no accessors.
12079
12080         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
12081         private field.
12082
12083         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
12084
12085 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
12086
12087         * expression.cs (Binary.EmitBranchable): this routine emits the
12088         Binary expression in a branchable context.  This basically means:
12089         we need to branch somewhere, not just get the value on the stack.
12090
12091         This works together with Statement.EmitBoolExpression.
12092
12093         * statement.cs (Statement.EmitBoolExpression): Use
12094         EmitBranchable. 
12095
12096 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
12097
12098         * statement.cs (For): Reduce the number of jumps in loops.
12099
12100         (For): Implement loop inversion for the For statement.
12101
12102         (Break): We can be breaking out of a Try/Catch controlled section
12103         (foreach might have an implicit try/catch clause), so we need to
12104         use Leave instead of Br.
12105
12106         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
12107         now).  If the instace expression supports IMemoryLocation, we use
12108         the AddressOf method from the IMemoryLocation to extract the
12109         address instead of emitting the instance.
12110
12111         This showed up with `This', as we were emitting the instance
12112         always (Emit) instead of the Address of This.  Particularly
12113         interesting when This is a value type, as we dont want the Emit
12114         effect (which was to load the object).
12115
12116 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
12117
12118         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
12119
12120         * statement.cs (Checked): Set the CheckedState during the resolve
12121         process too, as the ConvCast operations track the checked state on
12122         the resolve process, and not emit.
12123
12124         * cs-parser.jay (namespace_member_declaration): Flag that we have
12125         found a declaration when we do.  This is used to flag error 1529
12126
12127         * driver.cs: Report ok when we display the help only.
12128
12129 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
12130
12131         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
12132
12133 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
12134
12135         * cs-tokenizer.cs (define): We also have to track locally the
12136         defines.  AllDefines is just used for the Conditional Attribute,
12137         but we also need the local defines for the current source code. 
12138
12139 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
12140
12141         * statement.cs (While, For, Do): These loops can exit through a
12142         Break statement, use this information to tell whether the
12143         statement is the last piece of code.
12144
12145         (Break): Flag that we break.
12146
12147         * codegen.cs (EmitContexts): New `Breaks' state variable.
12148
12149 2002-07-03  Martin Baulig  <martin@gnome.org>
12150
12151         * class.cs (TypeContainer.MethodModifiersValid): Allow override
12152         modifiers in method declarations in structs.  Otherwise, you won't
12153         be able to override things like Object.Equals().
12154
12155 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
12156
12157         * class.cs (Method, Property, Indexer): Do not allow the public
12158         modifier to be used in explicit interface implementations.
12159
12160         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
12161         override modifiers in method declarations in structs
12162
12163 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
12164
12165         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
12166         integer or real overflow, report an error
12167
12168 2002-07-02  Martin Baulig  <martin@gnome.org>
12169
12170         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
12171         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
12172         to tell the runtime about our newly created System.Object and
12173         System.ValueType types.
12174
12175 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
12176
12177         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
12178         struct instead of Ldarg/Starg.
12179
12180 2002-07-02  Martin Baulig  <martin@gnome.org>
12181
12182         * expression.cs (Indirection.Indirection): Call
12183         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
12184
12185 2002-07-02  Martin Baulig  <martin@gnome.org>
12186
12187         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
12188         ValueType, call TypeManager.TypeToCoreType() on it.
12189         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
12190         the OpCodes.Newarr argument.
12191
12192 2002-07-02  Martin Baulig  <martin@gnome.org>
12193
12194         * expression.cs (Invocation.EmitCall): When compiling corlib,
12195         replace all calls to the system's System.Array type to calls to
12196         the newly created one.
12197
12198         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
12199         System.Array methods.
12200         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
12201         from the system's System.Array type which must be replaced.
12202
12203 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
12204
12205         * typemanager.cs: load unverifiable_code_ctor so we can build
12206         corlib using the correct type. Avoid using GetTypeCode() with
12207         TypeBuilders.
12208         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
12209         TypeManager.object_type to allow building corlib.
12210
12211 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
12212
12213         * ecore.cs: handle System.Enum separately in LoadFromPtr().
12214
12215 2002-07-01  Martin Baulig  <martin@gnome.org>
12216
12217         * class.cs: Make the last change actually work, we need to check
12218         whether `ifaces != null' to avoid a crash.
12219
12220 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
12221
12222         * class.cs: when we build structs without fields that implement
12223         interfaces, we need to add the interfaces separately, since there is
12224         no API to both set the size and add the interfaces at type creation
12225         time.
12226
12227 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
12228
12229         * expression.cs: the dimension arguments to the array constructors
12230         need to be converted if they are a long.
12231
12232 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
12233
12234         * class.cs: don't emit ldarg.0 if there is no parent constructor
12235         (fixes showstopper for corlib).
12236
12237 2002-06-29  Martin Baulig  <martin@gnome.org>
12238
12239         MCS now compiles corlib on GNU/Linux :-)
12240
12241         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
12242         ie. check for MethodImplOptions.InternalCall.
12243
12244         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
12245         and TypeManager.attribute_type are null, so we must explicitly check
12246         whether parent is not null to find out whether it's an attribute type.
12247         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
12248         and SetBuilder, not only if the property is neither abstract nor external.
12249         This is necessary to set the MethodImplOptions on the accessor methods.
12250         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
12251         SetBuilder, see Property.Emit().
12252
12253         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
12254         populate "System.Object", "System.ValueType" and "System.Attribute" since
12255         they've already been populated from BootCorlib_PopulateCoreTypes().
12256
12257 2002-06-29  Martin Baulig  <martin@gnome.org>
12258
12259         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
12260         is the NullLiteral, we also need to make sure that target_type is not
12261         an enum type.   
12262
12263 2002-06-29  Martin Baulig  <martin@gnome.org>
12264
12265         * rootcontext.cs (RootContext.ResolveCore): We must initialize
12266         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
12267         before calling BootstrapCorlib_ResolveDelegate ().
12268
12269 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12270
12271         * statement.cs: fixed build-breaker. All tests passed ok.
12272
12273 2002-06-27  Martin Baulig  <martin@gnome.org>
12274
12275         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
12276         for System.Decimal when compiling corlib.
12277
12278 2002-06-27  Martin Baulig  <martin@gnome.org>
12279
12280         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
12281         switch blocks which contain nothing but a default clause.
12282
12283 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
12284
12285        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
12286
12287 2002-06-27  Martin Baulig  <martin@gnome.org>
12288
12289         * ecore.cs (PropertyExpr.PropertyExpr): Call
12290         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
12291
12292         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
12293         is already a TypeBuilder.
12294
12295 2002-06-27  Martin Baulig  <martin@gnome.org>
12296
12297         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
12298         `target_type == TypeManager.array_type', not IsAssignableFrom() in
12299         the "from an array-type to System.Array" case.  This makes it work
12300         when compiling corlib.
12301
12302 2002-06-27  Martin Baulig  <martin@gnome.org>
12303
12304         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
12305         non-static PropertyExpr, set its InstanceExpression.  This makes
12306         the `ICollection.Count' property work in System/Array.cs.
12307
12308 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
12309
12310         * driver.cs: Made error handling more consistent.  Errors now
12311         tracked by Report class, so many methods which used to return int
12312         now return void.  Main() now prints success/failure and 
12313         errors/warnings message.
12314
12315         Renamed '--probe' compiler argument to '--expect-error'.  Removed
12316         the magic number return values (123 and 124).  Now, if the
12317         expected error occurs, the compiler exits with success (exit value
12318         0).  If the compilation completes without seeing that particular
12319         error, the compiler exits with failure (exit value 1).  The
12320         makefile in mcs/errors has been changed to handle the new behaviour.
12321
12322         * report.cs: Made 'expected error' number a property and renamed
12323         it from 'Probe' to 'ExpectedError'.
12324
12325         * genericparser.cs: Removed error handling support, since it is
12326         now all done by Report class.
12327
12328         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
12329         class, so parse() no longer returns an int.
12330
12331         * namespace.cs: Use Report.Error instead of GenericParser.error
12332
12333 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
12334
12335         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
12336         TypeContainer.AddOperator): At the front of the list put the
12337         explicit implementations, so they get resolved/defined first. 
12338
12339 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
12340
12341         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
12342         interface type is implemented by this TypeContainer.  Used during
12343         explicit interface implementation.
12344
12345         (Property.Define, Indexer.Define, Method.Define): Validate that
12346         the given interface in the explicit implementation is one of the
12347         base classes for the containing type.
12348
12349         Also if we are explicitly implementing an interface, but there is
12350         no match in the pending implementation table, report an error.
12351
12352         (Property.Define): Only define the property if we are
12353         not explicitly implementing a property from an interface.  Use the
12354         correct name also for those properties (the same CSC uses,
12355         although that is really not needed).
12356
12357         (Property.Emit): Do not emit attributes for explicitly implemented
12358         properties, as there is no TypeBuilder.
12359
12360         (Indexer.Emit): ditto.
12361
12362         Hiding then means that we do not really *implement* a pending
12363         implementation, which makes code fail.
12364
12365 2002-06-22  Martin Baulig  <martin@gnome.org>
12366
12367         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
12368         the return value of Object.GetType().  [FIXME: we need to do this whenever
12369         we get a type back from the reflection library].
12370
12371 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
12372
12373         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
12374
12375 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
12376
12377         * attribute.cs: Return null if we can not look up the type.
12378
12379         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
12380         the interface types found.
12381
12382         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
12383         interface types found.
12384
12385         * typemanager.cs (GetInterfaces): Make this routine returns alll
12386         the interfaces and work around the lame differences between
12387         System.Type and System.Reflection.Emit.TypeBuilder in the results
12388         result for GetInterfaces.
12389
12390         (ExpandInterfaces): Given an array of interface types, expand and
12391         eliminate repeated ocurrences of an interface.  This expands in
12392         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
12393         be IA, IB, IC.
12394
12395 2002-06-21  Martin Baulig  <martin@gnome.org>
12396
12397         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
12398         on System.Enum.
12399
12400 2002-06-21  Martin Baulig  <martin@gnome.org>
12401
12402         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
12403         and called with one of the core types, return the corresponding typebuilder for
12404         that type.
12405
12406         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
12407         element type.
12408
12409 2002-06-21  Martin Baulig  <martin@gnome.org>
12410
12411         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
12412         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
12413         (Expression.ConvertReferenceExplicit): Likewise.
12414
12415         * expression.cs (ElementAccess.DoResolve): Likewise.
12416         (ElementAccess.DoResolveLValue): Likewise.
12417
12418 2002-06-10  Martin Baulig  <martin@gnome.org>
12419
12420         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
12421         add the "value" parameter to the parameter list.
12422
12423         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
12424         to our caller.
12425
12426 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
12427
12428         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
12429         the argument to an int, uint, long or ulong, per the spec.  Also
12430         catch negative constants in array creation.
12431
12432 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
12433
12434         * class.cs: do not allow the same interface to appear twice in
12435         the definition list.
12436
12437 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
12438
12439         * ecore.cs: don't use ldlen with System.Array.
12440
12441 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
12442
12443         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
12444
12445 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
12446
12447         * modifiers.cs: produce correct field attributes for protected
12448         internal. Easy fix so miguel can work on ther harder stuff:-)
12449
12450 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
12451
12452         * pending.cs: New file.  Move the code from class.cs here.
12453         Support clearning the pending flag for all methods (when not doing
12454         explicit interface implementation).
12455
12456 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
12457
12458         * rootcontext.cs: added a couple more types needed to bootstrap.
12459
12460 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
12461
12462         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
12463         constructor in the type, instead of any constructor in the type
12464         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
12465         a bug in the Mono runtime when applying the params attribute). 
12466
12467 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
12468         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
12469
12470 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
12471
12472         * expression.cs (Unary.ResolveOperator): Use TypeManager
12473         to resolve the type.
12474
12475 2002-06-13  Ravi Pratap  <ravi@ximian.com>
12476
12477         * cs-parser.jay (enum_member_declaration): Pass in the attributes
12478         attached.
12479
12480         * enum.cs (AddEnumMember): Add support to store the attributes associated 
12481         with each member too.
12482
12483         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
12484         field builders too - this takes care of the enum member case.
12485
12486 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
12487
12488         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
12489         address-of operator on both value types and pointers.
12490
12491 2002-06-10  Martin Baulig  <martin@gnome.org>
12492
12493         * interface.cs (Interface.PopulateIndexer): Add the indexer's
12494         PropertyBuilder to the `property_builders' list.
12495
12496         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
12497         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
12498         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
12499         find any indexers which are inherited from an interface.
12500
12501 2002-06-09  Martin Baulig  <martin@gnome.org>
12502
12503         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
12504         the same type as the constant if necessary.  There's also a test-130.cs
12505         for this.
12506
12507         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
12508
12509         * typemanager.cs (TypeManager.ChangeType): Previously known as
12510         Enum.ChangeEnumType().
12511
12512 2002-06-09  Martin Baulig  <martin@gnome.org>
12513
12514         * expression.cs (Cast.TryReduce): Added support for consts.
12515
12516 2002-06-08  Ravi Pratap  <ravi@ximian.com>
12517
12518         * class.cs (Accessor): Hold attributes information so we can pass
12519         it along.
12520
12521         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
12522         Modify to pass in attributes attached to the methods.
12523
12524         (add_accessor_declaration, remove_accessor_declaration): Ditto.
12525
12526         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
12527         to handle the Accessor kind :-)
12528
12529         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
12530
12531 2002-06-08  Martin Baulig  <martin@gnome.org>
12532
12533         * expression.cs (Unary.TryReduceNegative): Added support for
12534         ULongConstants.
12535
12536 2002-06-08  Martin Baulig  <martin@gnome.org>
12537
12538         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
12539         name can't be found in the `defined_names' - the caller will do a
12540         MemberLookup in this case and thus find methods in System.Enum
12541         such as Enum.IsDefined().
12542
12543 2002-06-08  Martin Baulig  <martin@gnome.org>
12544
12545         * enum.cs (Enum.ChangeEnumType): This is a custom version of
12546         Convert.ChangeType() which works with TypeBuilder created types.
12547         (Enum.LookupEnumValue, Enum.Define): Use it here.
12548
12549         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
12550         `TypeBuilder.BaseType != null' check.
12551         (TypeContainer.FindMembers): Only lookup parent members if we
12552         actually have a parent.
12553         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
12554         (ConstructorInitializer.Resolve): Likewise.
12555
12556         * interface.cs (Interface.FindMembers): Added
12557         `TypeBuilder.BaseType != null' check.
12558
12559         * rootcontext.cs (RootContext.ResolveCore): Added
12560         "System.Runtime.CompilerServices.IndexerNameAttribute" to
12561         classes_second_stage.
12562
12563         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
12564         debug_type and trace_type when compiling with --nostdlib.       
12565
12566 2002-06-07  Martin Baulig  <martin@gnome.org>
12567
12568         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
12569         (AddField): Set it to true when adding a non-static field.
12570         (DefineType): Use `have_nonstatic_fields' to find out whether we
12571         have non-static fields, not `Fields != null'.
12572
12573 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
12574
12575         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
12576         dereferencing a null on the static-field code path)
12577
12578 2002-05-30  Martin Baulig  <martin@gnome.org>
12579
12580         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
12581         to take command line arguments.  Use reflection to call the new
12582         custom `Initialize' function on the symbol writer and pass it the
12583         command line arguments.
12584
12585         * driver.cs (--debug-args): New command line argument to pass command
12586         line arguments to the symbol writer.
12587
12588 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
12589
12590         * assign.cs (DoResolve): Forgot to do the implicit conversion to
12591         the target type for indexers and properties.  Thanks to Joe for
12592         catching this.
12593
12594 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
12595
12596         * typemanager.cs (MethodFlags): returns the method flags
12597         (Obsolete/ShouldIgnore) that control warning emission and whether
12598         the invocation should be made, or ignored. 
12599
12600         * expression.cs (Invocation.Emit): Remove previous hack, we should
12601         not do this on matching a base type, we should do this based on an attribute
12602
12603         Only emit calls to System.Diagnostics.Debug and
12604         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
12605         on the command line.
12606
12607         * rootcontext.cs: Global settings for tracing and debugging.
12608
12609         * cs-tokenizer.cs (define): New utility function to track
12610         defines.   Set the global settings for TRACE and DEBUG if found.
12611
12612 2002-05-25  Ravi Pratap  <ravi@ximian.com>
12613
12614         * interface.cs (Populate*): Pass in the TypeContainer as well as
12615         the DeclSpace as parameters so that we can create EmitContexts and
12616         then use that to apply attributes etc.
12617
12618         (PopulateMethod, PopulateEvent, PopulateProperty)
12619         (PopulateIndexer): Apply attributes everywhere.
12620
12621         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
12622         etc.
12623
12624         (ApplyAttributes): Update accordingly.
12625
12626         We now apply interface attributes for all members too.
12627
12628 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
12629
12630         * class.cs (Indexer.Define); Correctly check if we are explicit
12631         implementation (instead of checking the Name for a ".", we
12632         directly look up if the InterfaceType was specified).
12633
12634         Delay the creation of the PropertyBuilder.
12635
12636         Only create the PropertyBuilder if we are not an explicit
12637         interface implementation.   This means that explicit interface
12638         implementation members do not participate in regular function
12639         lookups, and hence fixes another major ambiguity problem in
12640         overload resolution (that was the visible effect).
12641
12642         (DefineMethod): Return whether we are doing an interface
12643         implementation. 
12644
12645         * typemanager.cs: Temporary hack until we get attributes in
12646         interfaces (Ravi is working on that) and we get IndexerName
12647         support in interfaces.
12648
12649         * interface.cs: Register the indexers as properties.
12650
12651         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
12652         warning, I have verified that this is a bug in the .NET runtime
12653         (JavaScript suffers of the same problem).
12654
12655         * typemanager.cs (MemberLookup): When looking up members for
12656         interfaces, the parent of an interface is the implicit
12657         System.Object (so we succeed in searches of Object methods in an
12658         interface method invocation.  Example:  IEnumerable x;  x.ToString
12659         ()) 
12660
12661 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
12662
12663         * class.cs (Event): Events should also register if they do
12664         implement the methods that an interface requires.
12665
12666         * typemanager.cs (MemberLookup); use the new GetInterfaces
12667         method. 
12668
12669         (GetInterfaces): The code used to lookup interfaces for a type is
12670         used in more than one place, factor it here. 
12671
12672         * driver.cs: Track the errors at the bottom of the file, we kept
12673         on going.
12674
12675         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
12676         instance if the method we are calling is static!
12677
12678 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
12679
12680         * attribute.cs (ApplyAttributes): Make this function filter out
12681         the IndexerName attribute (as that attribute in reality is never
12682         applied) and return the string constant for the IndexerName
12683         attribute. 
12684
12685         * class.cs (TypeContainer.Emit): Validate that all the indexers
12686         have the same IndexerName attribute, and if so, set the
12687         DefaultName attribute on the class. 
12688
12689         * typemanager.cs: The return value might contain other stuff (not
12690         only methods).  For instance, consider a method with an "Item"
12691         property and an Item method.
12692
12693         * class.cs: If there is a problem with the parameter types,
12694         return. 
12695
12696 2002-05-24  Ravi Pratap  <ravi@ximian.com>
12697
12698         * ecore.cs (ImplicitConversionExists): Wrapper function which also
12699         looks at user defined conversion after making a call to 
12700         StandardConversionExists - we need this for overload resolution.
12701
12702         * expression.cs : Update accordingly the various method calls.
12703
12704         This fixes 2 bugs filed against implicit user defined conversions 
12705
12706 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
12707
12708         * statement.cs: Track the result of the assignment.
12709
12710 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
12711
12712         * expression.cs (MemberAccess): Improved error reporting for
12713         inaccessible members.
12714
12715 2002-05-22  Martin Baulig  <martin@gnome.org>
12716
12717         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
12718         itself with debugging support.
12719
12720 2002-05-22  Martin Baulig  <martin@gnome.org>
12721
12722         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
12723         Removed, this isn't needed anymore.
12724
12725 2002-05-20  Martin Baulig  <martin@gnome.org>
12726
12727         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
12728         be underlying type for an enum.
12729
12730 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
12731
12732         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
12733         that splits out the loading of just the core types.
12734
12735         * rootcontext.cs (ResolveCore): Split the struct resolution in
12736         two, so we can load the enumeration underlying types before any
12737         enums are used.
12738
12739         * expression.cs (Is): Bandaid until we fix properly Switch (see
12740         bug #24985 for details).
12741
12742         * typemanager.cs (ImplementsInterface): The hashtable will contain
12743         a null if there are no interfaces implemented.
12744
12745 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
12746
12747         * cs-parser.jay (indexer_declarator): It is fine to have array
12748         parameters
12749
12750 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
12751
12752         * typemanager.cs: (RegisterBuilder): New function used to register
12753         TypeBuilders that implement interfaces.  Since
12754         TypeBuilder.GetInterfaces (as usual) does not work with lame
12755         Reflection.Emit. 
12756         (AddUserType): register interfaces.
12757
12758         (ImplementsInterface): Use the builder_to_ifaces hash if we are
12759         dealing with TypeBuilder.  Also, arrays are showing up as
12760         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
12761         methods can not be invoked on them!
12762
12763         * ecore.cs (ExplicitReferenceConversionExists): Made public.
12764         (ImplicitReferenceConversionExists): Split out from
12765         StandardConversionExists. 
12766
12767         * expression.cs (As): We were only implementing one of the three
12768         cases for the as operator.  We now implement them all.
12769         (Is): Implement the various other cases for Is as well.
12770
12771         * typemanager.cs (CACHE): New define used to control if we want or
12772         not the FindMembers cache.  Seems to have a negative impact on
12773         performance currently
12774
12775         (MemberLookup): Nested types have full acess to
12776         enclosing type members
12777
12778         Remove code that coped with instance/static returns for events, we
12779         now catch this in RealFindMembers.
12780
12781         (RealFindMembers): only perform static lookup if the instance
12782         lookup did not return a type or an event.  
12783
12784 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
12785
12786         * assign.cs (CompoundAssign): We pass more semantic information
12787         now to Compound Assignments than we did before: now we have all
12788         the information at hand, and now we resolve the target *before* we
12789         do the expression expansion, which allows the "CacheValue" method
12790         to have the effect we intended (before, a [x] += 1 would generate
12791         two differen ArrayAccess expressions from the ElementAccess,
12792         during the resolution process).
12793
12794         (CompoundAssign.DoResolve): Resolve target and original_source here.
12795
12796 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
12797
12798         * expression.cs (ArrayAccess): dropped debugging information. 
12799
12800         * typemanager.cs: Small bug fix: I was always returning i_members,
12801         instead of one of i_members or s_members (depending on which had
12802         the content).
12803
12804         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
12805         method is invoked before any code generation takes place, and it
12806         is a mechanism to inform that the expression will be invoked more
12807         than once, and that the method should use temporary values to
12808         avoid having side effects
12809
12810         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
12811
12812         * ecore.cs (Expression.CacheTemporaries): Provide empty default
12813         implementation.
12814
12815         * expression.cs (Indirection, ArrayAccess): Add support for
12816         CacheTemporaries in these two bad boys. 
12817
12818         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
12819         ldobj or ldind_ref.  
12820         (StoreFromPtr): Handle stobj as well.
12821
12822         * expression.cs (UnaryMutator): Share more code.
12823
12824         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
12825         down: I was not tracking the Filter function as well, which
12826         was affecting the results of the cache.
12827
12828 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
12829
12830         * attribute.cs: Remove the hack to handle the CharSet property on
12831         StructLayouts. 
12832
12833 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
12834
12835         * attribute.cs (DoResolve): More uglyness, we now only try to
12836         resolve the attribute partially, to extract the CharSet
12837         information (only if we are a StructLayout attribute).  Otherwise 
12838
12839         (GetExtraTypeInfo): Add some code to conditionally kill in the
12840         future this.   I am more and more convinced that the .NET
12841         framework has special code to handle the attribute setting on
12842         certain elements.
12843
12844         * expression.cs (IsParamsMethodApplicable): Revert my previous
12845         foreach change here, it was wrong.
12846
12847 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
12848
12849         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
12850         (pp_expr): do not abort on unknown input, just return.
12851         (eval): abort if there are pending chars.
12852
12853         * attribute.cs (Attribute.Resolve): Positional parameters are
12854         optional.  Deal with that case.
12855
12856         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
12857         the Ansi/Unicode/Auto information for the type.
12858
12859         (TypeContainer.DefineType): instantiate the EmitContext here, as
12860         we will be using it during the type definition (to resolve
12861         attributes) and during the emit phase.
12862
12863         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
12864         to pull type information out of the attributes
12865
12866         (Attribute.Resolve): track the constructor builder, and allow for
12867         multiple invocations (structs and classes will use this).
12868
12869         * ecore.cs (MemberLookupFinal): new version with all the
12870         parameters customizable.
12871
12872         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
12873         constructors.  Return if the result value is null (as the error
12874         would have been flagged already by MemberLookupFinal)
12875
12876         Do not allow instances of abstract classes or interfaces to be
12877         created.
12878
12879         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
12880         We have to compare the assembly property here when dealing with
12881         FamANDAssem and Assembly access modifiers, because we might be
12882         creating an assembly from *modules* (that means that we are not
12883         getting TypeBuilders for types defined in other modules that are
12884         part of this assembly).
12885
12886         (Method.Emit): If the method is marked abstract and has a body,
12887         emit an error. 
12888
12889         (TypeContainer.DefineMembers): If both the defined member and the
12890         parent name match are methods, then do not emit any warnings: let
12891         the Method.Define routine take care of flagging warnings.  But if
12892         there is a mismatch (method overrides something else, or method is
12893         overriwritten by something, then emit warning).
12894
12895         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
12896         set to null, this means `do not check for the return type on the
12897         signature'. 
12898
12899         (Method.Define): set the return type for the method signature to
12900         null, so that we get methods with the same name and parameters and
12901         different return types.  This is used to flag warning 114 (you are
12902         hiding a method, and you probably want to use the new/override
12903         keywords instead).
12904
12905         * typemanager.cs (MemberLookup): Implemented proper access
12906         control, closing a long standing set of bug reports.  The problem
12907         was that the Framework only has two bits: Public and NonPublic,
12908         and NonPublic includes private and protected methods, but we need
12909         to enforce the FamANDAssem, FamOrAssem and Family. 
12910
12911 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
12912
12913         * statement.cs (GotoCase): Return true: Ammounts to giving up
12914         knowledge on whether we return or not, and letting the other case
12915         be responsible for it.
12916
12917 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
12918
12919         * driver.cs: Do not load directories for each file processed, only
12920         do it if there is a pattern.
12921
12922         * ecore.cs: Report readonly assigns here as well, as we might have
12923         been resolved only by MemberAccess.
12924
12925         (SimpleName.SimpleNameResolve): Also be useful for LValue
12926         resolution.   We need this to propagate assign to local readonly variables
12927
12928         * typemanager.cs: Use a ptrhashtable for the criteria, because we
12929         do not want to reuse potential criteria memory.
12930
12931         * class.cs (MyEventBuilder): Set reflected_type;
12932
12933         * ecore.cs (Constantify): Added support for constifying bools.
12934
12935         (RootContext.LookupType): Added a cache for values looked up in
12936         the declaration space.
12937
12938         * typemanager.cs (FindMembers): Now is a front-end to
12939         RealFindMembers, and provides a two-level hashtable-based cache to
12940         the request.  
12941
12942         15% performance improvement: from 22.5 to 19.2 seconds.
12943
12944         * expression.cs (IsParamsMethodApplicable): use foreach.
12945         (Invocation.DoResolve): ditto.
12946         (New.DoResolve): ditto.
12947         (ArrayCreation.DoResolve): ditto.
12948
12949         * ecore.cs (FindMostEncompassingType): use foreach.
12950
12951         * delegate.cs (NewDelegate.DoResolve): Use foreach
12952
12953         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
12954         (RemoveMethods): use foreach.
12955
12956         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
12957         nested foreach statements instead of for, and also break out of
12958         the inner loop once a match is found.
12959
12960         (Invocation.OverloadResolve): Use foreach, simplify the code. 
12961
12962 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
12963
12964         * cfold.cs (BinaryFold): During an enumeration evaluation context,
12965         we actually unwrap the expression to allow for extra information
12966         to be extracted. 
12967
12968         * expression.cs: Use Shr_Un on unsigned operations. 
12969
12970 2002-05-08  Ravi Pratap  <ravi@ximian.com>
12971
12972         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
12973         applicable operators was not being considered correctly. This closes
12974         the bug Miguel reported.
12975
12976 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
12977
12978         * attribute.cs: check that the type derives from System.Attribute
12979         and report the correct error in that case (moved the duplicate code to
12980         its own method, too).
12981
12982 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
12983
12984         * attribute.cs: lookup attribute type name as the spec says: first the
12985         bare attribute name and then name + "Attribute" (nant compiles with
12986         mcs after this fix).
12987
12988 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
12989
12990         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
12991         Because of the way we parse things, we should try to see if a
12992         UIntConstant can fit in an integer.
12993
12994 2002-05-07  Ravi Pratap  <ravi@ximian.com>
12995
12996         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
12997         when we are in an explicit context.
12998
12999         (ConvertReferenceExplicit): When converting from Iface type S to Class
13000         T make sure the rules are implemented as an OR.
13001
13002         * parameter.cs (ParameterType): Make it a property for now although the
13003         purpose really isn't anything immediate.
13004
13005         * expression.cs (Is*Applicable): Do better checking on the parameter type
13006         of a ref/out parameter. The ones from the system assemblies are already 
13007         marked with the correct type so we don't need to do any correction.
13008
13009         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
13010         the object type is standard too so include that.
13011
13012 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13013
13014         * ecore.cs (StandardConversionExists): Augment with missing code:
13015         deal with IntConstant, LongConstants and Enumerations.
13016
13017         * assign.cs: Report the error, instead of failing silently
13018
13019         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
13020         typecontainer that they are declared, because the
13021         typecontainer/namespace will have the list of using clauses that
13022         need to be applied.
13023
13024         Assembly Attributes were escaping the normal registration
13025         mechanism. 
13026
13027         (EmitCode): Apply attributes within an EmitContext that represents
13028         the container they were declared on.
13029
13030         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
13031
13032 2002-05-06  Ravi Pratap  <ravi@ximian.com>
13033
13034         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
13035         Revamp completely - make much cleaner as we now operate only
13036         on a set of Types.
13037
13038         (FindMostSpecificSource, FindMostSpecificTarget): New methods
13039         to implement the logic detailed in the spec more correctly.
13040
13041         (UserDefinedConversion): Update accordingly.
13042
13043 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13044
13045         * statement.cs: Return flow analysis information up.
13046
13047         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
13048         and the default.
13049
13050         (token): Do not consume an extra character before calling
13051         decimal_digits.
13052
13053 2002-05-06  Piers Haken <piersh@friskit.com>
13054
13055         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
13056
13057 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13058
13059         * class.cs (Constructor.Emit): Set the IsStatic flag in the
13060         EmitContext during the instance constructor initializer
13061         resolution, to stop access to instance variables.
13062
13063         This is mandated by the spec, last paragraph of the `constructor
13064         initializers' section. 
13065
13066 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
13067
13068         * cs-parser.jay, class.cs (Accessor): new class used to represent
13069         an accessor (get or set).  In the past we used `null' to represent
13070         a missing accessor.  But this is ambiguous because there was no
13071         way to tell in abstract indexers/properties if one of them was
13072         specified.
13073
13074         Now there is a way of addressing that.
13075
13076         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
13077         instead of FindMembers.
13078
13079         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
13080         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
13081
13082         * attribute.cs: Treat indexers and properties as the same in terms
13083         of applying attributes
13084
13085         * ecore.cs (FindMostEncompassedType): Use statically initialized
13086         EmptyExpressions()s like we do elsewhere to avoid creating useless
13087         objects (and we take this out of the tight loop).
13088
13089         (GetConversionOperators): Move the code to extract the actual
13090         operators to a separate routine to clean things up.
13091
13092 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
13093
13094         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
13095         events are always registered FieldBuilders.
13096
13097         * class.cs (FieldBase): New class shared by Fields 
13098
13099         * delegate.cs: If we are a toplevel delegate, use our full name.
13100         If we are a nested delegate, then only use our tail name.
13101
13102 2002-05-02  Ravi Pratap  <ravi@ximian.com>
13103
13104         * expression.cs (IsApplicable): Ensure that we add the "&" to
13105         ref/out types before comparing it with the type of the argument.
13106
13107         (IsParamsMethodApplicable): Ditto.
13108
13109         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
13110         silly me ;-)
13111
13112         * delegate.cs : Handle the case when we have more than one applicable
13113         method. Flag an error only when we finish checking all.
13114
13115 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
13116
13117         * expression.cs: Add support for boolean static initializers.
13118
13119 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
13120
13121         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
13122
13123         * parameter.cs (ComputeParameterTypes,
13124         ComputeAndDefineParameterTypes): Better error handling: now we
13125         clear the `types' cache if we fail during any of the type lookups.
13126         We also return the status code correctly to our caller
13127
13128         * delegate.cs: If we fail to define a delegate, abort the extra
13129         steps. 
13130
13131         * expression.cs (Binary.ResolveOperator): for
13132         operator==(object,object) and operator !=(object, object) we also
13133         have to verify that there is an implicit conversion from one to
13134         the other.
13135
13136         (ArrayAccess.DoResolve): Array Access can operate on
13137         non-variables. 
13138
13139 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
13140
13141         * assign.cs (CompoundAssign): A new class used as a "flag" that
13142         the assignment actually is happening as part of a compound
13143         assignment operator.
13144
13145         During compound assignment, a few new rules exist to enable things
13146         like:
13147
13148         byte b |= 1 + 2
13149
13150         From the spec:
13151
13152         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
13153         to the type of x) if y is implicitly convertible to the type of x,
13154         and the operator is a builtin operator and the return type of the
13155         operator is explicitly convertible to the type of x. 
13156
13157         * rootcontext.cs: Reset warning level to 2.  4 catches various
13158         "interesting" features in mcs, we must clean this up at some
13159         point, but currently am trying to kill other bugs ;-)
13160
13161         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
13162         in container classes as well.  
13163
13164         * expression.cs (Binary.ResolveOperator): Handle string case
13165         before anything else (as operator overloading does emit an error
13166         before doing anything else).
13167
13168         This code could go away when we move to a table driven model, but
13169         i could not come up with a good plan last night.
13170
13171 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
13172
13173         * typemanager.cs (CSharpName): reimplementation using regex.
13174         * class.cs: added null check for fields in Emit
13175         * rootcontext.cs: set warninglevel to 4
13176
13177 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
13178
13179         * typemanager.cs (CSharpName): reimplemented with Lupus
13180         suggestion.
13181
13182 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
13183
13184         * statement.cs (If): correclty implement Resolve, because we were
13185         not catching sem errors in there.  The same process is needed
13186         everywhere else. 
13187         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
13188
13189
13190         (Statement.Warning_DeadCodeFound): Factorize code.
13191         (While): Report dead code here too.
13192
13193         (Statement): Added Resolve virtual method to allow
13194         for resolution split from the emit code.
13195
13196 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
13197
13198         * statement.cs (EmitBoolExpression): No longer try to resolve the
13199         expression here.    
13200         (MakeBoolean): New utility function that resolve, implicitly
13201         converts to boolean and tags the expression. 
13202
13203
13204         (If, Do): Implement dead code elimination.
13205         (While): Implement loop inversion
13206
13207         (Do, While, For, If): Resolve the expression prior to calling our
13208         code generation.
13209
13210 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
13211
13212         * class.cs:
13213           - added method Report28 (warning: program has more than one entry point)
13214           - added method IsEntryPoint, implements paragraph 10.1 of the spec
13215           - modified method Method.Define, the part at the end of the method
13216
13217         * rootcontext.cs: added static public Location EntryPointLocation;
13218           
13219         * ../errors/cs0028.cs : Add test case for the above warning.              
13220
13221         * typemanager.cs:
13222           - modified method CSharpName to allow arrays of primitive type to
13223             be printed nicely (e.g. instead of System.Int32[][] it now prints
13224             int[][])
13225           - added method CSharpSignature: returns the signature of a method
13226             in string format to be used in reporting errors, warnings, etc.
13227
13228         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
13229         with String.Empty.
13230
13231 2002-04-26  Ravi Pratap  <ravi@ximian.com>
13232
13233         * delegate.cs (Define): Fix extremely silly bug where I was
13234         setting the type of the 'object' parameter of the BeginInvoke
13235         method to System.IAsyncResult instead of System.Object ;-)
13236
13237 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
13238
13239         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
13240         here. 
13241
13242         (Constructor.Emit): return if we fail to initialize the
13243         constructor.  Another door closed!  
13244
13245         * expression.cs (New.DoResolve): Improve error message (from -6 to
13246         1501).  Use DeclaredOnly lookup to find the exact constructor.
13247
13248         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
13249         loop.  This is useful.
13250
13251         * cs-parser.jay: Adjust the default parameters so that destructors
13252         have the proper signature.
13253
13254 2002-04-26  Martin Baulig  <martin@gnome.org>
13255
13256         * driver.cs (LoadAssembly): If `assembly' contains any characters
13257         which are only valid in path names and not in assembly names
13258         (currently slash, backslash and point), use Assembly.LoadFrom ()
13259         instead of Assembly.Load () on the `assembly' (before iteration
13260         over the link_paths).
13261
13262 2002-04-26  Martin Baulig  <martin@gnome.org>
13263
13264         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
13265
13266 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
13267
13268         * class.cs (Property): use the new typemanager.MemberLookup
13269
13270         (TypeContainer.MemberLookup): Implement using the
13271         TypeManager.MemberLookup now. 
13272
13273         * typemanager.cs: Make MemberLookup a function of the TypeManager,
13274         and return MemberInfos, so that these can be used without an
13275         EmitContext (what we had before).
13276
13277 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
13278
13279         * expression.cs: Fix the case where the argument to params if the
13280         type of the params.  I omitted handling this before.   Fixed
13281
13282 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
13283
13284         * driver.cs: Call BootCorlib_PopulateCoreType
13285
13286         * class.cs (Property.CheckBase): Check for properties only, not
13287         for all members. 
13288
13289         * interface.cs: Temporary hack: try/catch around the
13290         CustomAttributeBuilder, because I am getting an exception that I
13291         do not understand.
13292
13293         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
13294         types whose definitions are required to be there (attributes are
13295         defined before standard types).
13296
13297         Compute definitions as we boot the various types, as they are used
13298         immediately (value_type class will need object_type, but if we do
13299         not initialize object_type, we will pass a null, which will let
13300         the runtime pick the System.Object from the existing corlib, which
13301         is not what we want).
13302
13303 2002-04-22  Patrik Torstensson <totte@labs2.com>
13304
13305         * cs-tokenizer.cs: fixed a number of trim() issues.
13306
13307 2002-04-22  Ravi Pratap  <ravi@ximian.com>
13308
13309         * expression.cs (Argument.Type): Ensure that we return the correct
13310         type when we have out or ref parameters [in which case we 
13311         append a "&"].
13312
13313 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
13314
13315         * class.cs (Property, Indexer): Allow extern modifier in there. 
13316
13317         * typemanager.cs (InitBaseTypes): Initializes object_type and
13318         value_type, since those will be used early on during the bootstrap
13319         process to compile corlib.
13320
13321         (InitCoreTypes): Move code from here to InitBaseTypes.
13322
13323 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
13324
13325         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
13326         single-dimension arrays as using the ldlen opcode.  
13327
13328         Daniel Lewis discovered this optimization.  
13329
13330         * typemanager.cs: Add signature for System.Array::get_Length
13331
13332 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
13333
13334         * statement.cs: report the error when the foreach does not apply to an
13335         array nor a collection.
13336
13337 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
13338
13339         * expression.cs: Add implicit conversions to the operator ~.
13340
13341         * constant.cs (DecimalConstant.Emit): Emit decimal value.
13342
13343         * typemanager.cs: Locate the decimal constructor.
13344
13345 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
13346
13347         * attribute.cs: use the new property of TypeOf.
13348         * expression.cs: added 'get' property around typearg.
13349
13350         These changes fix a build breaker reported by NickD. Is this the
13351         correct way to fix?  If not, please, revert my changes and make it
13352         work :-).
13353
13354 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
13355
13356         * attribute.cs: Add support for typeof in attribute invocations.
13357         I am not sure that this is right though.
13358
13359 2002-04-14  Duncan Mak  <duncan@ximian.com>
13360
13361         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
13362         Binary.Operator.Division case.
13363
13364 2002-04-13  Ravi Pratap  <ravi@ximian.com>
13365
13366         * class.cs (DefineType): Ensure that we do a proper check on
13367         attribute types and also register it with the TypeManager.
13368
13369         (TypeContainer.Targets): The default for attribute types is
13370         AttributeTargets.All.
13371
13372         * attribute.cs (ApplyAttributes): Registering the attribute type
13373         is done elsewhere, not when we discover we have a Usage attribute.
13374
13375 2002-04-12  Ravi Pratap  <ravi@ximian.com>
13376
13377         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
13378         and get rid of is_delegate parameter.
13379
13380         * everywhere : update.
13381
13382 2002-04-12  Ravi Pratap  <ravi@ximian.com>
13383
13384         * cs-parser.jay (compilation_unit): Revamp completely to use
13385         some new ideas that I got from Rhys' grammar to solve the problems
13386         with assembly level attributes.
13387
13388         (outer_declaration): New grammar production.
13389
13390         (attribute_sections): Add.
13391
13392         (opt_attributes): Base on attribute_sections
13393
13394         (namespace_declaration): Allow opt_attributes to tackle the case
13395         when we have assembly level attributes - we are clever in this
13396         regard now ;-)
13397
13398         * attribute.cs (ApplyAttributes): Do not worry about assembly 
13399         attributes in the non-global context.
13400
13401         * rootcontext.cs (AddGlobalAttributes): Go back to using this
13402         instead of SetGlobalAttributes.
13403
13404         * class.cs, rootcontext.cs : Ensure we define and generate 
13405         attribute types before anything else.
13406
13407         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
13408         and flag the new error -20 for the case when the attribute type
13409         does not have valid targets specified. csc does not catch this.
13410
13411         * ../errors/errors.txt : update for error # -20
13412
13413 2002-04-11  Ravi Pratap  <ravi@ximian.com>
13414
13415         * support.cs (InternalParameters.ParameterModifier): Do some null
13416         checking and return sane values.
13417
13418         * class.cs (Method.Define): If we are a PInvoke method, ensure
13419         that we are static and extern. Report error # 601
13420
13421         * ../errors/cs0601.cs : Add test case for the above error.
13422
13423 2002-04-07  Ravi Pratap  <ravi@ximian.com>
13424
13425         * rootcontext.cs (attribute_types): We need to keep type of
13426         all attribute types separately and emit code for them first.
13427
13428         (RegisterAttribute) : Implement.
13429
13430         * class.cs (DefineType): Check if the current Type is a custom
13431         attribute type and register it accordingly.
13432
13433         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
13434         adding the first attribute twice and rename to
13435
13436         (SetGlobalAttributes): this.
13437
13438         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
13439         lookups.
13440
13441         * attribute.cs (ApplyAttributes): Take an additional argument telling us
13442         if we are processing global arguments. Hmm, I am unsure of this.
13443
13444 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
13445
13446         * expression.cs: added static array of strings to avoid calling
13447         Enum.ToString () for Operator in Binary. Significant recover of
13448         performance.
13449
13450 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
13451
13452         * class.cs (FindMembers): Allow the Builders of the various
13453         members to be null.  If they are skip them.  This only happens
13454         during the PInvoke declaration.
13455
13456 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
13457
13458         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
13459         failure, so we do not keep going afterwards.
13460
13461         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
13462         wanted to pass `false' as the `is_delegate' argument.  If this is
13463         the case, why not use delegate_type == null to mean `is_delegate =
13464         false' and anything else as is_delegate = true.
13465
13466 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
13467
13468         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
13469         code for the section, not the beginning of the tests.
13470
13471 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
13472
13473         * cfold.cs: Handle operator + (Enum x, Underlying x) 
13474
13475         * expression.cs (Binary): same.  Warn about errors where we have
13476         Enum/Enum in operator + as well.
13477
13478 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
13479
13480         * statement.cs:
13481                 - added support for switch(bool)
13482                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
13483                 - add TableSwitchEmit() to handle table-based switch statements
13484
13485 2002-04-05  Ravi Pratap  <ravi@ximian.com>
13486
13487         * expression.cs (Invocation.OverloadResolve): Factor out code which
13488         does parameter compatibility checking with arguments so that we can 
13489         re-use the code even from Delegate.VerifyApplicability
13490
13491         (VerifyArgumentsCompat): Move above code here.
13492
13493         * delegate.cs (VerifyApplicability): Get rid of duplicate code
13494         and instead make a call to the above method.
13495
13496 2002-03-31  Ravi Pratap  <ravi@ximian.com>
13497
13498         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
13499         We use it to keep track of classes which are attribute types.
13500
13501 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
13502
13503         * delegate.cs (Delegate.Define): Correctly define the types in the
13504         presence of fixed and array parameters.
13505
13506         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
13507         doing FindMembers.
13508
13509         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
13510         include NonPublic after the first iteration.
13511
13512         * class.cs (Indexer.CheckBase): Only check if both parents are
13513         non-null. 
13514
13515         * cs-parser.jay (accessor_body): If empty, set to null.
13516
13517         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
13518         same code path here to resolve constants names that we did have in
13519         MemberAccess.DoResolve.  There is too much code duplicated here.
13520
13521 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
13522
13523         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
13524
13525         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
13526         to MakeUnionSet.
13527
13528         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
13529         tokens, numbers and strings.
13530
13531         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
13532         parenthesis.
13533
13534         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
13535         asyncronous parameters and the regular parameters.  
13536
13537         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
13538         specify the target directory.
13539
13540         * expression.cs: (This.DoResolve): Simplify
13541         (As.Emit): Optimize, do not generate IsInst if the expression is
13542         always of the given type.
13543
13544         (Is.DoResolve): Bug fix, we were reporting both always/never for
13545         the is expression.
13546
13547         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
13548         creating too many unnecessary arrays.
13549
13550 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
13551
13552         * class.cs (EmitFieldInitializer): Use Assign expression to assign
13553         fields instead of rolling our own initializer.   Takes care of all
13554         implicit conversions, and drops unnecessary static checks/argument.
13555
13556 2002-03-31  Dick Porter  <dick@ximian.com>
13557
13558         * driver.cs: use the GetDirectories() return values properly, and
13559         use "/" as path separator.
13560
13561 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
13562
13563         * expression.cs (Unary): Optimize - - expr into expr.
13564         (Binary): Optimize a + (-b) into a -b.
13565
13566         * codegen.cs (CodeGen): Made all methods static.
13567
13568 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
13569
13570         * rootcontext.cs: 
13571
13572         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
13573         TypeBuilder property.
13574
13575         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
13576         instead. 
13577
13578         * tree.cs: Removed the various RecordXXXX, and replaced with a
13579         single RecordDecl.  Removed all the accessor methods, and just
13580         left a single access point Type 
13581
13582         * enum.cs: Rename DefineEnum to DefineType.
13583
13584         * decl.cs: New abstract method `DefineType' used to unify the
13585         Defines for Enumerations, Interfaces, TypeContainers and
13586         Delegates.
13587
13588         (FindType): Moved LookupInterfaceOrClass here.  Moved the
13589         LookupBaseClasses method that used to live in class.cs and
13590         interface.cs here, and renamed to FindType.
13591
13592         * delegate.cs: Implement DefineType.  Take advantage of the
13593         refactored pattern for locating the parent builder without taking
13594         the parent_builder argument (which we know does not work if we are
13595         nested, and triggering a toplevel definition).
13596
13597 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
13598
13599         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
13600         accessibility of a member has changed during override and report
13601         an error if so.
13602
13603         * class.cs (Method.Define, Property.Define): Only complain on
13604         overrides if the method is private, any other accessibility is
13605         fine (and since we just checked the permission is the same, we are
13606         good to go).
13607
13608         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
13609         and elif are processed always.  The other pre-processing
13610         directives are only processed if we are "taking" the path
13611
13612 2002-03-29  Martin Baulig  <martin@gnome.org>
13613
13614         * class.cs (Method.Emit): Only emit symbolic debugging info if the
13615         current location is not Null.
13616
13617         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
13618         a separate method so we can profile it.
13619
13620         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
13621         `span.Seconds' are just seconds, but no minutes or hours.
13622         (MainDriver): Profile the CodeGen.SaveSymbols calls.
13623
13624 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
13625
13626         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
13627         Remove the gratuitous set of Final:
13628
13629                                 // If an interface implementation, then we can set Final.
13630                                 if (((flags & MethodAttributes.Abstract) == 0) &&
13631                                     implementing.DeclaringType.IsInterface)
13632                                         flags |= MethodAttributes.Final;
13633
13634         I do not know what I was smoking when I used that.
13635
13636
13637         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
13638         step into fixing the name resolution issues for delegates and
13639         unifying the toplevel name resolution.
13640
13641 2002-03-28  Martin Baulig  <martin@gnome.org>
13642
13643         * class.cs (Method.Emit): If we have a symbol writer, call its
13644         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
13645         tell it about the current method.
13646
13647         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
13648         writer that we're going to emit the first byte of IL code for a new
13649         statement (a new source line).
13650         (EmitContext.EmitTopBlock): If we have a symbol writer, call
13651         EmitContext.Mark() before emitting any code.
13652
13653         * location.cs (SymbolDocument): Return null when we're Null.
13654
13655         * statement.cs (Statement): Moved the `Location loc' variable here.
13656         (Statement.EmitBoolExpression): If we have a symbol writer, call
13657         ec.Mark() before emitting any code to tell it that we're at the
13658         beginning of a new statement.
13659         (StatementExpression): Added `Location' argument to the constructor.
13660         (Block): Added public readonly variable `StartLocation' and public
13661         variable `EndLocation'.  The latter is to be set using SetEndLocation().
13662         (Block): Added constructor which takes a start and end location.
13663         (Block.SetEndLocation): New method. This sets the end location.
13664         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
13665         local variables we create.
13666         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
13667         each statement and do also mark the begin and end of the block.
13668
13669         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
13670         tell it the current lexer.Location, use Location.Null for the end of the
13671         block.
13672         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
13673         current block, set its end location using SetEndLocation().
13674         (statement_expression): StatementExpression constructor now takes the
13675         lexer.Location as additional argument.
13676         (for_statement, declare_local_variables): Likewise.
13677         (declare_local_variables): When creating a new implicit block, use the
13678         new Block constructor and pass it the lexer.Location.
13679
13680 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
13681
13682         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
13683         members also on the parent interfaces recursively.
13684
13685 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
13686
13687         * report.cs: Use new formats, since Gonzalo finished the missing
13688         bits. 
13689
13690         * expression.cs (Binary.ResolveOperator): added missing operator|
13691         operator& and operator^ for bool/bool.
13692
13693         * cs-parser.jay: CheckDef now takes a Location argument that is
13694         used to report errors more precisly (instead of reporting the end
13695         of a definition, we try to track something which is a lot closer
13696         to the source of the problem).
13697
13698         * cs-tokenizer.cs: Track global token use, so we can properly flag
13699         the use of #define/#undef after the first token has been seen.
13700
13701         Also, rename the reportXXXX to Error_DescriptiveName
13702
13703         * decl.cs (DeclSpace.IsTopLevel): Move property here from
13704         TypeContainer, so that Enum and Interface can use this too.
13705
13706         * class.cs (TypeContainer.LookupInterfaceOrClass,
13707         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
13708         `builder' argument.  Typically this was used to pass the parent
13709         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
13710         the definition).  
13711
13712         The problem is that a nested class could trigger the definition of
13713         a toplevel class, and the builder would be obviously wrong in that
13714         case. 
13715
13716         So we drop this argument, and we compute dynamically the
13717         TypeBuilder/ModuleBuilder (the correct information was available
13718         to us anyways from DeclSpace.Parent)
13719
13720         * interface.cs (Interface.DefineInterface): Drop builder
13721         parameter cleanup like class.cs
13722
13723         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
13724         like class.cs
13725
13726         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
13727         values. 
13728
13729         (Try.Emit): Propagate the returns value from the statement.
13730
13731         (Return.Emit): Even if we are leavning 
13732
13733         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
13734
13735         * modifiers.cs: Fix the computation of MethodAttributes flags.
13736
13737 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
13738
13739         * driver.cs: allow compilation of files that start with '/'.
13740         Add a default case when checking the argument of --target.
13741
13742 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
13743
13744         * interface.cs: Implement the same search algorithm for types in
13745         the interface code.
13746
13747         * delegate.cs: Do not allow multiple definition.
13748
13749         * Recovered ChangeLog that got accidentally amputated
13750
13751         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
13752
13753         * rootcontext.cs: Load manually enum to allow core classes to
13754         contain enumerations.
13755
13756         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
13757         Update to new static methods in TypeManager.
13758
13759         * typemanager.cs (GetMethod, GetConstructor): Use our
13760         implementation of FindMembers to find the members, since during
13761         corlib compilation, the types are TypeBuilders and GetMethod and
13762         GetConstructor do not work.
13763
13764         Make all methods in TypeManager static.
13765
13766         (InitCodeHelpers): Split the functionality from
13767         the InitCodeTypes function.
13768
13769         * driver.cs: Call InitCodeHelpers after we have populated the
13770         types. 
13771
13772         * cs-parser.jay (delegate_declaration): we did not used to compute
13773         the delegate name correctly for void delegates.
13774
13775 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
13776
13777         * rootcontext.cs (RootContext): Init the interface_resolve_order
13778         and type_container_resolve_order always.
13779
13780         (ResolveCore, BootstrapCorlib_ResolveClass,
13781         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
13782         compiler when compiling with --nostdlib
13783
13784         * class.cs (TypeContainer.DefineType): Check that our parent is
13785         not null.  This test is most important when we are bootstraping
13786         the core types.
13787
13788         * codegen.cs: Split out the symbol writing code.
13789
13790 2002-03-25  Martin Baulig  <martin@gnome.org>
13791
13792         * driver.cs (-g): Made -g an alias for --debug.
13793
13794 2002-03-24  Martin Baulig  <martin@gnome.org>
13795
13796         * codegen.cs (SymbolWriter): New public variable. Returns the
13797         current symbol writer.
13798         (CodeGen): Added `bool want_debugging_support' argument to the
13799          constructor. If true, tell the ModuleBuild that we want debugging
13800         support and ask it for the ISymbolWriter.
13801         (Save): If we have a symbol writer, call it's Close() method after
13802         saving the assembly.
13803
13804         * driver.c (--debug): New command line argument to create a
13805         debugger information file.
13806
13807         * location.cs (SymbolDocument): New public property. Returns an
13808         ISymbolDocumentWriter object for the current source file or null
13809         if we don't have a symbol writer.
13810
13811 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
13812
13813         * driver.cs (LoadAssembly): Correctly return when all the paths
13814         have been tried and not before.
13815
13816         * statement.cs (Switch.Emit): return the actual coverage for this
13817         statement (returns/not-returns)
13818
13819         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
13820         switch of the statement if we are the last switch section.  That
13821         kills two problems: try/catch problems (we used to emit an empty
13822         nop at the end) and switch statements where all branches would
13823         return. 
13824
13825 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
13826
13827         * driver.cs: Add default assemblies (the equivalent to the
13828         Microsoft CSC.RSP file)
13829
13830         * cs-tokenizer.cs: When updating `cols and setting it to zero,
13831         also update tokens_seen and set it to false.
13832
13833         * driver.cs: Implement --recurse for Mike.
13834
13835         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
13836         correctly splitting out the paths.
13837
13838 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
13839
13840         * interface.cs (Interface.PopulateProperty): Instead of using
13841         `parent' as the declaration space for the set parameters, use
13842         `this' 
13843
13844         * support.cs (InternalParameters): InternalParameters constructor
13845         takes a DeclSpace instead of a TypeContainer.
13846
13847         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
13848         types are being initialized, load the address of it before calling
13849         the function.  
13850
13851         (New): Provide a mechanism to disable the generation of local
13852         value type temporaries when the caller will be providing us with
13853         an address to store it.
13854
13855         (ArrayCreation.EmitDynamicInitializers): Use it.
13856
13857 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
13858
13859         * expression.cs (Invocation.EmitArguments): Only probe for array
13860         property if there is more than one argument.  Sorry about that.
13861
13862         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
13863         empty param arrays.
13864
13865         * class.cs (Method.LabelParameters): Fix incorrect code path that
13866         prevented the `ParamArrayAttribute' from being applied to the
13867         params attribute.
13868
13869 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
13870
13871         * support.cs (ReflectionParameters): Correctly compute whether the
13872         last argument is a params array.  Fixes the problem with
13873         string.Split ('a')
13874
13875         * typemanager.cs: Make the assemblies array always be non-null
13876         (empty, but non-null)
13877
13878         * tree.cs (RecordDecl): New function that abstracts the recording
13879         of names.  This reports error 101, and provides a pointer to the
13880         previous declaration.  Fixes a crash in the compiler.
13881
13882         * cs-parser.jay (constructor_declaration): Update to new grammar,
13883         and provide a constructor_body that can be empty.
13884
13885 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
13886
13887         * driver.cs: Add support for --resources.
13888
13889         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
13890         Make all types for the various array helper methods be integer.
13891
13892         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
13893         CheckState to ConvCast.
13894
13895         (ConvCast): Now it takes a `checked' state argument, to avoid
13896         depending on the emit context for the conversion, and just using
13897         the resolve time setting.
13898
13899         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
13900         instead of Invocation.EmitArguments.  We do not emit the original
13901         arguments, instead we emit those which have been converted to
13902         unsigned int expressions.
13903
13904         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
13905
13906         * codegen.cs: ditto.
13907
13908         * expression.cs (LocalVariableReference): Drop the use of the
13909         Store function that depended on the variable index.
13910
13911         * statement.cs (VariableInfo): Drop the `Idx' property from this
13912         class, as this is not taking into account the indexes for
13913         temporaries tat we generate during the execution, getting the
13914         indexes wrong.
13915
13916         * class.cs: First emit class initializers, then call the parent
13917         constructor. 
13918
13919         * expression.cs (Binary): Fix opcode emision.
13920         (UnaryMutator.EmitCode): Support checked code generation
13921
13922         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
13923         matches for events for both the Static and Instance scans,
13924         pointing to the same element.   Fix that.
13925
13926 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
13927
13928         * rootcontext.cs (ResolveTree): Always set the
13929         interface_resolve_order, because nested interfaces will be calling
13930         into us.
13931
13932         * class.cs (GetInterfaceOrClass): Track the same resolution
13933         process used by TypeManager.LookupType.  This fixes the nested
13934         type lookups in class declarations (separate path from
13935         LookupType). 
13936
13937         (TypeContainer.DefineType): Also define nested interfaces.
13938         (TypeContainer.RegisterOrder): New public function used to
13939         register the order in which child interfaces need to be closed.
13940
13941         Nested interfaces need to be closed after their parents have been
13942         created. 
13943
13944         * interface.cs (InterfaceAttr): Put all the logic for computing
13945         the interface attribute here. 
13946
13947         (DefineInterface): Register our interface order with the
13948         RootContext or with the TypeContainer depending on the case.
13949
13950 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
13951
13952         * cs-parser.jay: rework foreach statement to work with the new
13953         changes to the policy on SimpleNames.
13954
13955         * report.cs: support Stacktrace on warnings as well.
13956
13957         * makefile: drop --unsafe and /unsafe from the compile.
13958
13959 2002-03-13  Ravi Pratap  <ravi@ximian.com>
13960
13961         * ecore.cs (StandardConversionExists): Modify to take an Expression
13962         as the first parameter. Ensure we do null -> reference type conversion
13963         checking.
13964
13965         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
13966         temporary Expression objects.
13967
13968 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
13969
13970         * interface.cs: workaround bug in method overloading resolution
13971         (there is already a bugzilla bug for it).
13972
13973 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
13974
13975         We could also solve this problem by having a separate path for
13976         performing type lookups, instead of DoResolve, we could have a
13977         ResolveType entry point, and only participating pieces of the
13978         production (simplename, deref, array) would implement this. 
13979
13980         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
13981         signal SimpleName to only resolve type names and not attempt to
13982         resolve anything else.
13983
13984         * expression.cs (Cast): Set the flag.
13985
13986         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
13987
13988         * class.cs: Only report 108 if there is no `new' modifier.
13989
13990         * cs-parser.jay: rework foreach statement to work with the new
13991         changes to the policy on SimpleNames.
13992         
13993         * report.cs: support Stacktrace on warnings as well.
13994
13995         * makefile: drop --unsafe and /unsafe from the compile.
13996
13997 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
13998
13999         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
14000         lookups here, instead of doing that at parse time.  This means
14001         that our grammar will not introduce `LocalVariableReferences' as
14002         expressions at this point.  That solves the problem of code like
14003         this:
14004
14005         class X {
14006            static void Main ()
14007            { int X = 1;
14008             { X x = null }}}
14009
14010         This is only half the fix.  The full fix requires parameters to
14011         also be handled in this way.
14012
14013         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
14014         makes the use more obvious of the DeclSpace.  The
14015         ec.TypeContainer.TypeBuilder is now only used to pull the
14016         TypeBuilder for it.
14017
14018         My theory is that I can get rid of the TypeBuilder completely from
14019         the EmitContext, and have typecasts where it is used (from
14020         DeclSpace to where it matters).  
14021
14022         The only pending problem is that the code that implements Aliases
14023         is on TypeContainer, and probably should go in DeclSpace.
14024
14025         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
14026         lookups here, instead of doing that at parse time.  This means
14027         that our grammar will not introduce `LocalVariableReferences' as
14028         expressions at this point.  That solves the problem of code like
14029         this:
14030
14031         class X {
14032            static void Main ()
14033            { int X = 1;
14034             { X x = null }}}
14035
14036         This is only half the fix.  The full fix requires parameters to
14037         also be handled in this way.
14038
14039         * class.cs (Property.DefineMethod): When implementing an interface
14040         method, set newslot, when implementing an abstract method, do not
14041         set the flag (before we tried never setting it, or always setting
14042         it, which is the difference).
14043         (Indexer.DefineMethod): same.
14044         (Method.DefineMethod): same.
14045
14046         * ecore.cs: Only set the status used flag if we get back a Field.
14047
14048         * attribute.cs: Temporary hack, so Paolo can keep working.
14049
14050 2002-03-08  Ravi Pratap  <ravi@ximian.com>
14051
14052         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
14053         the unmanaged type in the case we have a MarshalAs attribute.
14054
14055         (Resolve): Handle the case when we are parsing the special MarshalAs
14056         attribute [we need to store the unmanaged type to use later]
14057
14058         * typemanager.cs (marshal_as_attr_type): Built in type for the 
14059         MarshalAs Attribute.
14060
14061         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
14062         on parameters and accordingly set the marshalling info.
14063
14064 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
14065
14066         * class.cs: Optimizing slightly by removing redundant code after
14067         we switched to the `NoTypes' return value.
14068         (Property.DefineMethod): use NoTypes here too.
14069
14070         This fixes the bug I introduced in my last batch of changes.
14071
14072 2002-03-05  Ravi Pratap  <ravi@ximian.com>
14073
14074         * tree.cs (RecordEnum): Add. We now keep track of enums too.
14075
14076         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
14077         Enums since those are types too. 
14078
14079         * cs-parser.jay (enum_declaration): Record enums as we parse them.
14080
14081         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
14082         thanks to a call during the lookup process.
14083
14084 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
14085
14086         * statement.cs (Foreach): Lots of work to accomodate a particular
14087         kind of foreach statement that I had not kept in mind.  It is
14088         possible to have foreachs on classes that provide a GetEnumerator
14089         method that return objects that implement the "pattern" for using
14090         a foreach, there is no need to support GetEnumerator
14091         specifically. 
14092
14093         This is needed to compile nant.
14094
14095         * decl.cs: Only report 114 if the member is not `Finalize' and if
14096         the warning level is at least 2.
14097
14098         * class.cs: Moved the compare function from Method to
14099         MethodSignature. 
14100
14101         (MethodSignature.InheritableMemberSignatureCompare): Add new
14102         filter function that is used to extract inheritable methods from a
14103         class. 
14104
14105         (Method.Define): Use the new `inheritable_method_signature_filter'
14106         delegate
14107
14108         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
14109         command. 
14110
14111 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
14112
14113         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
14114
14115         * cs-parser.jay: Add opt_semicolon to the interface declaration.
14116
14117         * expression.cs: Pass location information to
14118         ConvertImplicitStandard. 
14119
14120         * class.cs: Added debugging code to track return values from
14121         interfaces. 
14122
14123 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
14124
14125         * expression.cs (Is.DoResolve): If either side of the `is' is an
14126         interface, do not flag the warning.
14127
14128         * ecore.cs (ImplicitReferenceConversion): We need a separate test
14129         for interfaces
14130
14131         * report.cs: Allow for --fatal to be used with --probe.
14132
14133         * typemanager.cs (NoTypes): Move the definition for the empty Type
14134         array here. 
14135
14136         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
14137         properties. 
14138         (TypeContainer.DefineProxy): New function used to proxy to parent
14139         implementations when implementing interfaces.
14140         (TypeContainer.ParentImplements): used to lookup if our parent
14141         implements a public function that is required by an interface.
14142         (TypeContainer.VerifyPendingMethods): Hook this up.
14143
14144         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
14145         `modules' and `assemblies' arraylists into arrays.  We only grow
14146         these are the very early start up of the program, so this improves
14147         the speedof LookupType (nicely measured).
14148
14149         * expression.cs (MakeByteBlob): Replaced unsafe code with
14150         BitConverter, as suggested by Paolo.
14151
14152         * cfold.cs (ConstantFold.Binary): Special case: perform constant
14153         folding of string concatenation, but if either side is a string,
14154         and the other is not, then return null, and let the runtime use
14155         the concatenation on the string plus the object (using
14156         `Object.ToString'). 
14157
14158 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
14159
14160         Constant Folding has been implemented now.
14161
14162         * expression.cs (Unary.Reduce): Do not throw an exception, catch
14163         the error instead on types that are not supported in one's
14164         complement. 
14165
14166         * constant.cs (Constant and all children): New set of functions to
14167         perform implict and explicit conversions.
14168
14169         * ecore.cs (EnumConstant): Implement the new functions to perform
14170         conversion by proxying to the child expression.
14171
14172         * codegen.cs: (ConstantCheckState): Constant evaluation has its
14173         own separate setting that can not be turned off from the command
14174         line using --unchecked or --checked and is only controlled using
14175         the checked/unchecked statements and expressions.  This setting is
14176         used by the constant folder to flag errors.
14177
14178         * expression.cs (CheckedExpr, UncheckedExpr): Set the
14179         ConstantCheckState as well.   
14180
14181         During Resolve, they also have to flag the state, because the
14182         constant folder runs completely in the Resolve phase.
14183
14184         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
14185         well.
14186
14187 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
14188
14189         * cfold.cs: New file, this file contains the constant folder.
14190
14191         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
14192         argument to track whether we are using the resulting address to
14193         load or store a value and provide better error messages. 
14194
14195         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
14196         new AddressOf arguments.
14197
14198         * statement.cs (Foreach.EmitCollectionForeach): Update
14199
14200         * expression.cs (Argument.Emit): Call AddressOf with proper
14201         arguments to track usage.
14202
14203         (New.DoEmit): Call AddressOf with new arguments.
14204
14205         (Unary.Emit): Adjust AddressOf call.
14206
14207 2002-03-01  Ravi Pratap  <ravi@ximian.com>
14208
14209         * cs-parser.jay (member_access): Change the case for pre-defined types
14210         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
14211         this suggestion.
14212
14213         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
14214         a method body.
14215
14216         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
14217         essentially like methods and apply attributes like MethodImplOptions to them too.
14218
14219         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
14220         not being null.
14221
14222         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
14223         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
14224         is the DeclSpace.
14225
14226         * Update code everywhere accordingly.
14227
14228         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
14229
14230         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
14231
14232 2002-02-28  Ravi Pratap  <ravi@ximian.com>
14233
14234         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
14235         try performing lookups against those instead of jumping straight into using
14236         the 'using' clauses.
14237
14238         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
14239
14240         (LookupType): Perform lookups in implicit parents too.
14241
14242         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
14243         sequence as RootContext.LookupType. 
14244
14245         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
14246         the various cases of namespace lookups into this method.
14247
14248 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
14249
14250         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
14251         in positional arguments)
14252
14253         * class.cs (Operator): Update the AllowedModifiers to contain
14254         extern. 
14255
14256         * cs-parser.jay: Update operator declaration to allow for the
14257         operator body to be empty.
14258
14259         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
14260         values. 
14261
14262 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
14263
14264         * class.cs (Method.Emit): Label parameters.
14265
14266         * driver.cs: Return 1 or 0 as the program exit code.
14267
14268 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
14269
14270         * expression.cs: Special case the `null' object when trying to
14271         auto-compute the type, as anything can be explicitly converted to
14272         that. 
14273
14274         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
14275         spotting this Paolo.
14276
14277         (Expression.ImplicitNumericConversion): Perform comparissions of
14278         the type using the underlying type in the case of an enumeration
14279         rather than using the enumeration type for the compare.
14280
14281         Cope with the underlying == type case, which is not possible to
14282         catch before. 
14283
14284         (Expression.ConvertNumericExplicit): Perform comparissions of
14285         the type using the underlying type in the case of an enumeration
14286         rather than using the enumeration type for the compare.
14287
14288         * driver.cs: If the user does not supply an extension, assume .exe
14289
14290         * cs-parser.jay (if_statement): Rewrote so that we can track the
14291         location for the if statement.
14292
14293         * expression.cs (Binary.ConstantFold): Only concat strings when
14294         the operation is "+", not everything ;-)
14295
14296         * statement.cs (Statement.EmitBoolExpression): Take a location
14297         argument. 
14298         (If, While, Do): Track location.
14299
14300         * expression.cs (Binary.ResolveOperator): In the object + string
14301         case, I was missing a call to ConvertImplicit
14302
14303 2002-02-25  Ravi Pratap  <ravi@ximian.com>
14304
14305         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
14306         Location arguments. Ensure we use RootContext.LookupType to do our work
14307         and not try to do a direct Type.GetType and ModuleBuilder.GetType
14308
14309         * interface.cs (PopulateMethod): Handle the type of the parameter being
14310         null gracefully.
14311
14312         * expression.cs (Invocation.BetterFunction): Handle the case when we 
14313         have a params method with no fixed arguments and a call is made with no
14314         arguments.
14315
14316 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
14317
14318         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
14319         the verbatim-string-literal
14320
14321         * support.cs (InternalParameters.ParameterModifier): handle null
14322         fixed parameters.
14323         (InternalParameters.ParameterType): ditto.
14324
14325         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
14326         duplicating the name of the variable parameter.
14327         (GetParameterByName): Fix bug where we were not looking up array
14328         paramters if they were the only present (thanks Paolo!).
14329         (GetParameterInfo): We only have an empty set of types if both
14330         fixed and array are set to null.
14331         (GetParameterInfo-idx): Handle FixedParameter == null
14332
14333         * cs-parser.jay: Handle the case where there is no catch
14334         statements (missing null test).
14335
14336 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
14337
14338         * driver.cs (MainDriver): Be conservative on our command line
14339         handling.
14340
14341         Catch DirectoryNotFoundException when calling GetFiles.
14342
14343         (SplitPathAndPattern): Used to split the input specification into
14344         a path and a pattern that we can feed to Directory.GetFiles.
14345
14346 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
14347
14348         * statement.cs (Fixed): Implement the last case of the Fixed
14349         statement (string handling).
14350
14351         * expression.cs (StringPtr): New class used to return a char * to
14352         a string;  Used by the Fixed statement.
14353
14354         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
14355
14356         * expression.cs (Binary.ResolveOperator): Remove redundant
14357         MemberLookup pn parent type.
14358         Optimize union call, we do not need a union if the types are the same.
14359         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
14360         type.
14361
14362         Specialize the use of MemberLookup everywhere, instead of using
14363         the default settings. 
14364
14365         (StackAlloc): Implement stackalloc keyword.
14366
14367         * cs-parser.jay: Add rule to parse stackalloc.
14368
14369         * driver.cs: Handle /h, /help, /?
14370
14371         * expression.cs (MakeByteBlob): Removed the hacks we had in place
14372         before we supported unsafe code.
14373
14374         * makefile: add --unsafe to the self compilation of mcs.
14375
14376 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
14377
14378         * expression.cs (PointerArithmetic): New class that is used to
14379         perform pointer arithmetic.
14380         (Binary.Resolve): Handle pointer arithmetic
14381         Handle pointer comparission.
14382         (ArrayPtr): Utility expression class that is used to take the
14383         address of an array.
14384
14385         (ElementAccess): Implement array access for pointers
14386
14387         * statement.cs (Fixed): Implement fixed statement for arrays, we
14388         are missing one more case before we are done.
14389
14390         * expression.cs (Indirection): Implement EmitAssign and set the
14391         ExprClass to Variable.  This allows pointer dereferences to be
14392         treated as variables, and to have values assigned to them.
14393
14394         * ecore.cs (Expression.StoreFromPtr): New utility function to
14395         store values dereferencing.
14396
14397 2002-02-20  Ravi Pratap  <ravi@ximian.com>
14398
14399         * expression.cs (Binary.ResolveOperator): Ensure that we are
14400         not trying to operate on a void type - this fixes the reported
14401         bug.
14402
14403         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
14404         the parent implementation is sealed.
14405
14406         * ../errors/cs0239.cs : Add.
14407
14408         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
14409
14410         * typemanager.cs (unverifiable_code_type): Corresponds to 
14411         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
14412         which have unsafe code in them.
14413
14414         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
14415         unsafe context.
14416
14417 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
14418
14419         * cs-tokenizer.cs: Add support for @"litreal strings"
14420
14421         Make tokenizer accept pre-processor directives
14422         on any column (remove the old C-like limitation). 
14423
14424         * rootcontext.cs (EmitCode): Emit any global attributes.
14425         (AddGlobalAttributes): Used to keep track of assembly attributes. 
14426
14427         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
14428
14429         * cs-parser.jay: Add support for global attributes.  
14430
14431 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
14432
14433         * expression.cs (Indirection): New helper class.  Unary will
14434         create Indirection classes to be able to implement the
14435         IMemoryLocation interface on it.
14436
14437 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
14438
14439         * cs-parser.jay (fixed_statement): reference the right statement.
14440
14441         * statement.cs (Fixed.Emit): Finish implementing the fixed
14442         statement for the &x case.
14443
14444 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
14445
14446         * class.cs (Property.Define, Method.Define): Remove newslot when
14447         `implementing'.  
14448
14449         * modifiers.cs: My use of NewSlot when `Abstract' was set was
14450         wrong.  NewSlot should only be used if the `new' keyword is present.
14451
14452         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
14453         locating our system dir.  Sorry about this.
14454
14455 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
14456
14457         * driver.cs (GetSystemDir): Compute correctly the location of our
14458         system assemblies.  I was using the compiler directory instead of
14459         the library directory.
14460
14461 2002-02-13  Ravi Pratap  <ravi@ximian.com>
14462
14463         * expression.cs (BetterFunction): Put back in what Miguel commented out
14464         since it is the correct fix. The problem is elsewhere ;-)
14465
14466         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
14467         parameters of the parms method are themselves compatible or not !
14468
14469         (StandardConversionExists): Fix very dangerous bug where we were forgetting
14470         to check that a class implements an interface before saying that an implicit
14471         conversion was allowed. Use ImplementsInterface to do the checking.
14472
14473 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
14474
14475         * class.cs (Method.Define): Track whether we are an explicit
14476         implementation or not.  And only call DefineMethodOverride if we
14477         are an explicit implementation.
14478
14479         (Property.DefineMethod): Ditto.
14480
14481 2002-02-11  Ravi Pratap  <ravi@ximian.com>
14482
14483         * expression.cs (BetterFunction): Catch hideous bug which was
14484          preventing us from detecting ambiguous calls due to implicit casts i.e
14485         cs0121.
14486
14487 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
14488
14489         * support.cs (Pair): Remove un-needed method.  I figured why I was
14490         getting the error in cs-parser.jay, the variable in a foreach loop
14491         is readonly, and the compiler does not really treat this as a variable.
14492
14493         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
14494         instead of EQUALS in grammar.  
14495
14496         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
14497
14498         * expression.cs (Unary.DoResolve): Check whether the argument is
14499         managed or not.
14500
14501 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
14502
14503         * support.cs: Api for Pair to set a value.  Despite the fact that
14504         the variables are public the MS C# compiler refuses to compile
14505         code that accesses the field if the variable is part of a foreach
14506         statement. 
14507
14508         * statement.cs (Fixed): Begin implementation of the fixed
14509         statement.
14510
14511         (Block.AddVariable): Return the VariableInfo on success and null
14512         on failure instead of true/false. 
14513
14514         * cs-parser.jay (foreach): Catch errors on variables already
14515         defined (we were ignoring this value before) and properly unwind
14516         the block hierarchy
14517
14518         (fixed_statement): grammar for the fixed statement.
14519
14520 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
14521
14522         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
14523         pointer types to be incretemented.
14524
14525         (SizeOf): Implement.
14526
14527         * cs-parser.jay (pointer_member_access): Implement
14528         expr->IDENTIFIER production.
14529
14530         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
14531         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
14532         on safe contexts.
14533
14534         (Unary): Implement indirection.
14535
14536         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
14537         use in non-unsafe context).
14538
14539         (SimpleName.DoResolve): Check for pointers in field access on safe
14540         contexts. 
14541
14542         (Expression.LoadFromPtr): Factor the load-indirect code in this
14543         function.  This was duplicated in UnboxCast and ParameterReference
14544
14545 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
14546
14547         * expression.cs (ComposedCast): report an error if a pointer cast
14548         is used in a safe region.
14549
14550         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
14551         pointer type casts in unsafe context.
14552
14553         * codegen.cs (EmitContext): Set up IsUnsafe.
14554
14555         * cs-parser.jay (non_expression_type): Add productions for pointer
14556         casts. 
14557
14558         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
14559         code.  We should not use force into static mode if the method is
14560         not virtual.  Fixes bug in MIS
14561
14562         * statement.cs (Do.Emit, While.Emit, For.Emit,
14563         Statement.EmitBoolExpression): Add support to Do and While to
14564         propagate infinite loop as `I do return' semantics.
14565
14566         Improve the For case to also test for boolean constants.
14567
14568         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
14569         to the list of attributes we can add.
14570
14571         Remove `EmitContext' argument.
14572
14573         * class.cs (Method.Define): Apply parameter attributes.
14574         (Constructor.Define): Apply parameter attributes.
14575         (MethodCore.LabelParameters): Move here the core of labeling
14576         parameters. 
14577
14578         * support.cs (ReflectionParameters.ParameterModifier,
14579         InternalParameters.ParameterModifier): Use IsByRef on the type and
14580         only return the OUT bit for these parameters instead of in/out/ref
14581         flags.
14582
14583         This is because I miss-understood things.  The ParameterInfo.IsIn
14584         and IsOut represent whether the parameter has the [In] and [Out]
14585         attributes set.  
14586
14587 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
14588
14589         * ecore.cs (FieldExpr.Emit): Release temporaries.
14590
14591         * assign.cs (LocalTemporary.Release): new function.
14592
14593         * codegen.cs (EmitContext.GetTemporaryStorage,
14594         EmitContext.FreeTemporaryStorage): Rework the way we deal with
14595         temporary storage.  Now we can "put back" localbuilders when we
14596         are done with them
14597
14598 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
14599
14600         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
14601         need to make a copy of the variable to generate verifiable code.
14602
14603 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
14604
14605         * driver.cs: Compute dynamically the system directory.
14606
14607         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
14608         Slower, but more generally useful.  Used by the abstract
14609         registering implementation. 
14610
14611         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
14612         the rules for the special rule on Type/instances.  First check if
14613         we have the same name, and if so, try that special static path
14614         rather than the instance path.
14615
14616 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
14617
14618         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
14619         for, while and if.
14620
14621         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
14622         Enum, ValueType, Delegate or Array for non-corlib compiles.
14623
14624         * cs-tokenizer.cs: Catch long identifiers (645)
14625
14626         * typemanager.cs (IndexerPropetyName): Ravi never tested this
14627         piece of code.
14628
14629         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
14630         fix, we were returning too early, so we were not registering
14631         pending methods from abstract classes.
14632
14633         Do not register pending methods if the class is abstract.
14634
14635         * expression.cs (Conditional.DoResolve): Report circular implicit
14636         conversions when we neecd to compute it for conditional
14637         expressions. 
14638
14639         (Is.DoResolve): If the expression is always of the provided type,
14640         flag warning 183.  If the expression can not ever be of the
14641         provided type flag warning 184.
14642
14643         * class.cs: Catch 169 as well.
14644
14645         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
14646         read. 
14647
14648 2002-01-18  Nick Drochak  <ndrochak@gol.com>
14649
14650         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
14651
14652 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
14653
14654         * interface.cs: (PopulateMethod): Check for pointers being defined
14655         only if the unsafe context is active.
14656         (PopulateProperty): ditto.
14657         (PopulateIndexer): ditto.
14658
14659         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
14660         specified.  If pointers are present, make sure that they are
14661         present in an unsafe context.
14662         (Constructor, Constructor.Define): ditto.
14663         (Field, Field.Define): ditto.
14664         (Property, Property.Define): ditto.
14665         (Event, Event.Define): ditto.
14666
14667         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
14668         hashtable if there are classes or structs defined.
14669
14670         * expression.cs (LocalVariableReference.DoResolve): Simplify this
14671         code, as the constant resolution moved.
14672
14673         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
14674         the metadata, so we can flag error 133. 
14675
14676         * decl.cs (MemberCore.UnsafeOK): New function to test that a
14677         pointer is being declared in an unsafe context.
14678
14679 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
14680
14681         * modifiers.cs (Modifiers.Check): Require a Location argument.
14682         Report error 227 for Unsafe use.
14683
14684         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
14685
14686         * statement.cs (For.Emit): If the test is null, then report that
14687         we do `return', as we wont reach anything afterwards.
14688
14689         (Switch.SwitchGoverningType): Track the expression that matched
14690         the conversion.
14691
14692         * driver.cs: Allow negative numbers as an error code to flag.
14693
14694         * cs-parser.jay: Handle 1551.
14695
14696         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
14697
14698 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
14699
14700         * cs-parser.jay: Report 1518 (type declaration can only contain
14701         class, struct, interface, enum or delegate)
14702
14703         (switch_label): Report 1523 (keywords `case' or `default' must
14704         preced code)
14705
14706         (opt_switch_sections): Report 1522 (empty switch)
14707
14708         * driver.cs: Report 1515 (response file specified multiple times)
14709         Report 1516 (Source file specified multiple times).
14710
14711         * expression.cs (Argument.Resolve): Signal 1510
14712
14713         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
14714         access not allowed in static code)
14715
14716 2002-01-11  Ravi Pratap  <ravi@ximian.com>
14717
14718         * typemanager.cs (IsPointerType): Utility method which we are going
14719         to need a lot.
14720
14721         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
14722         the object type, so we take care of that.
14723
14724         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
14725
14726         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
14727         added to non-params parameters :-)
14728
14729         * typemanager.cs (CSharpName): Include 'void' type too. 
14730
14731         (void_ptr_type): Include in the set of core types.
14732
14733         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
14734         duplicating code.
14735
14736         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
14737         an unsafe context.
14738
14739         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
14740         completely forgotten about it.
14741
14742 2002-01-10  Ravi Pratap  <ravi@ximian.com>
14743
14744         * cs-parser.jay (pointer_type): Add. This begins our implementation
14745         of parsing rules for unsafe code.
14746
14747         (unsafe_statement): Implement.
14748
14749         (embedded_statement): Modify to include the above.
14750
14751         * statement.cs (Unsafe): Implement new class for unsafe blocks.
14752
14753         * codegen.cs (EmitContext.InUnsafe): Add. This determines
14754         if the current context is an unsafe one.
14755
14756         * cs-parser.jay (local_variable_pointer_type): Since local variable types
14757         are handled differently, we need separate rules for them.
14758
14759         (local_variable_declaration): Update to use local_variable_pointer_type
14760         to allow variable declarations of unmanaged pointer types.
14761
14762         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
14763         in unsafe contexts.
14764
14765         * ../errors/cs0214.cs : Add.
14766
14767 2002-01-16  Nick Drochak  <ndrochak@gol.com>
14768
14769         * makefile: remove 'response' file when cleaning.
14770
14771 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
14772
14773         * cs-parser.jay: Report 1524.
14774
14775 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
14776
14777         * typemanager.cs (RegisterMethod): drop checking if we have
14778         registered this from here
14779
14780 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
14781
14782         * class.cs (Method.EmitDestructor): Implement calling our base
14783         destructor. 
14784
14785         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
14786         value of InFinally.
14787
14788         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
14789         this routine and will wrap the call in a try/catch block.  Deal
14790         with the case.
14791
14792 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
14793
14794         * ecore.cs (Expression.MemberLookup): instead of taking a
14795         parameter `same_type' that was used to tell whether we could
14796         access private members we compute our containing type from the
14797         EmitContext.
14798
14799         (FieldExpr): Added partial support for volatile fields.  This does
14800         not work for volatile fields exposed from assemblies, as I can not
14801         figure out how to extract the modreq from it.
14802
14803         Updated all the source files to use this.
14804
14805         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
14806         because it is referenced by MemberLookup very often. 
14807
14808 2002-01-09  Ravi Pratap  <ravi@ximian.com>
14809
14810         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
14811         TypeBuilder.GetCustomAttributes to retrieve what we need.
14812
14813         Get rid of redundant default_member_attr_type as this is the same as
14814         default_member_type which already exists.
14815
14816         * interface.cs, attribute.cs : Update accordingly.
14817
14818 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
14819
14820         * typemanager.cs: Enable IndexerPropertyName again.  It does not
14821         work for TYpeBuilders though.  Ravi, can you please fix this?
14822
14823         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
14824
14825         * expression.cs (Argument.Emit): Handle the case of ref objects
14826         being passed to ref functions;  
14827
14828         (ParameterReference.EmitLoad): Loads the content of the pointer
14829         without dereferencing.
14830
14831 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
14832
14833         * cs-tokenizer.cs: Implemented the pre-processing expressions.
14834
14835 2002-01-08  Ravi Pratap  <ravi@ximian.com>
14836
14837         * class.cs (Indexer.DefineMethod): Incorporate the interface
14838         type in the name of the method if we are doing explicit interface
14839         implementation.
14840
14841         * expression.cs (ConversionExists): Remove as it is completely obsolete.
14842
14843         (BetterConversion): Fix extremely trivial bug where we were referring to
14844         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
14845         again !
14846
14847         * ../errors/bug16.cs : Add although we have fixed it.
14848
14849 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
14850
14851         * expression.cs (BaseIndexer): Begin implementation.
14852
14853         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
14854
14855         * cs-parser.jay (indexer_declarator): Use qualified_identifier
14856         production directly to remove a shift/reduce, and implement
14857         explicit interface implementation.
14858
14859         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
14860         after a floating point suffix.
14861
14862         * expression.cs (DoNumericPromotions): Improved the conversion for
14863         uint/uint.  If we have a constant, we avoid doing a typecast to a
14864         larger type.
14865
14866         * class.cs (Indexer): Implement explicit interface implementation
14867         for indexers.
14868
14869 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
14870
14871         * class.cs: make the default instance constructor public and hidebysig.
14872
14873 2001-01-03  Ravi Pratap  <ravi@ximian.com>
14874
14875         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
14876         so we can call it from elsewhere.
14877
14878         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
14879         we emit it internally if the class has a defined indexer; otherwise the user
14880         emits it by decorating the class definition with the DefaultMemberAttribute.
14881
14882         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
14883         attribute is not used on a type which defines an indexer.
14884
14885         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
14886         character when we skip whitespace.
14887
14888         * ../errors/cs0646.cs : Add.
14889
14890 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
14891
14892         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
14893         again. 
14894
14895         * makefile: Add practical target `mcs3.exe' which builds the third
14896         generation compiler. 
14897
14898         * expression.cs (New): Fix structures constructor calling.
14899
14900         * class.cs (Property, Method, Indexer): Emit Final flag on the
14901         method if we are an interface implementation and we are not
14902         abstract. 
14903
14904         * ecore.cs (PropertyExpr): New public field `IsBase', tells
14905         whether this property is referencing a `base' method.
14906
14907         * expression.cs (Invocation.EmitCall): take an extra argument:
14908         is_base, this is used to determine whether the `call' or
14909         `callvirt' opcode should be used.
14910
14911
14912         * delegate.cs: update EmitCall.
14913
14914         * class.cs (Method.Define): Set NewSlot for the cases where we are
14915         not implementing an interface method.
14916
14917         (Property.Define): ditto.
14918
14919 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
14920
14921         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
14922         'r'.  Allows mcs to parse itself fully.
14923
14924 2002-01-02  Ravi Pratap  <ravi@ximian.com>
14925
14926         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
14927         of the number of initializers that require the InitializeArray method.
14928
14929         (CheckIndices): Store the Expression in all cases - not the plain value. Also
14930         update the above field where necessary.
14931
14932         (MakeByteBlob): Update accordingly.
14933
14934         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
14935         greater than 2.
14936
14937         (EmitDynamicInitializers): Update in accordance with the new optimization.
14938
14939         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
14940         same OpCode applies.
14941
14942         * cs-parser.jay : Fix some glaring errors I introduced.
14943
14944 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
14945
14946         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
14947         so that we can check for name clashes there too.
14948
14949         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
14950         for interface indexers.
14951
14952         * interfaces.cs (Define): Emit the default member attribute.
14953
14954         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
14955         variable was being referred to while setting the value ;-)
14956
14957 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
14958
14959         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
14960         byte-by-byte information when we know the data is zero.
14961
14962         Make the block always a multiple of 4, because
14963         DefineInitializedData has a bug.
14964
14965         * assign.cs: Fix, we should assign from the temporary, not from
14966         the source. 
14967
14968         * expression.cs (MakeByteBlob): Fix my incorrect code.
14969
14970 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
14971
14972         * typemanager.cs (EnumToUnderlying): This function is used to get
14973         the underlying type from an enumeration, because it does not
14974         always work. 
14975
14976         * constant.cs: Use the I4_S form for values between -128 and 127.
14977
14978         * statement.cs (Block.LookupLabel): Looks up a label.
14979         (Block): Drop support for labeled blocks.
14980
14981         (LabeledStatement): New kind of statement that represents a label
14982         only.
14983
14984         (Goto): Finally implement this bad boy.
14985
14986         * cs-parser.jay: Update to reflect new mechanism to implement
14987         labels.
14988
14989 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
14990
14991         * codegen.cs (EmitContext.This): a codegen property that keeps the
14992         a single instance of this instead of creating many different this
14993         instances. 
14994
14995         * delegate.cs (Delegate.DoResolve): Update to use the property;
14996
14997         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
14998
14999         * expression.cs (BaseAccess.DoResolve): Ditto.
15000
15001 2001-12-29  Ravi Pratap  <ravi@ximian.com>
15002
15003         * typemanager.cs (methodimpl_attr_type): Add to hold the type
15004         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
15005
15006         (InitCoreTypes): Update accordingly.
15007
15008         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
15009         so we can quickly store the state.
15010
15011         (ApplyAttributes): Set the correct implementation flags
15012         for InternalCall methods.
15013
15014 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
15015
15016         * expression.cs (EmitCall): if a method is not virtual, then do
15017         not use callvirt on it.
15018
15019         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
15020         user defined stuff) requires the use of stobj, which takes an
15021         address on the stack instead of an array and an index.  So emit
15022         the Ldelema operation for it.
15023
15024         (EmitStoreOpcode): Use stobj for valuetypes.
15025
15026         (UnaryMutator.EmitCode): Use the right 1 value depending on
15027         whether we are dealing with int64/uint64, float or doubles.
15028
15029         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
15030         constructors that I implemented last night.
15031
15032         (Constructor.IsDefault): Fix to work properly for static
15033         constructors.
15034
15035         * cs-parser.jay (CheckDef): report method signature errors.
15036         Update error number 103 to be 132.
15037
15038         * decl.cs: New AdditionResult enumeration value: MethodExists.
15039         Although we do this check for methods later on in the semantic
15040         analysis, catching repeated default constructors is so easy that
15041         we catch these here. 
15042
15043         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
15044         promotions code.
15045
15046         (ParameterReference.EmitAssign, Emit): handle
15047         bools as bytes.
15048
15049         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
15050         (ArrayAccess.EmitStoreOpcode): ditto.
15051
15052         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
15053
15054         * expression.cs (MakeByteBlob): Complete all the missing types
15055         (uint, short, ushort, byte, sbyte)
15056
15057         * class.cs: Only init instance field initializers on instance
15058         constructors. 
15059
15060         Rename `constructors' to instance_constructors. 
15061
15062         (TypeContainer.AddConstructor): Only add constructors to the list
15063         if it is not static.
15064
15065         Make sure that we handle default_static_constructor independently
15066         everywhere where we handle instance_constructors
15067
15068 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
15069
15070         * class.cs: Do not lookup or create a base initializer for a
15071         static constructor.
15072
15073         (ConstructorInitializer.Resolve): use the proper type to lookup
15074         for constructors.
15075
15076         * cs-parser.jay: Report error 1585 (modifiers between type and name).
15077
15078         * enum.cs, interface.cs: Remove CloseType, this is taken care by
15079         in DeclSpace. 
15080
15081         * decl.cs: CloseType is now an virtual method, the default
15082         implementation just closes this type.
15083
15084 2001-12-28  Ravi Pratap  <ravi@ximian.com>
15085
15086         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
15087         to PreserveSig by default. Also emit HideBySig on such methods.
15088
15089         Basically, set the defaults to standard values.
15090
15091         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
15092         argument, if candidate is better, it can't be worse than the best !
15093
15094         (Invocation): Re-write bits to differentiate between methods being
15095         applicable in their expanded form and their normal form - for params
15096         methods of course.
15097
15098         Get rid of use_standard everywhere as only standard conversions are allowed
15099         in overload resolution. 
15100
15101         More spec conformance.
15102
15103 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
15104
15105         * driver.cs: Add --timestamp, to see where the compiler spends
15106         most of its time.
15107
15108         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
15109         `this' in static code.
15110
15111         (SimpleName.DoResolve): Implement in terms of a helper function
15112         that allows static-references to be passed upstream to
15113         MemberAccess.
15114
15115         (Expression.ResolveWithSimpleName): Resolve specially simple
15116         names when called by MemberAccess to implement the special
15117         semantics. 
15118
15119         (Expression.ImplicitReferenceConversion): Handle conversions from
15120         Null to reference types before others, as Null's type is
15121         System.Object. 
15122
15123         * expression.cs (Invocation.EmitCall): Handle the special case of
15124         calling methods declared on a reference type from a ValueType
15125         (Base classes System.Object and System.Enum)
15126
15127         (MemberAccess.Resolve): Only perform lookups on Enumerations if
15128         the left hand side is a TypeExpr, not on every enumeration. 
15129
15130         (Binary.Resolve): If types are reference types, then do a cast to
15131         object on operators != and == of both arguments.
15132
15133         * typemanager.cs (FindMembers): Extract instance and static
15134         members if requested.
15135
15136         * interface.cs (PopulateProperty): Use void_type instead of null
15137         as the return type for the setter method.
15138
15139         (PopulateIndexer): ditto.
15140
15141 2001-12-27  Ravi Pratap  <ravi@ximian.com>
15142
15143         * support.cs (ReflectionParameters): Fix minor bug where we
15144         were examining the wrong parameter for the ParamArray attribute.
15145
15146         Cope with requests for the type of the parameter at position
15147         greater than the params parameter's. We now return the element
15148         type of the params array as that makes more sense.
15149
15150         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
15151         accordingly as we no longer have to extract the element type
15152         ourselves.
15153
15154         (Invocation.OverloadResolve): Update.
15155
15156 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
15157
15158         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
15159         against IEnumerator, test whether the return value is a descendant
15160         of the IEnumerator interface.
15161
15162         * class.cs (Indexer.Define): Use an auxiliary method to implement
15163         the other bits of the method definition.  Begin support for
15164         explicit interface implementation.
15165
15166         (Property.DefineMethod): Use TypeManager.void_type instead of null
15167         for an empty return value.
15168
15169 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
15170
15171         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
15172         dealing with a FieldExpr which is composed of a FieldBuilder, in
15173         the code path we did extract the constant, but we should have
15174         obtained the underlying value to be able to cast it (otherwise we
15175         end up in an infinite loop, this is what Ravi was running into).
15176
15177         (ArrayCreation.UpdateIndices): Arrays might be empty.
15178
15179         (MemberAccess.ResolveMemberAccess): Add support for section
15180         14.5.4.1 that deals with the special case of E.I when E is a type
15181         and something else, that I can be a reference to a static member.
15182
15183         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
15184         handle a particular array type to create byte blobs, it is just
15185         something we dont generate byteblobs for.
15186
15187         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
15188         arguments. 
15189
15190         * location.cs (Push): remove the key from the hashtable that we
15191         are about to add.   This happens for empty files.
15192
15193         * driver.cs: Dispose files after we have parsed them.
15194
15195         (tokenize): new function that only runs the tokenizer on its
15196         input, for speed testing.
15197
15198 2001-12-26  Ravi Pratap  <ravi@ximian.com>
15199
15200         * class.cs (Event.Define): Define the private field only if there
15201         are no accessors defined.
15202
15203         * expression.cs (ResolveMemberAccess): If there is no associated
15204         field with the event, that means we have an event defined with its
15205         own accessors and we should flag error cs0070 since transforming
15206         ourselves into a field is not valid in that case.
15207
15208         * ecore.cs (SimpleName.DoResolve): Same as above.
15209
15210         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
15211         and charset to sane values.
15212
15213 2001-12-25  Ravi Pratap  <ravi@ximian.com>
15214
15215         * assign.cs (DoResolve): Perform check on events only if they 
15216         are being accessed outside the declaring type.
15217
15218         * cs-parser.jay (event_declarations): Update rules to correctly
15219         set the type of the implicit parameter etc.
15220
15221         (add_accessor, remove_accessor): Set current local parameters.
15222
15223         * expression.cs (Binary): For delegate addition and subtraction,
15224         cast the return value from the method into the appropriate delegate
15225         type.
15226
15227 2001-12-24  Ravi Pratap  <ravi@ximian.com>
15228
15229         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
15230         of these as the workaround is unnecessary.
15231
15232         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
15233         delegate data - none of that is needed at all.
15234
15235         Re-write bits to extract the instance expression and the delegate method
15236         correctly.
15237
15238         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
15239         on delegates too.
15240
15241         * attribute.cs (ApplyAttributes): New method to take care of common tasks
15242         of attaching attributes instead of duplicating code everywhere.
15243
15244         * everywhere : Update code to do attribute emission using the above method.
15245
15246 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
15247
15248         * expression.cs (IsParamsMethodApplicable): if there are not
15249         parameters, return immediately.
15250
15251         * ecore.cs: The 0 literal can be implicity converted to an enum
15252         type. 
15253
15254         (SimpleName.DoResolve): First lookup the type, then lookup the
15255         members. 
15256
15257         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
15258         want to get its address.  If the InstanceExpression is not
15259         addressable, store the result in a temporary variable, then get
15260         the address of it.
15261
15262         * codegen.cs: Only display 219 errors on warning level or above. 
15263
15264         * expression.cs (ArrayAccess): Make it implement the
15265         IMemoryLocation interface.
15266
15267         (Binary.DoResolve): handle the operator == (object a, object b)
15268         and operator != (object a, object b) without incurring into a
15269         BoxedCast (because 5 != o should never be performed).
15270
15271         Handle binary enumerator operators.
15272
15273         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
15274         value type, otherwise use Ldelem_ref.
15275
15276         Use precomputed names;
15277
15278         (AddressOf): Implement address of
15279
15280         * cs-parser.jay (labeled_statement): Fix recursive block
15281         addition by reworking the production.
15282
15283         * expression.cs (New.DoEmit): New has a special case:
15284                 
15285                  If we are dealing with a ValueType, we have a few
15286                  situations to deal with:
15287                 
15288                     * The target of New is a ValueType variable, that is
15289                       easy, we just pass this as the variable reference
15290                 
15291                     * The target of New is being passed as an argument,
15292                       to a boxing operation or a function that takes a
15293                       ValueType.
15294                 
15295                       In this case, we need to create a temporary variable
15296                       that is the argument of New.
15297
15298
15299 2001-12-23  Ravi Pratap  <ravi@ximian.com>
15300
15301         * rootcontext.cs (LookupType): Check that current_type is not null before
15302         going about looking at nested types.
15303
15304         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
15305         not implement the IAssignMethod interface any more.
15306
15307         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
15308         where we tranform them into FieldExprs if they are being resolved from within
15309         the declaring type.
15310
15311         * ecore.cs (SimpleName.DoResolve): Do the same here.
15312
15313         * assign.cs (DoResolve, Emit): Clean up code considerably. 
15314
15315         * ../errors/bug10.cs : Add.
15316
15317         * ../errors/cs0070.cs : Add.
15318
15319         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
15320
15321         * assign.cs : Get rid of EventIsLocal everywhere.
15322
15323 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
15324
15325         * ecore.cs (ConvertIntLiteral): finished the implementation.
15326
15327         * statement.cs (SwitchLabel): Convert the value we are using as a
15328         key before looking up the table.
15329
15330 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
15331
15332         * codegen.cs (EmitTopBlock): Require a Location argument now.
15333
15334         * cs-parser.jay (constructor_declarator): We need to setup
15335         current_local_parameters before we parse the
15336         opt_constructor_initializer, to allow the variables to be bound
15337         to the constructor arguments.
15338
15339         * rootcontext.cs (LookupType): First lookup nested classes in our
15340         class and our parents before we go looking outside our class.
15341
15342         * expression.cs (ConstantFold): Extract/debox the values at the
15343         beginnning. 
15344
15345         * rootcontext.cs (EmitCode): Resolve the constants first before we
15346         resolve the types.  This is not really needed, but it helps debugging.
15347
15348         * statement.cs: report location.
15349
15350         * cs-parser.jay: pass location to throw statement.
15351
15352         * driver.cs: Small bug fix.
15353
15354         * report.cs: Updated format to be 4-zero filled digits.
15355
15356 2001-12-22  Ravi Pratap  <ravi@ximian.com>
15357
15358         * expression.cs (CheckIndices): Fix minor bug where the wrong
15359         variable was being referred to ;-)
15360
15361         (DoEmit): Do not call EmitStaticInitializers when the 
15362         underlying type is System.Object.
15363
15364 2001-12-21  Ravi Pratap  <ravi@ximian.com>
15365
15366         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
15367         and do the usual workaround for SRE.
15368
15369         * class.cs (MyEventBuilder.EventType): New member to get at the type
15370         of the event, quickly.
15371
15372         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
15373
15374         * assign.cs (Assign.DoResolve): Handle the case when the target
15375         is an EventExpr and perform the necessary checks.
15376
15377         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
15378         interface.
15379
15380         (SimpleName.MemberStaticCheck): Include check for EventExpr.
15381
15382         (EventExpr): Set the type in the constructor itself since we 
15383         are meant to be born fully resolved.
15384
15385         (EventExpr.Define): Revert code I wrote earlier.
15386                 
15387         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
15388         instance expression is null. The instance expression is a This in that case
15389         or a null, depending on whether it is a static method or not.
15390
15391         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
15392         refers to more than one method.
15393
15394         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
15395         and accordingly flag errors.
15396
15397 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
15398
15399         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
15400
15401 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
15402
15403         * location.cs (ToString): Provide useful rutine.
15404
15405 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
15406
15407         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
15408         objects, return the actual integral boxed.
15409
15410         * statement.cs (SwitchLabel): define an ILLabel for each
15411         SwitchLabel. 
15412
15413         (Switch.CheckSwitch): If the value is a Literal, extract
15414         the underlying literal.
15415
15416         Also in the unused hashtable we had, add the SwitchLabel so we can
15417         quickly look this value up.
15418
15419         * constant.cs: Implement a bunch of new constants.  Rewrite
15420         Literal based on this.  Made changes everywhere to adapt to this.
15421
15422         * expression.cs (Expression.MakeByteBlob): Optimize routine by
15423         dereferencing array only once, and also copes with enumrations.
15424
15425         bytes are two bytes wide, not one.
15426
15427         (Cast): Perform constant conversions.
15428
15429         * ecore.cs (TryImplicitIntConversion): Return literals instead of
15430         wrappers to the literals here.
15431
15432         * expression.cs (DoNumericPromotions): long literals can converted
15433         to ulong implicity (this is taken care of elsewhere, but I was
15434         missing this spot).
15435
15436         * ecore.cs (Expression.Literalize): Make the return type Literal,
15437         to improve type checking.
15438
15439         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
15440
15441 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
15442
15443         * literal.cs: Revert code from ravi that checked the bounds.  The
15444         bounds are sane by the definition of the type itself. 
15445
15446         * typemanager.cs: Fix implementation of ImplementsInterface.  We
15447         need to actually look up in our parent hierarchy for interfaces
15448         implemented. 
15449
15450         * const.cs: Use the underlying type for enumerations
15451
15452         * delegate.cs: Compute the basename for the delegate creation,
15453         that should fix the delegate test case, and restore the correct
15454         Type Lookup semantics in rootcontext
15455
15456         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
15457         referencing a nested type with the Reflection API is using the "+"
15458         sign. 
15459
15460         * cs-parser.jay: Do not require EOF token at the end.
15461
15462 2001-12-20  Ravi Pratap  <ravi@ximian.com>
15463
15464         * rootcontext.cs (LookupType): Concatenate type names with
15465         a '.' instead of a '+' The test suite passes again.
15466
15467         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
15468         field of the enumeration.
15469
15470         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
15471         the case when the member is an EventExpr.
15472
15473         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
15474         static has an associated instance expression.
15475
15476         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
15477
15478         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
15479
15480         * class.cs (Event.Define): Register event and perform appropriate checks
15481         for error #111.
15482
15483         We define the Add and Remove methods even if the use provides none because
15484         in that case, we provide default implementations ourselves.
15485
15486         Define a private field of the type of the event. This is done by the CSC compiler
15487         and we should be doing it too ;-)
15488
15489         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
15490         More methods we use in code we generate.
15491
15492         (multicast_delegate_type, delegate_type): Two separate types since the distinction
15493         is important.
15494
15495         (InitCoreTypes): Update accordingly for the above.
15496
15497         * class.cs (Event.Emit): Generate code for default accessors that we provide
15498
15499         (EmitDefaultMethod): Do the job in the above.
15500
15501         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
15502         appropriate place.
15503
15504 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
15505
15506         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
15507         builders even if we were missing one.
15508
15509         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
15510         pass the Basename as our class name instead of the Name.  The
15511         basename will be correctly composed for us.
15512
15513         * parameter.cs (Paramters): Now takes a Location argument.
15514
15515         * decl.cs (DeclSpace.LookupType): Removed convenience function and
15516         make all the code call directly LookupType in RootContext and take
15517         this chance to pass the Location information everywhere.
15518
15519         * Everywhere: pass Location information.
15520
15521 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
15522
15523         * class.cs (Constructor.Define): Updated way of detecting the
15524         length of the parameters.
15525
15526         (TypeContainer.DefineType): Use basename as the type name for
15527         nested types.
15528
15529         (TypeContainer.Define): Do not recursively define types here, as
15530         definition is taken care in order by the RootContext.
15531
15532         * tree.cs: Keep track of namespaces in a per-file basis.
15533
15534         * parameter.cs (Parameter.ComputeSignature): Update to use
15535         DeclSpace. 
15536
15537         (Parameters.GetSignature): ditto.
15538
15539         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
15540         instead of a TypeContainer.
15541
15542         (Interface.SemanticAnalysis): Use `this' instead of our parent to
15543         resolve names.  Because we need to be resolve in our context, not
15544         our parents.
15545
15546         * driver.cs: Implement response files.
15547
15548         * class.cs (TypeContainer.DefineType): If we are defined, do not
15549         redefine ourselves.
15550
15551         (Event.Emit): Emit the code for add/remove handlers.
15552         (Event.Define): Save the MethodBuilders for add/remove.
15553
15554         * typemanager.cs: Use pair here too.
15555
15556         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
15557         DictionaryEntry requires the first argument to be non-null.  
15558
15559         (enum_declaration): Compute full name for registering the
15560         enumeration.
15561
15562         (delegate_declaration): Instead of using
15563         formal_parameter_list, use opt_formal_parameter_list as the list
15564         can be empty.
15565
15566         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
15567         (EventParsing): New property that controls whether `add' and
15568         `remove' are returned as tokens or identifiers (for events);
15569
15570 2001-12-19  Ravi Pratap  <ravi@ximian.com>
15571
15572         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
15573         use MyEventBuilder only and let it wrap the real builder for us.
15574
15575         (MyEventBuilder): Revamp constructor etc.
15576
15577         Implement all operations that we perform on EventBuilder in precisely the same
15578         way here too.
15579
15580         (FindMembers): Update to use the EventBuilder member.
15581
15582         (Event.Emit): Update accordingly.
15583
15584 2001-12-18  Ravi Pratap  <ravi@ximian.com>
15585
15586         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
15587         by calling the appropriate methods.
15588
15589         (GetCustomAttributes): Make stubs as they cannot possibly do anything
15590         useful.
15591
15592         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
15593
15594 2001-12-17  Ravi Pratap  <ravi@ximian.com>
15595
15596         * delegate.cs (Delegate.Populate): Check that the return type
15597         and various parameters types are indeed accessible.
15598
15599         * class.cs (Constructor.Define): Same here.
15600
15601         (Field.Define): Ditto.
15602
15603         (Event.Define): Ditto.
15604
15605         (Operator.Define): Check that the underlying Method defined itself
15606         correctly - so it's MethodBuilder should not be null.
15607
15608         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
15609         expression happens to be null.
15610
15611         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
15612         members but as of now we don't seem to be able to do anything really useful with it.
15613
15614         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
15615         not the EventBuilder.
15616
15617 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
15618
15619         * cs-tokenizer.cs: Add support for defines.
15620         Add support for #if, #elif, #else, #endif
15621
15622         (eval_var): evaluates a variable.
15623         (eval): stubbed for evaluating functions.
15624
15625         * cs-parser.jay: Pass the defines information
15626
15627         * driver.cs: Add --define command line option.
15628
15629         * decl.cs: Move MemberCore here.
15630
15631         Make it the base class for DeclSpace.  This allows us to catch and
15632         report 108 and 109 for everything now.
15633
15634         * class.cs (TypeContainer.Define): Extract all the members
15635         before populating and emit the warning 108 (new keyword required
15636         to override) instead of having each member implement this.
15637
15638         (MemberCore.Define): New abstract method, we will be using this in
15639         the warning reporting engine in Populate.
15640
15641         (Operator.Define): Adjust to new MemberCore protocol. 
15642
15643         * const.cs (Const): This does not derive from Expression, it is a
15644         temporary object we use to create fields, it is a MemberCore. 
15645
15646         * class.cs (Method.Define): Allow the entry point to be in a
15647         specific class.
15648
15649         * driver.cs: Rewrite the argument handler to clean it up a bit.
15650
15651         * rootcontext.cs: Made it just an auxiliary namespace feature by
15652         making everything static.
15653
15654         * driver.cs: Adapt code to use RootContext type name instead of
15655         instance variable.
15656
15657         * delegate.cs: Remove RootContext argument.
15658
15659         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
15660         argument. 
15661
15662         * class.cs (Event.Define): The lookup can fail.
15663
15664         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
15665
15666         * expression.cs: Resolve the this instance before invoking the code.
15667
15668 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
15669
15670         * cs-parser.jay: Add a production in element_access that allows
15671         the thing to become a "type" reference.  This way we can parse
15672         things like "(string [])" as a type.
15673
15674         Note that this still does not handle the more complex rules of
15675         casts. 
15676
15677
15678         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
15679
15680         * ecore.cs: (CopyNewMethods): new utility function used to
15681         assemble the list of methods from running FindMembers.
15682
15683         (MemberLookup): Rework FindMembers so that 
15684
15685 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
15686
15687         * class.cs (TypeContainer): Remove Delegates who fail to be
15688         defined.
15689
15690         * delegate.cs (Populate): Verify that we dont get null return
15691         values.   TODO: Check for AsAccessible.
15692
15693         * cs-parser.jay: Use basename to emit error 574 (destructor should
15694         have the same name as container class), not the full name.
15695
15696         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
15697         possible representation.  
15698
15699         Also implements integer type suffixes U and L.
15700
15701 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
15702
15703         * expression.cs (ArrayCreation.DoResolve): We need to do the
15704         argument resolution *always*.
15705
15706         * decl.cs: Make this hold the namespace.  Hold the root context as
15707         well.
15708         (LookupType): Move here.
15709
15710         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
15711
15712         * location.cs (Row, Name): Fixed the code, it was always returning
15713         references to the first file.
15714
15715         * interface.cs: Register properties defined through interfaces.
15716
15717         * driver.cs: Add support for globbing on the command line
15718
15719         * class.cs (Field): Make it derive from MemberCore as well.
15720         (Event): ditto.
15721
15722 2001-12-15  Ravi Pratap  <ravi@ximian.com>
15723
15724         * class.cs (Event::Define): Check that the type of the event is a delegate
15725         type else flag error #66.
15726
15727         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
15728         same.
15729
15730         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
15731         values of EntryPoint, CharSet etc etc.
15732
15733         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
15734
15735         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
15736         be null and we should ignore this. I am not sure if this is really clean. Apparently,
15737         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
15738         which needs this to do its work.
15739
15740         * ../errors/cs0066.cs : Add.
15741
15742 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
15743
15744         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
15745         helper functions.
15746
15747         * class.cs: (MethodSignature.MethodSignature): Removed hack that
15748         clears out the parameters field.
15749         (MemberSignatureCompare): Cleanup
15750
15751         (MemberCore): New base class used to share code between MethodCore
15752         and Property.
15753
15754         (RegisterRequiredImplementations) BindingFlags.Public requires
15755         either BindingFlags.Instace or Static.  Use instance here.
15756
15757         (Property): Refactored code to cope better with the full spec.
15758
15759         * parameter.cs (GetParameterInfo): Return an empty array instead
15760         of null on error.
15761
15762         * class.cs (Property): Abstract or extern properties have no bodies.
15763
15764         * parameter.cs (GetParameterInfo): return a zero-sized array.
15765
15766         * class.cs (TypeContainer.MethodModifiersValid): Move all the
15767         method modifier validation to the typecontainer so we can reuse
15768         this on properties.
15769
15770         (MethodCore.ParameterTypes): return an empty sized array of types.
15771
15772         (Property.Define): Test property modifier validity.
15773
15774         Add tests for sealed/override too.
15775
15776         (Method.Emit): abstract or extern methods have no bodies.
15777
15778 2001-12-14  Ravi Pratap  <ravi@ximian.com>
15779
15780         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
15781         thing.
15782
15783         (Method::Define, ::Emit): Modify accordingly.
15784
15785         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
15786
15787         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
15788
15789         * makefile: Pass in /unsafe.
15790
15791 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
15792
15793         * class.cs (MakeKey): Kill routine.
15794
15795         * class.cs (TypeContainer.Define): Correctly define explicit
15796         method implementations (they require the full interface name plus
15797         the method name).
15798
15799         * typemanager.cs: Deply the PtrHashtable here and stop using the
15800         lame keys.  Things work so much better.
15801
15802         This of course broke everyone who depended on `RegisterMethod' to
15803         do the `test for existance' test.  This has to be done elsewhere.
15804
15805         * support.cs (PtrHashtable): A hashtable that avoid comparing with
15806         the object stupid Equals method (because, that like fails all over
15807         the place).  We still do not use it.
15808
15809         * class.cs (TypeContainer.SetRequiredInterface,
15810         TypeContainer.RequireMethods): Killed these two routines and moved
15811         all the functionality to RegisterRequiredImplementations.
15812
15813         (TypeContainer.RegisterRequiredImplementations): This routine now
15814         registers all the implementations required in an array for the
15815         interfaces and abstract methods.  We use an array of structures
15816         which can be computed ahead of time to reduce memory usage and we
15817         also assume that lookups are cheap as most classes will not
15818         implement too many interfaces.
15819
15820         We also avoid creating too many MethodSignatures.
15821
15822         (TypeContainer.IsInterfaceMethod): Update and optionally does not
15823         clear the "pending" bit if we find that there are problems with
15824         the declaration.
15825
15826         (TypeContainer.VerifyPendingMethods): Update to report errors of
15827         methods that look like implementations but are not.
15828
15829         (TypeContainer.Define): Add support for explicit interface method
15830         implementation. 
15831
15832 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
15833
15834         * typemanager.cs: Keep track of the parameters here instead of
15835         being a feature of the TypeContainer.
15836
15837         * class.cs: Drop the registration of parameters here, as
15838         InterfaceMethods are also interface declarations.
15839
15840         * delegate.cs: Register methods with the TypeManager not only with
15841         the TypeContainer.  This code was buggy.
15842
15843         * interface.cs: Full registation here.
15844
15845 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
15846
15847         * expression.cs: Remove reducer for binary expressions, it can not
15848         be done this way.
15849
15850         * const.cs: Put here the code that used to go into constant.cs
15851
15852         * constant.cs: Put here the code for constants, this is a new base
15853         class for Literals.
15854
15855         * literal.cs: Make Literal derive from Constant.
15856
15857 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
15858
15859         * statement.cs (Return.Emit): Report error 157 if the user
15860         attempts to return from a finally block.
15861
15862         (Return.Emit): Instead of emitting a return, jump to the end of
15863         the function.
15864
15865         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
15866         LocalBuilder to store the result of the function.  ReturnLabel is
15867         the target where we jump.
15868
15869
15870 2001-12-09  Radek Doulik  <rodo@ximian.com>
15871
15872         * cs-parser.jay: remember alias in current namespace
15873
15874         * ecore.cs (SimpleName::DoResolve): use aliases for types or
15875         namespaces
15876
15877         * class.cs (LookupAlias): lookup alias in my_namespace
15878
15879         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
15880         aliases hashtable
15881         (LookupAlias): lookup alias in this and if needed in parent
15882         namespaces
15883
15884 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
15885
15886         * support.cs: 
15887
15888         * rootcontext.cs: (ModuleBuilder) Made static, first step into
15889         making things static.  I need this to avoid passing the
15890         TypeContainer when calling ParameterType.
15891
15892         * support.cs (InternalParameters.ParameterType): Remove ugly hack
15893         that did string manipulation to compute the type and then call
15894         GetType.  Use Parameter.ParameterType instead.
15895
15896         * cs-tokenizer.cs: Consume the suffix for floating values.
15897
15898         * expression.cs (ParameterReference): figure out whether this is a
15899         reference parameter or not.  Kill an extra variable by computing
15900         the arg_idx during emission.
15901
15902         * parameter.cs (Parameters.GetParameterInfo): New overloaded
15903         function that returns whether a parameter is an out/ref value or not.
15904
15905         (Parameter.ParameterType): The type of the parameter (base,
15906         without ref/out applied).
15907
15908         (Parameter.Resolve): Perform resolution here.
15909         (Parameter.ExternalType): The full type (with ref/out applied).
15910
15911         * statement.cs (Using.Emit, Using.EmitExpression): Implement
15912         support for expressions on the using statement.
15913
15914 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
15915
15916         * statement.cs (Using.EmitLocalVariableDecls): Split the
15917         localvariable handling of the using statement.
15918
15919         (Block.EmitMeta): Keep track of variable count across blocks.  We
15920         were reusing slots on separate branches of blocks.
15921
15922         (Try.Emit): Emit the general code block, we were not emitting it. 
15923
15924         Check the type of the declaration to be an IDisposable or
15925         something that can be implicity converted to it. 
15926
15927         Emit conversions if required.
15928
15929         * ecore.cs (EmptyExpression): New utility class.
15930         (Expression.ImplicitConversionExists): New utility function.
15931
15932 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
15933
15934         * statement.cs (Using): Implement.
15935
15936         * expression.cs (LocalVariableReference): Support read only variables.
15937
15938         * statement.cs: Remove the explicit emit for the Leave opcode.
15939         (VariableInfo): Add a readonly field.
15940
15941 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
15942
15943         * ecore.cs (ConvCast): new class used to encapsulate the various
15944         explicit integer conversions that works in both checked and
15945         unchecked contexts.
15946
15947         (Expression.ConvertNumericExplicit): Use new ConvCast class to
15948         properly generate the overflow opcodes.
15949
15950 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
15951
15952         * statement.cs: The correct type for the EmptyExpression is the
15953         element_type, not the variable type.  Ravi pointed this out.
15954
15955 2001-12-04  Ravi Pratap  <ravi@ximian.com>
15956
15957         * class.cs (Method::Define): Handle PInvoke methods specially
15958         by using DefinePInvokeMethod instead of the usual one.
15959
15960         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
15961         above to do the task of extracting information and defining the method.
15962
15963 2001-12-04  Ravi Pratap  <ravi@ximian.com>
15964
15965         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
15966         of the condition for string type.
15967
15968         (Emit): Move that here. 
15969
15970         (ArrayCreation::CheckIndices): Keep string literals in their expression
15971         form.
15972
15973         (EmitDynamicInitializers): Handle strings appropriately.
15974
15975 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
15976
15977         * codegen.cs (EmitContext): Replace multiple variables with a
15978         single pointer to the current Switch statement.
15979
15980         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
15981         EmitContext.
15982
15983 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
15984
15985         * statement.cs 
15986
15987         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
15988         default'.
15989
15990         (Foreach.Emit): Foreach on arrays was not setting
15991         up the loop variables (for break/continue).
15992
15993         (GotoCase): Semi-implented.
15994
15995 2001-12-03  Ravi Pratap  <ravi@ximian.com>
15996
15997         * attribute.cs (CheckAttribute): Handle system attributes by using
15998         Attribute.GetAttributes to examine information we need.
15999
16000         (GetValidPlaces): Same here.
16001
16002         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
16003
16004         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
16005
16006         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
16007
16008         (Method::Define): Set appropriate flags if we have a DllImport attribute.
16009
16010         (Method::Emit): Handle the case when we are a PInvoke method.
16011
16012 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
16013
16014         * expression.cs: Use ResolveWithSimpleName on compound names.
16015
16016 2001-12-02  Ravi Pratap  <ravi@ximian.com>
16017
16018         * constant.cs (EmitConstant): Make sure we resolve the associated expression
16019         before trying to reduce it.
16020
16021         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
16022
16023         * constant.cs (LookupConstantValue): Implement.
16024
16025         (EmitConstant): Use the above in emitting the constant.
16026
16027         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
16028         that are user-defined by doing a LookupConstantValue on them.
16029
16030         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
16031         too, like above.
16032
16033 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
16034
16035         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
16036
16037         (BaseAccess.DoResolve): Implement.
16038
16039         (MemberAccess.DoResolve): Split this routine into a
16040         ResolveMemberAccess routine that can be used independently
16041
16042 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
16043
16044         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
16045         As that share bits of the implementation.  Is returns a boolean,
16046         while As returns the Type that is being probed.
16047
16048 2001-12-01  Ravi Pratap  <ravi@ximian.com>
16049
16050         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
16051         instead of a Literal - much easier.
16052
16053         (EnumInTransit): Remove - utterly useless :-)
16054
16055         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
16056
16057         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
16058
16059         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
16060         chain when we have no associated expression.
16061
16062 2001-11-30  Ravi Pratap  <ravi@ximian.com>
16063
16064         * constant.cs (Define): Use Location while reporting the errror.
16065
16066         Also emit a warning when 'new' is used and there is no inherited
16067         member to hide.
16068
16069         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
16070         populated.
16071
16072         (LookupEnumValue): Implement to lookup an enum member's value and define it
16073         if necessary.
16074
16075         (Populate): Re-write accordingly to use the above routine.
16076
16077 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
16078
16079         * expression.cs (This): Fix prototype for DoResolveLValue to
16080         override the base class DoResolveLValue.
16081
16082         * cs-parser.cs: Report errors cs574 and cs575 (destructor
16083         declarations) 
16084
16085         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
16086         (we need to load the address of the field here).  This fixes
16087         test-22. 
16088
16089         (FieldExpr.DoResolveLValue): Call the DoResolve
16090         function to initialize the Instance expression.
16091
16092         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
16093         correctly the GetEnumerator operation on a value type.
16094
16095         * cs-parser.jay: Add more simple parsing error catches.
16096
16097         * statement.cs (Switch): Add support for string switches.
16098         Handle null specially.
16099
16100         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
16101
16102 2001-11-28  Ravi Pratap  <ravi@ximian.com>
16103
16104         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
16105
16106         (declare_local_constant): New helper function.
16107
16108         * statement.cs (AddConstant): Keep a separate record of constants
16109
16110         (IsConstant): Implement to determine if a variable is a constant.
16111
16112         (GetConstantExpression): Implement.
16113
16114         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
16115
16116         * statement.cs (IsVariableDefined): Re-write.
16117
16118 2001-11-27  Ravi Pratap  <ravi@ximian.com>
16119
16120         * class.cs (TypeContainer::FindMembers): Look for constants
16121         in the case when we are looking for MemberTypes.Field
16122
16123         * expression.cs (MemberAccess::DoResolve): Check that in the
16124         case we are a FieldExpr and a Literal, we are not being accessed
16125         by an instance reference.
16126
16127         * cs-parser.jay (local_constant_declaration): Implement.
16128
16129         (declaration_statement): Implement for constant declarations.
16130
16131 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
16132
16133         * statement.cs (Switch): Catch double defaults.
16134
16135         (Switch): More work on the switch() statement
16136         implementation.  It works for integral values now, need to finish
16137         string support.
16138
16139
16140 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
16141
16142         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
16143         integer literals into other integer literals.  To be used by
16144         switch. 
16145
16146 2001-11-24  Ravi Pratap  <ravi@ximian.com>
16147
16148         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
16149         some memory.
16150
16151         (EmitDynamicInitializers): Cope with the above since we extract data
16152         directly from ArrayData now.
16153
16154         (ExpectInitializers): Keep track of whether initializers are mandatory
16155         or not.
16156
16157         (Bounds): Make it a hashtable to prevent the same dimension being 
16158         recorded for every element in that dimension.
16159
16160         (EmitDynamicInitializers): Fix bug which prevented the Set array method
16161         from being found.
16162
16163         Also fix bug which was causing the indices to be emitted in the reverse
16164         order.
16165
16166 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
16167
16168         * expression.cs (ArrayCreation): Implement the bits that Ravi left
16169         unfinished.  They do not work, because the underlying code is
16170         sloppy.
16171
16172 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
16173
16174         * cs-parser.jay: Remove bogus fixme.
16175
16176         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
16177         on Switch statement.
16178
16179 2001-11-23  Ravi Pratap  <ravi@ximian.com>
16180
16181         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
16182         the same. 
16183
16184         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
16185         parameter. Apparently, any expression is allowed. 
16186
16187         (ValidateInitializers): Update accordingly.
16188
16189         (CheckIndices): Fix some tricky bugs thanks to recursion.
16190
16191         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
16192         I was being completely brain-dead.
16193
16194         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
16195         and re-write acordingly.
16196
16197         (DelegateInvocation): Re-write accordingly.
16198
16199         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
16200
16201         (MakeByteBlob): Handle types more correctly.
16202
16203         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
16204         initialization from expressions but it is incomplete because I am a complete
16205         Dodo :-|
16206
16207 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
16208
16209         * statement.cs (If.Emit): Fix a bug that generated incorrect code
16210         on If.  Basically, we have to return `true' (ie, we do return to
16211         our caller) only if both branches of the if return.
16212
16213         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
16214         short-circuit operators, handle them as short circuit operators. 
16215
16216         (Cast.DoResolve): Resolve type.
16217         (Cast.Cast): Take an expression as the target type.
16218
16219         * cs-parser.jay (cast_expression): Remove old hack that only
16220         allowed a limited set of types to be handled.  Now we take a
16221         unary_expression and we resolve to a type during semantic
16222         analysis.
16223
16224         Use the grammar productions from Rhys to handle casts (this is
16225         not complete like Rhys syntax yet, we fail to handle that corner
16226         case that C# has regarding (-x), but we will get there.
16227
16228 2001-11-22  Ravi Pratap  <ravi@ximian.com>
16229
16230         * class.cs (EmitFieldInitializer): Take care of the case when we have a
16231         field which is an array type.
16232
16233         * cs-parser.jay (declare_local_variables): Support array initialization too.
16234
16235         * typemanager.cs (MakeKey): Implement.
16236
16237         (everywhere): Use the above appropriately.
16238
16239         * cs-parser.jay (for_statement): Update for array initialization while
16240         declaring variables.
16241
16242         * ecore.cs : The error message was correct, it's the variable's names that
16243         were misleading ;-) Make the code more readable.
16244
16245         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
16246         the correct type etc.
16247
16248         (ConvertExplicit): Handle Enum types by examining the underlying type.
16249
16250 2001-11-21  Ravi Pratap  <ravi@ximian.com>
16251
16252         * parameter.cs (GetCallingConvention): Always return
16253         CallingConventions.Standard for now.
16254
16255 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
16256
16257         * expression.cs (Binary.ResolveOperator): Update the values of `l'
16258         and `r' after calling DoNumericPromotions.
16259
16260         * ecore.cs: Fix error message (the types were in the wrong order).
16261
16262         * statement.cs (Foreach.ProbeCollectionType): Need to pass
16263         BindingFlags.Instance as well 
16264
16265         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
16266         implicit int literal conversion in an empty cast so that we
16267         propagate the right type upstream.
16268
16269         (UnboxCast): new class used to unbox value types.
16270         (Expression.ConvertExplicit): Add explicit type conversions done
16271         by unboxing.
16272
16273         (Expression.ImplicitNumericConversion): Oops, forgot to test for
16274         the target type before applying the implicit LongLiterals to ULong
16275         literal cast.
16276
16277 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
16278
16279         * cs-parser.jay (for_statement): Reworked the way For works: now
16280         we declare manually any variables that are introduced in
16281         for_initializer to solve the problem of having out-of-band code
16282         emition (that is what got for broken).
16283
16284         (declaration_statement): Perform the actual variable declaration
16285         that used to be done in local_variable_declaration here.
16286
16287         (local_variable_declaration): Do not declare anything, just pass
16288         the information on a DictionaryEntry
16289
16290 2001-11-20  Ravi Pratap  <ravi@ximian.com>
16291
16292         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
16293         re-write of the logic to now make it recursive.
16294
16295         (UpdateIndices): Re-write accordingly.
16296
16297         Store element data in a separate ArrayData list in the above methods.
16298
16299         (MakeByteBlob): Implement to dump the array data into a byte array.
16300
16301 2001-11-19  Ravi Pratap  <ravi@ximian.com>
16302
16303         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
16304         into CheckIndices.
16305
16306         * constant.cs (Define): Implement.
16307
16308         (EmitConstant): Re-write fully.
16309
16310         Pass in location info.
16311
16312         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
16313         respectively.
16314
16315         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
16316         DictionaryEntry since we need location info too.
16317
16318         (constant_declaration): Update accordingly.
16319
16320         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
16321         code into another method : UpdateIndices.
16322
16323 2001-11-18  Ravi Pratap  <ravi@ximian.com>
16324
16325         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
16326         some type checking etc.
16327
16328 2001-11-17  Ravi Pratap  <ravi@ximian.com>
16329
16330         * expression.cs (ArrayCreation::ValidateInitializers): Implement
16331         bits to provide dimension info if the user skips doing that.
16332
16333         Update second constructor to store the rank correctly.
16334
16335 2001-11-16  Ravi Pratap  <ravi@ximian.com>
16336
16337         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
16338         and try to implement.
16339
16340         * ../errors/cs0150.cs : Add.
16341
16342         * ../errors/cs0178.cs : Add.
16343
16344 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
16345
16346         * statement.cs: Implement foreach on multi-dimensional arrays. 
16347
16348         * parameter.cs (Parameters.GetParameterByName): Also lookup the
16349         name of the params argument.
16350
16351         * expression.cs: Use EmitStoreOpcode to get the right opcode while
16352         initializing the array.
16353
16354         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
16355         we can use this elsewhere.
16356
16357         * statement.cs: Finish implementation of foreach for single
16358         dimension arrays.
16359
16360         * cs-parser.jay: Use an out-of-band stack to pass information
16361         around, I wonder why I need this.
16362
16363         foreach_block: Make the new foreach_block the current_block.
16364
16365         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
16366         function used to return a static Parameters structure.  Used for
16367         empty parameters, as those are created very frequently.
16368
16369         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
16370
16371 2001-11-15  Ravi Pratap  <ravi@ximian.com>
16372
16373         * interface.cs : Default modifier is private, not public. The
16374         make verify test passes again.
16375
16376 2001-11-15  Ravi Pratap  <ravi@ximian.com>
16377
16378         * support.cs (ReflectionParameters): Fix logic to determine
16379         whether the last parameter is a params one. Test 9 passes again.
16380
16381         * delegate.cs (Populate): Register the builders we define with
16382         RegisterParameterForBuilder. Test 19 passes again.
16383
16384         * cs-parser.jay (property_declaration): Reference $6 instead
16385         of $$ to get at the location.
16386
16387         (indexer_declaration): Similar stuff.
16388
16389         (attribute): Ditto.
16390
16391         * class.cs (Property): Register parameters for the Get and Set methods
16392         if they exist. Test 23 passes again.
16393
16394         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
16395         call to EmitArguments as we are sure there aren't any params arguments. 
16396         Test 32 passes again.
16397
16398         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
16399         IndexOutOfRangeException. 
16400
16401         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
16402         Test 33 now passes again.
16403
16404 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
16405
16406         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
16407         broke a bunch of things.  Will have to come up with a better way
16408         of tracking locations.
16409
16410         * statement.cs: Implemented foreach for single dimension arrays.
16411
16412 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
16413
16414         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
16415         an error.  This removes the lookup from the critical path.
16416
16417         * cs-parser.jay: Removed use of temporary_loc, which is completely
16418         broken. 
16419
16420 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
16421
16422         * support.cs (ReflectionParameters.ParameterModifier): Report
16423         whether the argument is a PARAMS argument or not.
16424
16425         * class.cs: Set the attribute `ParamArrayAttribute' on the
16426         parameter argument.
16427
16428         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
16429         and cons_param_array_attribute (ConstructorInfo for
16430         ParamArrayAttribute)., 
16431
16432         * codegen.cs: Emit the return using the `Return' statement, that
16433         way we can report the error correctly for missing return values. 
16434
16435         * class.cs (Method.Emit): Clean up.
16436
16437         * expression.cs (Argument.Resolve): Take another argument: the
16438         location where this argument is used.  Notice that this is not
16439         part of the "Argument" class as to reduce the size of the
16440         structure (we know the approximate location anyways).
16441
16442         Test if the argument is a variable-reference, if not, then
16443         complain with a 206.
16444
16445         (Argument.Emit): Emit addresses of variables.
16446
16447         (Argument.FullDesc): Simplify.
16448
16449         (Invocation.DoResolve): Update for Argument.Resolve.
16450
16451         (ElementAccess.DoResolve): ditto.
16452
16453         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
16454         method should be virtual, as this method is always virtual.
16455
16456         (NewDelegate.DoResolve): Update for Argument.Resolve.
16457
16458         * class.cs (ConstructorInitializer.DoResolve): ditto.
16459
16460         * attribute.cs (Attribute.Resolve): ditto.
16461
16462 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
16463
16464         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
16465
16466         * expression.cs (ParameterReference): Drop IStackStorage and implement
16467         IAssignMethod instead. 
16468
16469         (LocalVariableReference): ditto.
16470
16471         * ecore.cs (FieldExpr): Drop IStackStorage and implement
16472         IAssignMethod instead. 
16473
16474 2001-11-13  Miguel de Icaza <miguel@ximian.com>
16475
16476         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
16477         enumerations that are used in heavily used structures derive from
16478         byte in a laughable and pathetic attempt to reduce memory usage.
16479         This is the kind of pre-optimzations that you should not do at
16480         home without adult supervision.
16481
16482         * expression.cs (UnaryMutator): New class, used to handle ++ and
16483         -- separatedly from the other unary operators.  Cleans up the
16484         code, and kills the ExpressionStatement dependency in Unary.
16485
16486         (Unary): Removed `method' and `Arguments' from this class, making
16487         it smaller, and moving it all to SimpleCall, so I can reuse this
16488         code in other locations and avoid creating a lot of transient data
16489         strucutres when not required.
16490
16491         * cs-parser.jay: Adjust for new changes.
16492
16493 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
16494
16495         * enum.cs (Enum.Populate): If there is a failure during
16496         definition, return
16497
16498         * cs-parser.jay (opt_enum_base): we used to catch type errors
16499         here, but this is really incorrect.  The type error should be
16500         catched during semantic analysis.
16501
16502 2001-12-11  Ravi Pratap  <ravi@ximian.com>
16503
16504         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
16505         current_local_parameters as expected since I, in my stupidity, had forgotten
16506         to do this :-)
16507
16508         * attribute.cs (GetValidPlaces): Fix stupid bug.
16509
16510         * class.cs (Method::Emit): Perform check on applicability of attributes.
16511
16512         (Constructor::Emit): Ditto.
16513
16514         (Field::Emit): Ditto.
16515
16516         (Field.Location): Store location information.
16517
16518         (Property, Event, Indexer, Operator): Ditto.
16519
16520         * cs-parser.jay (field_declaration): Pass in location for each field.
16521
16522         * ../errors/cs0592.cs : Add.
16523
16524 2001-11-12  Ravi Pratap  <ravi@ximian.com>
16525
16526         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
16527
16528         (InitCoreTypes): Update accordingly.
16529
16530         (RegisterAttrType, LookupAttr): Implement.
16531
16532         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
16533         info about the same.
16534
16535         (Resolve): Update to populate the above as necessary.
16536
16537         (Error592): Helper.
16538
16539         (GetValidPlaces): Helper to the above.
16540
16541         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
16542
16543         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
16544
16545 2001-11-12  Ravi Pratap  <ravi@ximian.com>
16546
16547         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
16548
16549         * ../errors/cs0617.cs : Add.
16550
16551 2001-11-11  Ravi Pratap  <ravi@ximian.com>
16552
16553         * enum.cs (Emit): Rename to Populate to be more consistent with what
16554         we expect it to do and when exactly it is called.
16555
16556         * class.cs, rootcontext.cs : Update accordingly.
16557
16558         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
16559         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
16560
16561         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
16562
16563         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
16564         of a fieldinfo using the above, when dealing with a FieldBuilder.
16565
16566 2001-11-10  Ravi Pratap  <ravi@ximian.com>
16567
16568         * ../errors/cs0031.cs : Add.
16569
16570         * ../errors/cs1008.cs : Add.
16571
16572         * ../errrors/cs0543.cs : Add.
16573
16574         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
16575         enum type.
16576
16577         (FindMembers): Implement.
16578
16579         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
16580         enums and delegates too.
16581
16582         (enum_types): Rename to builder_to_enum.
16583
16584         (delegate_types): Rename to builder_to_delegate.
16585
16586         * delegate.cs (FindMembers): Implement.
16587
16588 2001-11-09  Ravi Pratap  <ravi@ximian.com>
16589
16590         * typemanager.cs (IsEnumType): Implement.
16591
16592         * enum.cs (Emit): Re-write parts to account for the underlying type
16593         better and perform checking etc.
16594
16595         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
16596         of the underlying type.
16597
16598         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
16599         value
16600
16601         * enum.cs (error31): Helper to report error #31.
16602
16603         * cs-parser.jay (enum_declaration): Store location of each member too.
16604
16605         * enum.cs (member_to_location): New hashtable. 
16606
16607         (AddEnumMember): Update location hashtable.
16608
16609         (Emit): Use the location of each member while reporting errors.
16610
16611 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
16612
16613         * cs-parser.jay: A for_initializer if is a
16614         local_variable_declaration really ammount to have an implicit
16615         block with the variable declaration and no initializer for for.
16616
16617         * statement.cs (For.Emit): Cope with null initializers.
16618
16619         This fixes the infinite loop on for initializers.
16620
16621 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
16622
16623         * enum.cs: More cleanup.
16624
16625         * ecore.cs: Remove dead code.
16626
16627         * class.cs (Property.Emit): More simplification.
16628         (Event.Emit): ditto.
16629
16630         Reworked to have less levels of indentation.
16631
16632 2001-11-08  Ravi Pratap  <ravi@ximian.com>
16633
16634         * class.cs (Property): Emit attributes.
16635
16636         (Field): Ditto.
16637
16638         (Event): Ditto.
16639
16640         (Indexer): Ditto.
16641
16642         (Operator): Ditto.
16643
16644         * enum.cs (Emit): Ditto.
16645
16646         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
16647         Enums too.
16648
16649         * class.cs (Field, Event, etc.): Move attribute generation into the
16650         Emit method everywhere.
16651
16652         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
16653         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
16654         as we had no way of defining nested enums !
16655
16656         * rootcontext.cs : Adjust code accordingly.
16657
16658         * typemanager.cs (AddEnumType): To keep track of enum types separately.
16659
16660 2001-11-07  Ravi Pratap  <ravi@ximian.com>
16661
16662         * expression.cs (EvalConstantExpression): Move into ecore.cs
16663
16664         * enum.cs (Enum): Rename some members and make them public and readonly
16665         according to our convention.
16666
16667         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
16668         nothing else.
16669
16670         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
16671
16672         (Enum::Emit): Write a simple version for now which doesn't try to compute
16673         expressions. I shall modify this to be more robust in just a while.
16674
16675         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
16676
16677         (TypeContainer::CloseType): Create the Enum types too.
16678
16679         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
16680
16681         * expression.cs (EvalConstantExpression): Get rid of completely.
16682
16683         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
16684         user-defined values and other cases.
16685
16686         (IsValidEnumLiteral): Helper function.
16687
16688         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
16689         out there in the case we had a literal FieldExpr.
16690
16691         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
16692
16693         (Literalize): Revamp a bit to take two arguments.
16694
16695         (EnumLiteral): New class which derives from Literal to wrap enum literals.
16696
16697 2001-11-06  Ravi Pratap  <ravi@ximian.com>
16698
16699         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
16700
16701         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
16702
16703         (Resolve): Use the above to ensure we have proper initializers.
16704
16705 2001-11-05  Ravi Pratap  <ravi@ximian.com>
16706
16707         * expression.cs (Expression::EvalConstantExpression): New method to 
16708         evaluate constant expressions.
16709
16710         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
16711
16712 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
16713
16714         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
16715         in an array.
16716
16717         (Binary.ResolveOperator): Handle operator != (object a, object b)
16718         and operator == (object a, object b);
16719
16720         (Binary.DoNumericPromotions): Indicate whether the numeric
16721         promotion was possible.
16722
16723         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
16724         Implement.  
16725
16726         Made the ArrayAccess implement interface IAssignMethod instead of
16727         IStackStore as the order in which arguments are passed reflects
16728         this.
16729
16730         * assign.cs: Instead of using expr.ExprClass to select the way of
16731         assinging, probe for the IStackStore/IAssignMethod interfaces.
16732
16733         * typemanager.cs: Load InitializeArray definition.
16734
16735         * rootcontext.cs (RootContext.MakeStaticData): Used to define
16736         static data that can be used to initialize arrays. 
16737
16738 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
16739
16740         * expression.cs: Handle operator== and operator!= for booleans.
16741
16742         (Conditioal.Reduce): Implement reducer for the ?: operator.
16743
16744         (Conditional.Resolve): Implement dead code elimination.
16745
16746         (Binary.Resolve): Catch string literals and return a new
16747         concatenated string.
16748
16749         (Unary.Reduce): Implement reduction of unary expressions.
16750
16751         * ecore.cs: Split out the expression core handling here.
16752
16753         (Expression.Reduce): New method used to perform constant folding
16754         and CSE.  This is needed to support constant-expressions. 
16755
16756         * statement.cs (Statement.EmitBoolExpression): Pass true and false
16757         targets, and optimize for !x.
16758
16759 2001-11-04  Ravi Pratap  <ravi@ximian.com>
16760
16761         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
16762         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
16763         set custom atttributes.
16764
16765         * literal.cs (Literal::GetValue): New abstract method to return the actual
16766         value of the literal, cast as an object.
16767
16768         (*Literal): Implement GetValue method.
16769
16770         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
16771         expressions to the arraylist but objects of type Argument.
16772
16773         * class.cs (TypeContainer::Emit): Emit our attributes too.
16774
16775         (Method::Emit, Constructor::Emit): Ditto.
16776
16777         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
16778         to be ignoring earlier.
16779
16780 2001-11-03  Ravi Pratap  <ravi@ximian.com>
16781
16782         * attribute.cs (AttributeSection::Define): Implement to do the business
16783         of constructing a CustomAttributeBuilder.
16784
16785         (Attribute): New trivial class. Increases readability of code.  
16786
16787         * cs-parser.jay : Update accordingly.
16788
16789         (positional_argument_list, named_argument_list, named_argument): New rules
16790
16791         (attribute_arguments): Use the above so that we are more correct.
16792
16793 2001-11-02  Ravi Pratap  <ravi@ximian.com>
16794
16795         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
16796         to perform all checks for a method with a params parameter.
16797
16798         (Invocation::OverloadResolve): Update to use the above method and therefore
16799         cope correctly with params method invocations.
16800
16801         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
16802         params too.
16803
16804         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
16805         constructors in our parent too because we can't afford to miss out on 
16806         protected ones ;-)
16807
16808         * attribute.cs (AttributeSection): New name for the class Attribute
16809
16810         Other trivial changes to improve readability.
16811
16812         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
16813         use the new class names.
16814
16815 2001-11-01  Ravi Pratap  <ravi@ximian.com>
16816
16817         * class.cs (Method::Define): Complete definition for params types too
16818
16819         (Indexer::Define): Ditto.
16820
16821         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
16822         Cope everywhere with a request for info about the array parameter.
16823
16824 2001-11-01  Ravi Pratap  <ravi@ximian.com>
16825
16826         * tree.cs (RecordNamespace): Fix up to check for the correct key.
16827
16828         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
16829         local_variable_type to extract the string corresponding to the type.
16830
16831         (local_variable_type): Fixup the action to use the new helper method.
16832
16833         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
16834         go.
16835
16836         * expression.cs : Clean out code which uses the above.
16837
16838 2001-10-31  Ravi Pratap  <ravi@ximian.com>
16839
16840         * typemanager.cs (RegisterMethod): Check if we already have an existing key
16841         and bale out if necessary by returning a false.
16842
16843         (RegisterProperty): Ditto.
16844
16845         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
16846         and print out appropriate error messages.
16847
16848         * interface.cs (everywhere): Ditto.
16849
16850         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
16851         location to constructor.
16852
16853         * class.cs (Property, Event, Indexer): Update accordingly.
16854
16855         * ../errors/cs111.cs : Added.
16856
16857         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
16858         of a method, as laid down by the spec.
16859
16860         (Invocation::OverloadResolve): Use the above method.
16861
16862 2001-10-31  Ravi Pratap  <ravi@ximian.com>
16863
16864         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
16865         now take a TypeContainer and a Parameters object.
16866
16867         (ParameterData): Modify return type of ParameterModifier method to be 
16868         Parameter.Modifier and not a string.
16869
16870         (ReflectionParameters, InternalParameters): Update accordingly.
16871
16872         * expression.cs (Argument::GetParameterModifier): Same here.
16873
16874         * support.cs (InternalParameters::ParameterType): Find a better way of determining
16875         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
16876         symbol in it at all so maybe this is only for now.
16877
16878 2001-10-30  Ravi Pratap  <ravi@ximian.com>
16879
16880         * support.cs (InternalParameters): Constructor now takes an extra argument 
16881         which is the actual Parameters class.
16882
16883         (ParameterDesc): Update to provide info on ref/out modifiers.
16884
16885         * class.cs (everywhere): Update call to InternalParameters to pass in
16886         the second argument too.
16887
16888         * support.cs (ParameterData): Add ParameterModifier, which is a method 
16889         to return the modifier info [ref/out etc]
16890
16891         (InternalParameters, ReflectionParameters): Implement the above.
16892
16893         * expression.cs (Argument::ParameterModifier): Similar function to return
16894         info about the argument's modifiers.
16895
16896         (Invocation::OverloadResolve): Update to take into account matching modifiers 
16897         too.
16898
16899         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
16900         a new SetFormalParameters object which we pass to InternalParameters.
16901
16902 2001-10-30  Ravi Pratap  <ravi@ximian.com>
16903
16904         * expression.cs (NewArray): Merge into the ArrayCreation class.
16905
16906 2001-10-29  Ravi Pratap  <ravi@ximian.com>
16907
16908         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
16909         NewUserdefinedArray into one as there wasn't much of a use in having
16910         two separate ones.
16911
16912         * expression.cs (Argument): Change field's name to ArgType from Type.
16913
16914         (Type): New readonly property which returns the proper type, taking into 
16915         account ref/out modifiers.
16916
16917         (everywhere): Adjust code accordingly for the above.
16918
16919         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
16920         whether we are emitting for a ref or out parameter.
16921
16922         * expression.cs (Argument::Emit): Use the above field to set the state.
16923
16924         (LocalVariableReference::Emit): Update to honour the flag and emit the
16925         right stuff.
16926
16927         * parameter.cs (Attributes): Set the correct flags for ref parameters.
16928
16929         * expression.cs (Argument::FullDesc): New function to provide a full desc.
16930
16931         * support.cs (ParameterData): Add method ParameterDesc to the interface.
16932
16933         (ReflectionParameters, InternalParameters): Implement the above method.
16934
16935         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
16936         reporting errors.
16937
16938         (Invocation::FullMethodDesc): Ditto. 
16939
16940 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
16941
16942         * cs-parser.jay: Add extra production for the second form of array
16943         creation. 
16944
16945         * expression.cs (ArrayCreation): Update to reflect the above
16946         change. 
16947
16948         * Small changes to prepare for Array initialization.
16949
16950 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
16951
16952         * typemanager.cs (ImplementsInterface): interface might be null;
16953         Deal with this problem;
16954
16955         Also, we do store negative hits on the cache (null values), so use
16956         this instead of calling t.GetInterfaces on the type everytime.
16957
16958 2001-10-28  Ravi Pratap  <ravi@ximian.com>
16959
16960         * typemanager.cs (IsBuiltinType): New method to help determine the same.
16961
16962         * expression.cs (New::DoResolve): Get rid of array creation code and instead
16963         split functionality out into different classes.
16964
16965         (New::FormArrayType): Move into NewBuiltinArray.
16966
16967         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
16968         quite useless.
16969
16970         (NewBuiltinArray): New class to handle creation of built-in arrays.
16971
16972         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
16973         account creation of one-dimensional arrays.
16974
16975         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
16976
16977         (NewUserdefinedArray::DoResolve): Implement.
16978
16979         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
16980
16981         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
16982         we maintain inside the TypeManager. This is necessary to perform lookups on the
16983         module builder.
16984
16985         (LookupType): Update to perform GetType on the module builders too.     
16986
16987         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
16988
16989         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
16990
16991 2001-10-23  Ravi Pratap  <ravi@ximian.com>
16992
16993         * expression.cs (New::DoResolve): Implement guts of array creation.
16994
16995         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
16996
16997 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
16998
16999         * expression.cs: Fix bug I introduced lsat night that broke
17000         Delegates. 
17001
17002         (Expression.Resolve): Report a 246 error (can not resolve name)
17003         if we find a SimpleName in the stream.
17004
17005         (Expression.ResolveLValue): Ditto.
17006
17007         (Expression.ResolveWithSimpleName): This function is a variant of
17008         ResolveName, this one allows SimpleNames to be returned without a
17009         warning.  The only consumer of SimpleNames is MemberAccess
17010
17011 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
17012
17013         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
17014         might arrive here.  I have my doubts that this is correct.
17015
17016         * statement.cs (Lock): Implement lock statement.
17017
17018         * cs-parser.jay: Small fixes to support `lock' and `using'
17019
17020         * cs-tokenizer.cs: Remove extra space
17021
17022         * driver.cs: New flag --checked, allows to turn on integer math
17023         checking. 
17024
17025         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
17026         Threading.Monitor.Exit 
17027
17028 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
17029
17030         * expression.cs (IndexerAccess::DoResolveLValue): Set the
17031         Expression Class to be IndexerAccess.
17032
17033         Notice that Indexer::DoResolve sets the eclass to Value.
17034
17035 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
17036
17037         * class.cs (TypeContainer::Emit): Emit code for indexers.
17038
17039         * assign.cs (IAssignMethod): New interface implemented by Indexers
17040         and Properties for handling assignment.
17041
17042         (Assign::Emit): Simplify and reuse code. 
17043
17044         * expression.cs (IndexerAccess, PropertyExpr): Implement
17045         IAssignMethod, clean up old code. 
17046
17047 2001-10-22  Ravi Pratap  <ravi@ximian.com>
17048
17049         * typemanager.cs (ImplementsInterface): New method to determine if a type
17050         implements a given interface. Provides a nice cache too.
17051
17052         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
17053         method.
17054
17055         (ConvertReferenceExplicit): Ditto.
17056
17057         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
17058         various methods, with correct names etc.
17059
17060         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
17061         Operator.UnaryNegation.
17062
17063         * cs-parser.jay (operator_declarator): Be a little clever in the case where
17064         we have a unary plus or minus operator.
17065
17066         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
17067         UnaryMinus.
17068
17069         * everywhere : update accordingly.
17070
17071         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
17072         respectively.
17073
17074         * class.cs (Method::Define): For the case where we are implementing a method
17075         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
17076         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
17077
17078 2001-10-21  Ravi Pratap  <ravi@ximian.com>
17079
17080         * interface.cs (FindMembers): Implement to work around S.R.E
17081         lameness.
17082
17083         * typemanager.cs (IsInterfaceType): Implement.
17084
17085         (FindMembers): Update to handle interface types too.
17086
17087         * expression.cs (ImplicitReferenceConversion): Re-write bits which
17088         use IsAssignableFrom as that is not correct - it doesn't work.
17089
17090         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
17091         and accordingly override EmitStatement.
17092
17093         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
17094         using the correct logic :-)
17095
17096 2001-10-19  Ravi Pratap  <ravi@ximian.com>
17097
17098         * ../errors/cs-11.cs : Add to demonstrate error -11 
17099
17100 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
17101
17102         * assign.cs (Assign::Resolve): Resolve right hand side first, and
17103         then pass this as a hint to ResolveLValue.
17104
17105         * expression.cs (FieldExpr): Add Location information
17106
17107         (FieldExpr::LValueResolve): Report assignment to readonly
17108         variable. 
17109
17110         (Expression::ExprClassFromMemberInfo): Pass location information.
17111
17112         (Expression::ResolveLValue): Add new method that resolves an
17113         LValue. 
17114
17115         (Expression::DoResolveLValue): Default invocation calls
17116         DoResolve. 
17117
17118         (Indexers): New class used to keep track of indexers in a given
17119         Type. 
17120
17121         (IStackStore): Renamed from LValue, as it did not really describe
17122         what this did.  Also ResolveLValue is gone from this interface and
17123         now is part of Expression.
17124
17125         (ElementAccess): Depending on the element access type
17126
17127         * typemanager.cs: Add `indexer_name_type' as a Core type
17128         (System.Runtime.CompilerServices.IndexerNameAttribute)
17129
17130         * statement.cs (Goto): Take a location.
17131
17132 2001-10-18  Ravi Pratap  <ravi@ximian.com>
17133
17134         * delegate.cs (Delegate::VerifyDelegate): New method to verify
17135         if two delegates are compatible.
17136
17137         (NewDelegate::DoResolve): Update to take care of the case when
17138         we instantiate a delegate from another delegate.
17139
17140         * typemanager.cs (FindMembers): Don't even try to look up members
17141         of Delegate types for now.
17142
17143 2001-10-18  Ravi Pratap  <ravi@ximian.com>
17144
17145         * delegate.cs (NewDelegate): New class to take care of delegate
17146         instantiation.
17147
17148         * expression.cs (New): Split the delegate related code out into 
17149         the NewDelegate class.
17150
17151         * delegate.cs (DelegateInvocation): New class to handle delegate 
17152         invocation.
17153
17154         * expression.cs (Invocation): Split out delegate related code into
17155         the DelegateInvocation class.
17156
17157 2001-10-17  Ravi Pratap  <ravi@ximian.com>
17158
17159         * expression.cs (New::DoResolve): Implement delegate creation fully
17160         and according to the spec.
17161
17162         (New::DoEmit): Update to handle delegates differently.
17163
17164         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
17165         because of which we were printing out arguments in reverse order !
17166
17167         * delegate.cs (VerifyMethod): Implement to check if the given method
17168         matches the delegate.
17169
17170         (FullDelegateDesc): Implement.
17171
17172         (VerifyApplicability): Implement.
17173
17174         * expression.cs (Invocation::DoResolve): Update to accordingly handle
17175         delegate invocations too.
17176
17177         (Invocation::Emit): Ditto.
17178
17179         * ../errors/cs1593.cs : Added.
17180
17181         * ../errors/cs1594.cs : Added.
17182
17183         * delegate.cs (InstanceExpression, TargetMethod): New properties.
17184
17185 2001-10-16  Ravi Pratap  <ravi@ximian.com>
17186
17187         * typemanager.cs (intptr_type): Core type for System.IntPtr
17188
17189         (InitCoreTypes): Update for the same.
17190
17191         (iasyncresult_type, asynccallback_type): Ditto.
17192
17193         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
17194         correct.
17195
17196         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
17197         too.
17198
17199         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
17200         the builders for the 4 members of a delegate type :-)
17201
17202         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
17203         type.
17204
17205         * expression.cs (New::DoResolve): Implement guts for delegate creation.
17206
17207         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
17208
17209 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
17210
17211         * statement.cs (Break::Emit): Implement.   
17212         (Continue::Emit): Implement.
17213
17214         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
17215         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
17216         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
17217         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
17218         end loop
17219
17220         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
17221         properties that track the label for the current loop (begin of the
17222         loop and end of the loop).
17223
17224 2001-10-15  Ravi Pratap  <ravi@ximian.com>
17225
17226         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
17227         use of emitting anything at all.
17228
17229         * class.cs, rootcontext.cs : Get rid of calls to the same.
17230
17231         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
17232
17233         (Populate): Define the constructor correctly and set the implementation
17234         attributes.
17235
17236         * typemanager.cs (delegate_types): New hashtable to hold delegates that
17237         have been defined.
17238
17239         (AddDelegateType): Implement.
17240
17241         (IsDelegateType): Implement helper method.
17242
17243         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
17244
17245         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
17246         and accordingly handle it.
17247
17248         * delegate.cs (Populate): Take TypeContainer argument.
17249         Implement bits to define the Invoke method. However, I still haven't figured out
17250         how to take care of the native int bit :-(
17251
17252         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
17253         Qualify the name of the delegate, not its return type !
17254
17255         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
17256         conversion.
17257
17258         (StandardConversionExists): Checking for array types turns out to be recursive.
17259
17260         (ConvertReferenceExplicit): Implement array conversion.
17261
17262         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
17263
17264 2001-10-12  Ravi Pratap  <ravi@ximian.com>
17265
17266         * cs-parser.jay (delegate_declaration): Store the fully qualified
17267         name as it is a type declaration.
17268
17269         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
17270         readonly.
17271
17272         (DefineDelegate): Renamed from Define. Does the same thing essentially,
17273         as TypeContainer::DefineType.
17274
17275         (Populate): Method in which all the definition of the various methods (Invoke)
17276         etc is done.
17277
17278         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
17279         see.
17280
17281         (CloseDelegate): Finally creates the delegate.
17282
17283         * class.cs (TypeContainer::DefineType): Update to define delegates.
17284         (Populate, Emit and CloseType): Do the same thing here too.
17285
17286         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
17287         delegates in all these operations.
17288
17289 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
17290
17291         * expression.cs: LocalTemporary: a new expression used to
17292         reference a temporary that has been created.
17293
17294         * assign.cs: Handle PropertyAccess back here, so that we can
17295         provide the proper semantic access to properties.
17296
17297         * expression.cs (Expression::ConvertReferenceExplicit): Implement
17298         a few more explicit conversions. 
17299
17300         * modifiers.cs: `NEW' modifier maps to HideBySig.
17301
17302         * expression.cs (PropertyExpr): Make this into an
17303         ExpressionStatement, and support the EmitStatement code path. 
17304
17305         Perform get/set error checking, clean up the interface.
17306
17307         * assign.cs: recognize PropertyExprs as targets, and if so, turn
17308         them into toplevel access objects.
17309
17310 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
17311
17312         * expression.cs: PropertyExpr::PropertyExpr: use work around the
17313         SRE.
17314
17315         * typemanager.cs: Keep track here of our PropertyBuilders again to
17316         work around lameness in SRE.
17317
17318 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
17319
17320         * expression.cs (LValue::LValueResolve): New method in the
17321         interface, used to perform a second resolution pass for LValues. 
17322
17323         (This::DoResolve): Catch the use of this in static methods.
17324
17325         (This::LValueResolve): Implement.
17326
17327         (This::Store): Remove warning, assigning to `this' in structures
17328         is 
17329
17330         (Invocation::Emit): Deal with invocation of
17331         methods on value types.  We need to pass the address to structure
17332         methods rather than the object itself.  (The equivalent code to
17333         emit "this" for structures leaves the entire structure on the
17334         stack instead of a pointer to it). 
17335
17336         (ParameterReference::DoResolve): Compute the real index for the
17337         argument based on whether the method takes or not a `this' pointer
17338         (ie, the method is static).
17339
17340         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
17341         value types returned from functions when we need to invoke a
17342         method on the sturcture.
17343
17344
17345 2001-10-11  Ravi Pratap  <ravi@ximian.com>
17346
17347         * class.cs (TypeContainer::DefineType): Method to actually do the business of
17348         defining the type in the Modulebuilder or Typebuilder. This is to take
17349         care of nested types which need to be defined on the TypeBuilder using
17350         DefineNestedMethod.
17351
17352         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
17353         methods in RootContext, only ported to be part of TypeContainer.
17354
17355         (TypeContainer::GetInterfaceOrClass): Ditto.
17356
17357         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
17358
17359         * interface.cs (Interface::DefineInterface): New method. Does exactly
17360         what RootContext.CreateInterface did earlier, only it takes care of nested types 
17361         too.
17362
17363         (Interface::GetInterfaces): Move from RootContext here and port.
17364
17365         (Interface::GetInterfaceByName): Same here.
17366
17367         * rootcontext.cs (ResolveTree): Re-write.
17368
17369         (PopulateTypes): Re-write.
17370
17371         * class.cs (TypeContainer::Populate): Populate nested types too.
17372         (TypeContainer::Emit): Emit nested members too.
17373
17374         * typemanager.cs (AddUserType): Do not make use of the FullName property,
17375         instead just use the name argument passed in as it is already fully
17376         qualified.
17377
17378         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
17379         to TypeContainer mapping to see if a type is user-defined.
17380
17381         * class.cs (TypeContainer::CloseType): Implement. 
17382
17383         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
17384         the default constructor.
17385
17386         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
17387         twice.
17388
17389         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
17390
17391         * interface.cs (CloseType): Create the type here.
17392
17393         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
17394         the hierarchy.
17395
17396         Remove all the methods which are now in TypeContainer.
17397
17398 2001-10-10  Ravi Pratap  <ravi@ximian.com>
17399
17400         * delegate.cs (Define): Re-write bits to define the delegate
17401         correctly.
17402
17403 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
17404
17405         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
17406
17407         * expression.cs (ImplicitReferenceConversion): handle null as well
17408         as a source to convert to any reference type.
17409
17410         * statement.cs (Return): Perform any implicit conversions to
17411         expected return type.  
17412
17413         Validate use of return statement.  
17414
17415         * codegen.cs (EmitContext): Pass the expected return type here.
17416
17417         * class.cs (Method, Constructor, Property): Pass expected return
17418         type to EmitContext.
17419
17420 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
17421
17422         * expression.cs: Make DoResolve take an EmitContext instead of a
17423         TypeContainer.
17424
17425         Replaced `l' and `location' for `loc', for consistency.
17426
17427         (Error, Warning): Remove unneeded Tc argument.
17428
17429         * assign.cs, literal.cs, constant.cs: Update to new calling
17430         convention. 
17431
17432         * codegen.cs: EmitContext now contains a flag indicating whether
17433         code is being generated in a static method or not.
17434
17435         * cs-parser.jay: DecomposeQI, new function that replaces the old
17436         QualifiedIdentifier.  Now we always decompose the assembled
17437         strings from qualified_identifier productions into a group of
17438         memberaccesses.
17439
17440 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
17441
17442         * rootcontext.cs: Deal with field-less struct types correctly now
17443         by passing the size option to Define Type.
17444
17445         * class.cs: Removed hack that created one static field. 
17446
17447 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
17448
17449         * statement.cs: Moved most of the code generation here. 
17450
17451 2001-10-09  Ravi Pratap  <ravi@ximian.com>
17452
17453         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
17454         seem very right.
17455
17456         (ElementAccess): Remove useless bits for now - keep checks as the spec
17457         says.
17458
17459 2001-10-08  Ravi Pratap  <ravi@ximian.com>
17460
17461         * expression.cs (ElementAccess::DoResolve): Remove my crap code
17462         and start performing checks according to the spec.
17463
17464 2001-10-07  Ravi Pratap  <ravi@ximian.com>
17465
17466         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
17467         rank_specifiers instead.
17468
17469         (rank_specifiers): Change the order in which the rank specifiers are stored
17470
17471         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
17472
17473         * expression.cs (ElementAccess): Implement the LValue interface too.
17474
17475 2001-10-06  Ravi Pratap  <ravi@ximian.com>
17476
17477         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
17478         except that user defined conversions are not included.
17479
17480         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
17481         perform the conversion of the return type, if necessary.
17482
17483         (New::DoResolve): Check whether we are creating an array or an object
17484         and accordingly do the needful.
17485
17486         (New::Emit): Same here.
17487
17488         (New::DoResolve): Implement guts of array creation.
17489
17490         (New::FormLookupType): Helper function.
17491
17492 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
17493
17494         * codegen.cs: Removed most of the code generation here, and move the
17495         corresponding code generation bits to the statement classes. 
17496
17497         Added support for try/catch/finalize and throw.
17498
17499         * cs-parser.jay: Added support for try/catch/finalize.
17500
17501         * class.cs: Catch static methods having the flags override,
17502         virtual or abstract.
17503
17504         * expression.cs (UserCast): This user cast was not really doing
17505         what it was supposed to do.  Which is to be born in fully resolved
17506         state.  Parts of the resolution were being performed at Emit time! 
17507
17508         Fixed this code.
17509
17510 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
17511
17512         * expression.cs: Implicity convert the result from UserCast.
17513
17514 2001-10-05  Ravi Pratap  <ravi@ximian.com>
17515
17516         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
17517         prevented it from working correctly. 
17518
17519         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
17520         merely ConvertImplicit.
17521
17522 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
17523
17524         * typemanager.cs: Make the LookupTypeContainer function static,
17525         and not per-instance.  
17526
17527         * class.cs: Make static FindMembers (the one that takes a Type
17528         argument). 
17529
17530         * codegen.cs: Add EmitForeach here.
17531
17532         * cs-parser.jay: Make foreach a toplevel object instead of the
17533         inline expansion, as we need to perform semantic analysis on it. 
17534
17535 2001-10-05  Ravi Pratap  <ravi@ximian.com>
17536
17537         * expression.cs (Expression::ImplicitUserConversion): Rename to
17538         UserDefinedConversion.
17539
17540         (Expression::UserDefinedConversion): Take an extra argument specifying 
17541         whether we look for explicit user conversions too.
17542
17543         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
17544
17545         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
17546
17547         (ExplicitUserConversion): Make it a call to UserDefinedConversion
17548         with the appropriate arguments.
17549
17550         * cs-parser.jay (cast_expression): Record location too.
17551
17552         * expression.cs (Cast): Record location info.
17553
17554         (Expression::ConvertExplicit): Take location argument.
17555
17556         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
17557         to determine if we are doing explicit conversions.
17558
17559         (UserCast::Emit): Update accordingly.
17560
17561         (Expression::ConvertExplicit): Report an error if everything fails.
17562
17563         * ../errors/cs0030.cs : Add.
17564
17565 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
17566
17567         * modifiers.cs: If the ABSTRACT keyword is present, also set the
17568         virtual and newslot bits. 
17569
17570         * class.cs (TypeContainer::RegisterRequiredImplementations):
17571         Record methods we need.
17572
17573         (TypeContainer::MakeKey): Helper function to make keys for
17574         MethodBases, since the Methodbase key is useless.
17575
17576         (TypeContainer::Populate): Call RegisterRequiredImplementations
17577         before defining the methods.   
17578
17579         Create a mapping for method_builders_to_methods ahead of time
17580         instead of inside a tight loop.
17581
17582         (::RequireMethods):  Accept an object as the data to set into the
17583         hashtable so we can report interface vs abstract method mismatch.
17584
17585 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
17586
17587         * report.cs: Make all of it static.
17588
17589         * rootcontext.cs: Drop object_type and value_type computations, as
17590         we have those in the TypeManager anyways.
17591
17592         Drop report instance variable too, now it is a global.
17593
17594         * driver.cs: Use try/catch on command line handling.
17595
17596         Add --probe option to debug the error reporting system with a test
17597         suite. 
17598
17599         * report.cs: Add support for exiting program when a probe
17600         condition is reached.
17601
17602 2001-10-03  Ravi Pratap  <ravi@ximian.com>
17603
17604         * expression.cs (Binary::DoNumericPromotions): Fix the case when
17605         we do a forcible conversion regardless of type, to check if 
17606         ForceConversion returns a null.
17607
17608         (Binary::error19): Use location to report error.
17609
17610         (Unary::error23): Use location here too.
17611
17612         * ../errors/cs0019.cs : Check in.
17613
17614         * ../errors/cs0023.cs : Check in.
17615
17616         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
17617         case of a non-null MethodInfo object with a length of 0 !
17618
17619         (Binary::ResolveOperator): Flag error if overload resolution fails to find
17620         an applicable member - according to the spec :-)
17621         Also fix logic to find members in base types.
17622
17623         (Unary::ResolveOperator): Same here.
17624
17625         (Unary::report23): Change name to error23 and make first argument a TypeContainer
17626         as I was getting thoroughly confused between this and error19 :-)
17627
17628         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
17629         (::FindMostEncompassedType): Implement.
17630         (::FindMostEncompassingType): Implement.
17631         (::StandardConversionExists): Implement.
17632
17633         (UserImplicitCast): Re-vamp. We now need info about most specific
17634         source and target types so that we can do the necessary conversions.
17635
17636         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
17637         mathematical union with no duplicates.
17638
17639 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
17640
17641         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
17642         in order from base classes to child classes, so that we can in
17643         child classes look up in our parent for method names and
17644         attributes (required for handling abstract, virtual, new, override
17645         constructs: we need to instrospect our base class, and if we dont
17646         populate the classes in order, the introspection might be
17647         incorrect.  For example, a method could query its parent before
17648         the parent has any methods and would determine that the parent has
17649         no abstract methods (while it could have had them)).
17650
17651         (RootContext::CreateType): Record the order in which we define the
17652         classes.
17653
17654 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
17655
17656         * class.cs (TypeContainer::Populate): Also method definitions can
17657         fail now, keep track of this.
17658
17659         (TypeContainer::FindMembers): Implement support for
17660         DeclaredOnly/noDeclaredOnly flag.
17661
17662         (Constructor::Emit) Return the ConstructorBuilder.
17663
17664         (Method::Emit) Return the MethodBuilder. 
17665         Check for abstract or virtual methods to be public.
17666
17667         * rootcontext.cs (RootContext::CreateType): Register all the
17668         abstract methods required for the class to be complete and the
17669         interface methods that must be implemented. 
17670
17671         * cs-parser.jay: Report error 501 (method requires body if it is
17672         not marked abstract or extern).
17673
17674         * expression.cs (TypeOf::Emit): Implement.
17675
17676         * typemanager.cs: runtime_handle_type, new global type.
17677
17678         * class.cs (Property::Emit): Generate code for properties.
17679
17680 2001-10-02  Ravi Pratap  <ravi@ximian.com>
17681
17682         * expression.cs (Unary::ResolveOperator): Find operators on base type
17683         too - we now conform exactly to the spec.
17684
17685         (Binary::ResolveOperator): Same here.
17686
17687         * class.cs (Operator::Define): Fix minor quirk in the tests.
17688
17689         * ../errors/cs0215.cs : Added.
17690
17691         * ../errors/cs0556.cs : Added.
17692
17693         * ../errors/cs0555.cs : Added.
17694
17695 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
17696
17697         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
17698         single integer which is really efficient
17699
17700 2001-10-01  Ravi Pratap  <ravi@ximian.com>
17701
17702         *  expression.cs (Expression::ImplicitUserConversion): Use location
17703         even in the case when we are examining True operators.
17704  
17705         * class.cs (Operator::Define): Perform extensive checks to conform
17706         with the rules for operator overloading in the spec.
17707
17708         * expression.cs (Expression::ImplicitReferenceConversion): Implement
17709         some of the other conversions mentioned in the spec.
17710
17711         * typemanager.cs (array_type): New static member for the System.Array built-in
17712         type.
17713
17714         (cloneable_interface): For System.ICloneable interface.
17715
17716         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
17717         we start resolving the tree and populating types.
17718
17719         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
17720  
17721 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
17722
17723         * expression.cs (Expression::ExprClassFromMemberInfo,
17724         Expression::Literalize): Create literal expressions from
17725         FieldInfos which are literals.
17726
17727         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
17728         type casts, because they were wrong.  The test suite in tests
17729         caught these ones.
17730
17731         (ImplicitNumericConversion): ushort to ulong requires a widening
17732         cast. 
17733
17734         Int32 constant to long requires widening cast as well.
17735
17736         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
17737         for integers because the type on the stack is not i4.
17738
17739 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
17740
17741         * expression.cs (report118): require location argument. 
17742
17743         * parameter.cs: Do not dereference potential null value.
17744
17745         * class.cs: Catch methods that lack the `new' keyword when
17746         overriding a name.  Report warnings when `new' is used without
17747         anything being there to override.
17748
17749         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
17750
17751         * class.cs: Only add constructor to hashtable if it is non-null
17752         (as now constructors can fail on define).
17753
17754         (TypeManager, Class, Struct): Take location arguments.
17755
17756         Catch field instance initialization in structs as errors.
17757
17758         accepting_filter: a new filter for FindMembers that is static so
17759         that we dont create an instance per invocation.
17760
17761         (Constructor::Define): Catch errors where a struct constructor is
17762         parameterless 
17763
17764         * cs-parser.jay: Pass location information for various new
17765         constructs. 
17766
17767         * delegate.cs (Delegate): take a location argument.
17768
17769         * driver.cs: Do not call EmitCode if there were problesm in the
17770         Definition of the types, as many Builders wont be there. 
17771
17772         * decl.cs (Decl::Decl): Require a location argument.
17773
17774         * cs-tokenizer.cs: Handle properly hex constants that can not fit
17775         into integers, and find the most appropiate integer for it.
17776
17777         * literal.cs: Implement ULongLiteral.
17778
17779         * rootcontext.cs: Provide better information about the location of
17780         failure when CreateType fails.
17781
17782 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
17783
17784         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
17785         as well.
17786
17787         * expression.cs (Binary::CheckShiftArguments): Add missing type
17788         computation.
17789         (Binary::ResolveOperator): Add type to the logical and and logical
17790         or, Bitwise And/Or and Exclusive Or code paths, it was missing
17791         before.
17792
17793         (Binary::DoNumericPromotions): In the case where either argument
17794         is ulong (and most signed types combined with ulong cause an
17795         error) perform implicit integer constant conversions as well.
17796
17797 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
17798
17799         * expression.cs (UserImplicitCast): Method should always be
17800         non-null. 
17801         (Invocation::BetterConversion): Simplified test for IntLiteral.
17802
17803         (Expression::ImplicitNumericConversion): Split this routine out.
17804         Put the code that performs implicit constant integer conversions
17805         here. 
17806
17807         (Expression::Resolve): Become a wrapper around DoResolve so we can
17808         check eclass and type being set after resolve.
17809
17810         (Invocation::Badness): Remove this dead function
17811
17812         (Binary::ResolveOperator): Do not compute the expensive argumnets
17813         unless we have a union for it.
17814
17815         (Probe::Emit): Is needs to do an isinst and then
17816         compare against null.
17817
17818         (::CanConvert): Added Location argument.  If the Location argument
17819         is null (Location.Null), then we do not report errors.  This is
17820         used by the `probe' mechanism of the Explicit conversion.  We do
17821         not want to generate an error for something that the user
17822         explicitly requested to be casted.  But the pipeline for an
17823         explicit cast first tests for potential implicit casts.
17824
17825         So for now, if the Location is null, it means `Probe only' to
17826         avoid adding another argument.   Might have to revise this
17827         strategy later.
17828
17829         (ClassCast): New class used to type cast objects into arbitrary
17830         classes (used in Explicit Reference Conversions).
17831
17832         Implement `as' as well.
17833
17834         Reverted all the patches from Ravi below: they were broken:
17835
17836                 * The use of `level' as a mechanism to stop recursive
17837                   invocations is wrong.  That was there just to catch the
17838                   bug with a strack trace but not as a way of addressing
17839                   the problem.
17840
17841                   To fix the problem we have to *understand* what is going
17842                   on and the interactions and come up with a plan, not
17843                   just get things going.
17844
17845                 * The use of the type conversion cache that I proposed
17846                   last night had an open topic: How does this work across
17847                   protection domains.  A user defined conversion might not
17848                   be public in the location where we are applying the
17849                   conversion, a different conversion might be selected
17850                   (ie, private A->B (better) but public B->A (worse),
17851                   inside A, A->B applies, but outside it, B->A will
17852                   apply).
17853
17854                 * On top of that (ie, even if the above is solved),
17855                   conversions in a cache need to be abstract.  Ie, `To
17856                   convert from an Int to a Short use an OpcodeCast', not
17857                   `To convert from an Int to a Short use the OpcodeCast on
17858                   the variable 5' (which is what this patch was doing).
17859
17860 2001-09-28  Ravi Pratap  <ravi@ximian.com>
17861
17862         * expression.cs (Invocation::ConversionExists): Re-write to use
17863         the conversion cache
17864
17865         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
17866         cache all conversions done, not just user-defined ones.
17867
17868         (Invocation::BetterConversion): The real culprit. Use ConversionExists
17869         to determine if a conversion exists instead of acutually trying to 
17870         perform the conversion. It's faster too.
17871
17872         (Expression::ConvertExplicit): Modify to use ConversionExists to check
17873         and only then attempt the implicit conversion.
17874
17875 2001-09-28  Ravi Pratap  <ravi@ximian.com>
17876
17877         * expression.cs (ConvertImplicit): Use a cache for conversions
17878         already found. Check level of recursion and bail out if necessary.
17879
17880 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
17881
17882         * typemanager.cs (string_concat_string_string, string_concat_object_object):
17883         Export standard methods that we expect for string operations.
17884
17885         * statement.cs (Block::UsageWarning): Track usage of variables and
17886         report the errors for not used variables.
17887
17888         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
17889         operator. 
17890
17891 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
17892
17893         * codegen.cs: remove unnneded code 
17894
17895         * expression.cs: Removed BuiltinTypeAccess class
17896
17897         Fix the order in which implicit conversions are
17898         done.  
17899
17900         The previous fixed dropped support for boxed conversions (adding a
17901         test to the test suite now)
17902
17903         (UserImplicitCast::CanConvert): Remove test for source being null,
17904         that code is broken.  We should not feed a null to begin with, if
17905         we do, then we should track the bug where the problem originates
17906         and not try to cover it up here.
17907
17908         Return a resolved expression of type UserImplicitCast on success
17909         rather than true/false.  Ravi: this is what I was talking about,
17910         the pattern is to use a static method as a "constructor" for
17911         objects. 
17912
17913         Also, do not create arguments until the very last minute,
17914         otherwise we always create the arguments even for lookups that
17915         will never be performed. 
17916
17917         (UserImplicitCast::Resolve): Eliminate, objects of type
17918         UserImplicitCast are born in a fully resolved state. 
17919
17920         * typemanager.cs (InitCoreTypes): Init also value_type
17921         (System.ValueType). 
17922
17923         * expression.cs (Cast::Resolve): First resolve the child expression.
17924
17925         (LValue): Add new method AddressOf to be used by
17926         the `&' operator.  
17927
17928         Change the argument of Store to take an EmitContext instead of an
17929         ILGenerator, because things like FieldExpr need to be able to call
17930         their children expression to generate the instance code. 
17931
17932         (Expression::Error, Expression::Warning): Sugar functions for
17933         reporting errors.
17934
17935         (Expression::MemberLookup): Accept a TypeContainer instead of a
17936         Report as the first argument.
17937
17938         (Expression::ResolvePrimary): Killed.  I still want to improve
17939         this as currently the code is just not right.
17940
17941         (Expression::ResolveMemberAccess): Simplify, but it is still
17942         wrong. 
17943
17944         (Unary::Resolve): Catch errors in AddressOf operators.
17945
17946         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
17947         index to a byte for the short-version, or the compiler will choose
17948         the wrong Emit call, which generates the wrong data.
17949
17950         (ParameterReference::Emit, ::Store): same.
17951
17952         (FieldExpr::AddressOf): Implement.
17953
17954         * typemanager.cs: TypeManager: made public variable instead of
17955         property.
17956
17957         * driver.cs: document --fatal.
17958
17959         * report.cs (ErrorMessage, WarningMessage): new names for the old
17960         Error and Warning classes.
17961
17962         * cs-parser.jay (member_access): Turn built-in access to types
17963         into a normal simplename
17964
17965 2001-09-27  Ravi Pratap  <ravi@ximian.com>
17966
17967         * expression.cs (Invocation::BetterConversion): Fix to cope
17968         with q being null, since this was introducing a bug.
17969
17970         * expression.cs (ConvertImplicit): Do built-in conversions first.
17971
17972 2001-09-27  Ravi Pratap  <ravi@ximian.com>
17973
17974         * expression.cs (UserImplicitCast::Resolve): Fix bug.
17975
17976 2001-09-27  Ravi Pratap  <ravi@ximian.com>
17977
17978         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
17979         I had introduced long ago (what's new ?).
17980
17981         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
17982         the work of all the checking. 
17983         (ConvertImplicit): Call CanConvert and only then create object if necessary.
17984         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
17985
17986         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
17987         that is the right way. 
17988
17989         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
17990         overloading resolution. Use everywhere instead of cutting and pasting code.
17991
17992         (Binary::ResolveOperator): Use MakeUnionSet.
17993
17994         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
17995         we have to convert to bool types. Not complete yet.
17996
17997 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
17998
17999         * typemanager.cs (TypeManager::CSharpName): support ushort.
18000
18001         * expression.cs (Expression::TryImplicitIntConversion): Attempts
18002         to provide an expression that performsn an implicit constant int
18003         conversion (section 6.1.6).
18004         (Expression::ConvertImplicitRequired): Reworked to include
18005         implicit constant expression conversions.
18006
18007         (Expression::ConvertNumericExplicit): Finished.
18008
18009         (Invocation::Emit): If InstanceExpression is null, then it means
18010         that we perform a call on this.
18011
18012 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
18013
18014         * expression.cs (Unary::Emit): Remove some dead code.
18015         (Probe): Implement Resolve and Emit for `is'.
18016         (Expression::ConvertImplicitRequired): Attempt to do constant
18017         expression conversions here.  Maybe should be moved to
18018         ConvertImplicit, but I am not sure.
18019         (Expression::ImplicitLongConstantConversionPossible,
18020         Expression::ImplicitIntConstantConversionPossible): New functions
18021         that tell whether is it possible to apply an implicit constant
18022         expression conversion.
18023
18024         (ConvertNumericExplicit): Started work on explicit numeric
18025         conversions.
18026
18027         * cs-parser.jay: Update operator constants.
18028
18029         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
18030         (Parameters::GetSignature): Hook up VerifyArgs here.
18031         (Parameters::VerifyArgs): Verifies that no two arguments have the
18032         same name. 
18033
18034         * class.cs (Operator): Update the operator names to reflect the
18035         ones that the spec expects (as we are just stringizing the
18036         operator names).
18037
18038         * expression.cs (Unary::ResolveOperator): Fix bug: Use
18039         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
18040         previous usage did only work for our methods.
18041         (Expression::ConvertImplicit): Handle decimal implicit numeric
18042         conversions as well.
18043         (Expression::InternalTypeConstructor): Used to invoke constructors
18044         on internal types for default promotions.
18045
18046         (Unary::Emit): Implement special handling for the pre/post
18047         increment/decrement for overloaded operators, as they need to have
18048         the same semantics as the other operators.
18049
18050         (Binary::ResolveOperator): ditto.
18051         (Invocation::ConversionExists): ditto.
18052         (UserImplicitCast::Resolve): ditto.
18053
18054 2001-09-26  Ravi Pratap  <ravi@ximian.com>
18055
18056         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
18057         operator, return after emitting body. Regression tests pass again !
18058
18059         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
18060         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
18061         (Invocation::OverloadResolve): Ditto.
18062         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
18063
18064         * everywhere : update calls to the above methods accordingly.
18065
18066 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
18067
18068         * assign.cs (Assign): Make it inherit from ExpressionStatement.
18069
18070         * expression.cs (ExpressionStatement): New base class used for
18071         expressions that can appear in statements, so that we can provide
18072         an alternate path to generate expression that do not leave a value
18073         on the stack.
18074
18075         (Expression::Emit, and all the derivatives): We no longer return
18076         whether a value is left on the stack or not.  Every expression
18077         after being emitted leaves a single value on the stack.
18078
18079         * codegen.cs (EmitContext::EmitStatementExpression): Use the
18080         facilties of ExpressionStatement if possible.
18081
18082         * cs-parser.jay: Update statement_expression.
18083
18084 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
18085
18086         * driver.cs: Change the wording of message
18087
18088 2001-09-25  Ravi Pratap  <ravi@ximian.com>
18089
18090         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
18091         the type of the expression to the return type of the method if
18092         we have an overloaded operator match ! The regression tests pass again !
18093         (Unary::ResolveOperator): Ditto.
18094
18095         * expression.cs (Invocation::ConversionExists): Correct the member lookup
18096         to find "op_Implicit", not "implicit" ;-)
18097         (UserImplicitCast): New class to take care of user-defined implicit conversions.
18098         (ConvertImplicit, ForceConversion): Take TypeContainer argument
18099
18100         * everywhere : Correct calls to the above accordingly.
18101
18102         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
18103         (ConvertImplicit): Do user-defined conversion if it exists.
18104
18105 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
18106
18107         * assign.cs: track location.
18108         (Resolve): Use implicit conversions on assignment.
18109
18110         * literal.cs: Oops.  Not good, Emit of short access values should
18111         pass (Bytes) or the wrong argument will be selected.
18112
18113         * expression.cs (Unary::Emit): Emit code for -expr.
18114
18115         (Unary::ResolveOperator): Handle `Substract' for non-constants
18116         (substract from zero from the non-constants).
18117         Deal with Doubles as well. 
18118
18119         (Expression::ConvertImplicitRequired): New routine that reports an
18120         error if no implicit conversion exists. 
18121
18122         (Invocation::OverloadResolve): Store the converted implicit
18123         expressions if we make them
18124
18125 2001-09-24  Ravi Pratap  <ravi@ximian.com>
18126
18127         * class.cs (ConstructorInitializer): Take a Location argument.
18128         (ConstructorBaseInitializer): Same here.
18129         (ConstructorThisInitializer): Same here.
18130
18131         * cs-parser.jay : Update all calls accordingly.
18132
18133         * expression.cs (Unary, Binary, New): Take location argument.
18134         Update accordingly everywhere.
18135
18136         * cs-parser.jay : Update all calls to the above to take a location
18137         argument.
18138
18139         * class.cs : Ditto.
18140
18141 2001-09-24  Ravi Pratap  <ravi@ximian.com>
18142
18143         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
18144         (Invocation::BetterConversion): Same here
18145         (Invocation::ConversionExists): Ditto.
18146
18147         (Invocation::ConversionExists): Implement.
18148
18149 2001-09-22  Ravi Pratap  <ravi@ximian.com>
18150
18151         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
18152         Also take an additional TypeContainer argument.
18153
18154         * All over : Pass in TypeContainer as argument to OverloadResolve.
18155
18156         * typemanager.cs (CSharpName): Update to check for the string type and return
18157         that too.
18158
18159         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
18160         a given method.
18161
18162 2001-09-21  Ravi Pratap  <ravi@ximian.com>
18163
18164         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
18165         (Invocation::BetterFunction): Implement.
18166         (Invocation::BetterConversion): Implement.
18167         (Invocation::ConversionExists): Skeleton, no implementation yet.
18168
18169         Okay, things work fine !
18170
18171 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
18172
18173         * typemanager.cs: declare and load enum_type, delegate_type and
18174         void_type. 
18175
18176         * expression.cs (Expression::Emit): Now emit returns a value that
18177         tells whether a value is left on the stack or not.  This strategy
18178         might be reveted tomorrow with a mechanism that would address
18179         multiple assignments.
18180         (Expression::report118): Utility routine to report mismatches on
18181         the ExprClass.
18182
18183         (Unary::Report23): Report impossible type/operator combination
18184         utility function.
18185
18186         (Unary::IsIncrementableNumber): Whether the type can be
18187         incremented or decremented with add.
18188         (Unary::ResolveOperator): Also allow enumerations to be bitwise
18189         complemented. 
18190         (Unary::ResolveOperator): Implement ++, !, ~,
18191
18192         (Invocation::Emit): Deal with new Emit convetion.
18193
18194         * All Expression derivatives: Updated their Emit method to return
18195         whether they leave values on the stack or not.
18196
18197         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
18198         stack for expressions that are statements. 
18199
18200 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
18201
18202         * expression.cs (LValue): New interface.  Must be implemented by
18203         LValue objects.
18204         (LocalVariableReference, ParameterReference, FieldExpr): Implement
18205         LValue interface.
18206
18207         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
18208         interface for generating code, simplifies the code.
18209
18210 2001-09-20  Ravi Pratap  <ravi@ximian.com>
18211
18212         * expression.cs (everywhere): Comment out return statements in ::Resolve
18213         methods to avoid the warnings.
18214
18215 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
18216
18217         * driver.cs (parse): Report error 2001 if we can not open the
18218         source file.
18219
18220         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
18221         not resolve it.
18222
18223         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
18224         object. 
18225
18226         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
18227         otherwise nested blocks end up with the same index.
18228
18229         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
18230
18231         * expression.cs:  Instead of having FIXMEs in the Resolve
18232         functions, throw exceptions so it is obvious that we are facing a
18233         bug. 
18234
18235         * cs-parser.jay (invocation_expression): Pass Location information.
18236
18237         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
18238         Use a basename for those routines because .NET does not like paths
18239         on them. 
18240
18241         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
18242         already defined.
18243
18244 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
18245
18246         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
18247         are loading the correct data types (throws an exception if not).
18248         (TypeManager::InitCoreTypes): Use CoreLookupType
18249
18250         * expression.cs (Unary::ResolveOperator): return the child
18251         expression for expressions which are just +expr.
18252         (Unary::ResolveOperator): Return negative literals for -LITERAL
18253         expressions (otherwise they are Unary {Literal}).
18254         (Invocation::Badness): Take into account `Implicit constant
18255         expression conversions'.
18256
18257         * literal.cs (LongLiteral): Implement long literal class.
18258         (IntLiteral): export the `Value' of the intliteral. 
18259
18260 2001-09-19  Ravi Pratap  <ravi@ximian.com>
18261
18262         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
18263
18264         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
18265         instead of 'Operator'
18266
18267         * expression.cs (Binary::ResolveOperator): Update accordingly.
18268         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
18269         and 'Minus'
18270
18271         * cs-parser.jay (unary_expression): Update to use the new names.
18272
18273         * gen-treedump.cs (GetUnary): Same here.
18274
18275         * expression.cs (Unary::Resolve): Implement.
18276         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
18277         operators are found instead of making noise ;-)
18278         (Unary::ResolveOperator): New method to do precisely the same thing which
18279         Binary::ResolveOperator does for Binary expressions.
18280         (Unary.method, .Arguments): Add.
18281         (Unary::OperName): Implement.   
18282         (Unary::ForceConversion): Copy and Paste !
18283
18284         * class.cs (Operator::Define): Fix a small bug for the case when we have 
18285         a unary operator.
18286
18287         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
18288         for the inbuilt operators. Only overloading works for now ;-)
18289
18290 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
18291
18292         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
18293         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
18294
18295         * expression.cs (This::Emit): Implement. 
18296         (This::Resolve): Implement.
18297         (TypeOf:Resolve): Implement.
18298         (Expression::ResolveSimpleName): Add an implicit this to instance
18299         field references. 
18300         (MemberAccess::Resolve): Deal with Parameters and Fields. 
18301         Bind instance variable to Field expressions.
18302         (FieldExpr::Instance): New field used to track the expression that
18303         represents the object instance.
18304         (FieldExpr::Resolve): Track potential errors from MemberLookup not
18305         binding 
18306         (FieldExpr::Emit): Implement.
18307
18308         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
18309         the last instruction contains a return opcode to avoid generating
18310         the last `ret' instruction (this generates correct code, and it is
18311         nice to pass the peverify output).
18312
18313         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
18314         initializer for static and instance variables.
18315         (Constructor::Emit): Allow initializer to be null in the case of
18316         static constructors.  Only emit initializer for instance
18317         constructors. 
18318
18319         (TypeContainer::FindMembers): Return a null array if there are no
18320         matches.
18321
18322         Also fix the code for the MemberTypes.Method branch, as it was not
18323         scanning that for operators (or tried to access null variables before).
18324
18325         * assign.cs (Assign::Emit): Handle instance and static fields. 
18326
18327         * TODO: Updated.
18328
18329         * driver.cs: Stop compilation if there are parse errors.
18330
18331         * cs-parser.jay (constructor_declaration): Provide default base
18332         initializer for non-static constructors.
18333         (constructor_declarator): Do not provide a default base
18334         initializers if none was specified.
18335         Catch the fact that constructors should not have parameters.
18336
18337         * class.cs: Do not emit parent class initializers for static
18338         constructors, that should be flagged as an error.
18339
18340 2001-09-18  Ravi Pratap  <ravi@ximian.com>
18341
18342         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
18343         Move back code into TypeContainer::Populate.
18344
18345 2001-09-18  Ravi Pratap  <ravi@ximian.com>
18346
18347         * class.cs (TypeContainer::AddConstructor): Fix the check to
18348         compare against Name, not Basename. 
18349         (Operator::OpType): Change Plus and Minus to Add and Subtract.
18350
18351         * cs-parser.jay : Update accordingly.
18352
18353         * class.cs (TypeContainer::FindMembers): For the case where we are searching
18354         for methods, don't forget to look into the operators too.
18355         (RegisterMethodBuilder): Helper method to take care of this for
18356         methods, constructors and operators.
18357         (Operator::Define): Completely revamp.
18358         (Operator.OperatorMethod, MethodName): New fields.
18359         (TypeContainer::Populate): Move the registering of builders into
18360         RegisterMethodBuilder.
18361         (Operator::Emit): Re-write.
18362
18363         * expression.cs (Binary::Emit): Comment out code path to emit method
18364         invocation stuff for the case when we have a user defined operator. I am
18365         just not able to get it right !
18366
18367 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
18368
18369         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
18370         argument. 
18371
18372         (Expression::MemberLookup): Provide a version that allows to
18373         specify the MemberTypes and BindingFlags. 
18374
18375         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
18376         so it was not fetching variable information from outer blocks.
18377
18378         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
18379         Beforefieldinit as it was buggy.
18380
18381         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
18382         that Ravi put here.  
18383
18384         * class.cs (Constructor::Emit): Only emit if block is not null.
18385         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
18386         deal with this by semantically definining it as if the user had
18387         done it.
18388
18389         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
18390         constructors as we now "emit" them at a higher level.
18391
18392         (TypeContainer::DefineDefaultConstructor): Used to define the
18393         default constructors if none was provided.
18394
18395         (ConstructorInitializer): Add methods Resolve and Emit. 
18396
18397         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
18398
18399 2001-09-17  Ravi Pratap  <ravi@ximian.com>
18400
18401         * class.cs (TypeContainer::EmitDefaultConstructor): Register
18402         the default constructor builder with our hashtable for methodbuilders
18403         to methodcores.
18404
18405         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
18406         and argument_count is 0 in which case we have a match.
18407         (Binary::ResolveOperator): More null checking and miscellaneous coding
18408         style cleanup.
18409
18410 2001-09-17  Ravi Pratap  <ravi@ximian.com>
18411
18412         * rootcontext.cs (IsNameSpace): Compare against null.
18413
18414         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
18415
18416         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
18417         and Unary::Operator.
18418
18419         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
18420         accordingly.
18421
18422         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
18423         we have overloaded operators.
18424         (Binary::ResolveOperator): Implement the part which does the operator overload
18425         resolution.
18426
18427         * class.cs (Operator::Emit): Implement.
18428         (TypeContainer::Emit): Emit the operators we have too.
18429
18430         * expression.cs (Binary::Emit): Update to emit the appropriate code for
18431         the case when we have a user-defined operator.
18432
18433 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
18434
18435         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
18436
18437 2001-09-16  Ravi Pratap  <ravi@ximian.com>
18438
18439         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
18440         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
18441         (Constructor::Emit): Implement.
18442         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
18443         if we have no work to do. 
18444         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
18445         Emit method.
18446
18447         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
18448         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
18449
18450         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
18451         of parent.parent.
18452
18453 2001-09-15  Ravi Pratap  <ravi@ximian.com>
18454
18455         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
18456         in the source.
18457         (Tree::RecordNamespace): Method to do what the name says ;-)
18458         (Tree::Namespaces): Property to get at the namespaces hashtable.
18459
18460         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
18461         keep track.
18462
18463         * rootcontext.cs (IsNamespace): Fixed it :-)
18464
18465 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
18466
18467         * class.cs (TypeContainer::FindMembers): Add support for
18468         constructors. 
18469         (MethodCore): New class that encapsulates both the shared aspects
18470         of a Constructor and a Method.  
18471         (Method, Constructor): Factored pieces into MethodCore.
18472
18473         * driver.cs: Added --fatal which makes errors throw exceptions.
18474         Load System assembly as well as part of the standard library.
18475
18476         * report.cs: Allow throwing exceptions on errors for debugging.
18477
18478         * modifiers.cs: Do not use `parent', instead use the real type
18479         container to evaluate permission settings.
18480
18481         * class.cs: Put Ravi's patch back in.  He is right, and we will
18482         have to cope with the
18483
18484 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18485
18486         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
18487         FamORAssem, not FamANDAssem.
18488
18489 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
18490
18491         * driver.cs: Added --parse option that only parses its input files
18492         and terminates.
18493
18494         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
18495         incorrect.  IsTopLevel is not used to tell whether an object is
18496         root_types or not (that can be achieved by testing this ==
18497         root_types).  But to see if this is a top-level *class* (not
18498         necessarly our "toplevel" container). 
18499
18500 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18501
18502         * enum.cs (Enum::Define): Modify to call the Lookup method on the
18503         parent instead of a direct call to GetType.
18504
18505 2001-09-14  Ravi Pratap  <ravi@ximian.com>
18506
18507         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
18508         Modifiers.TypeAttr. This should just be a call to that method.
18509
18510         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
18511         object so that we can determine if we are top-level or not.
18512
18513         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
18514         TypeContainer too.
18515
18516         * enum.cs (Enum::Define): Ditto.
18517
18518         * modifiers.cs (FieldAttr): Re-write.
18519
18520         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
18521         (TypeContainer::HaveStaticConstructor): New property to provide access
18522         to precisely that info.
18523
18524         * modifiers.cs (MethodAttr): Re-write.
18525         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
18526
18527         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
18528         of top-level types as claimed.
18529
18530 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
18531
18532         * expression.cs (MemberLookup): Fruitless attempt to lookup
18533         constructors.  Maybe I need to emit default constructors?  That
18534         might be it (currently .NET emits this for me automatically).
18535         (Invocation::OverloadResolve): Cope with Arguments == null.
18536         (Invocation::EmitArguments): new function, shared by the new
18537         constructor and us.
18538         (Invocation::Emit): Handle static and instance methods.  Emit
18539         proper call instruction for virtual or non-virtual invocations.
18540         (New::Emit): Implement.
18541         (New::Resolve): Implement.
18542         (MemberAccess:Resolve): Implement.
18543         (MethodGroupExpr::InstanceExpression): used conforming to the spec
18544         to track instances.
18545         (FieldExpr::Resolve): Set type.
18546
18547         * support.cs: Handle empty arguments.
18548                 
18549         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
18550         SimpleLookup): Auxiliary routines to help parse a qualifier
18551         identifier.  
18552
18553         Update qualifier_identifier rule.
18554
18555         * codegen.cs: Removed debugging messages.
18556
18557         * class.cs: Make this a global thing, this acts just as a "key" to
18558         objects that we might have around.
18559
18560         (Populate): Only initialize method_builders_to_methods once.
18561
18562         * expression.cs (PropertyExpr): Initialize type from the
18563         PropertyType. 
18564
18565         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
18566         Resolve pattern.  Attempt to implicitly convert value to boolean.
18567         Emit code.
18568
18569         * expression.cs: Set the type for the int32/int32 argument case.
18570         (Binary::ResolveOperator): Set the return type to boolean for
18571         comparission operators
18572
18573         * typemanager.cs: Remove debugging print code.
18574
18575         (Invocation::Resolve): resolve type.
18576
18577         * class.cs: Allocate a MemberInfo of the correct size, as the code
18578         elsewhere depends on the test to reflect the correct contents.
18579
18580         (Method::) Keep track of parameters, due to System.Reflection holes
18581
18582         (TypeContainer::Populate): Keep track of MethodBuilders to Method
18583         mapping here.
18584
18585         (TypeContainer::FindMembers): Use ArrayList and then copy an array
18586         of the exact size and return that.
18587
18588         (Class::LookupMethodByBuilder): New function that maps
18589         MethodBuilders to its methods.  Required to locate the information
18590         on methods because System.Reflection bit us again.
18591
18592         * support.cs: New file, contains an interface ParameterData and
18593         two implementations: ReflectionParameters and InternalParameters
18594         used to access Parameter information.  We will need to grow this
18595         as required.
18596
18597         * expression.cs (Invocation::GetParameterData): implement a cache
18598         and a wrapper around the ParameterData creation for methods. 
18599         (Invocation::OverloadResolve): Use new code.
18600
18601 2001-09-13  Ravi Pratap  <ravi@ximian.com>
18602
18603         * class.cs (TypeContainer::EmitField): Remove and move into 
18604         (Field::Define): here and modify accordingly.
18605         (Field.FieldBuilder): New member.
18606         (TypeContainer::Populate): Update accordingly.
18607         (TypeContainer::FindMembers): Implement.
18608
18609 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
18610
18611         * statement.cs: (VariableInfo::VariableType): New field to be
18612         initialized with the full type once it is resolved. 
18613
18614 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
18615
18616         * parameter.cs (GetParameterInfo): Use a type cache to compute
18617         things only once, and to reuse this information
18618
18619         * expression.cs (LocalVariableReference::Emit): Implement.
18620         (OpcodeCast::Emit): fix.
18621
18622         (ParameterReference::Resolve): Implement.
18623         (ParameterReference::Emit): Implement.
18624
18625         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
18626         that are expressions need to stay as Expressions.
18627
18628         * typemanager.cs (CSharpName): Returns the C# name of a type if
18629         possible. 
18630
18631         * expression.cs (Expression::ConvertImplicit): New function that
18632         implements implicit type conversions.
18633
18634         (Expression::ImplicitReferenceConversion): Implements implicit
18635         reference conversions.
18636
18637         (EmptyCast): New type for transparent casts.
18638
18639         (OpcodeCast): New type for casts of types that are performed with
18640         a sequence of bytecodes.
18641
18642         (BoxedCast): New type used for casting value types into reference
18643         types.  Emits a box opcode.
18644
18645         (Binary::DoNumericPromotions): Implements numeric promotions of
18646         and computation of the Binary::Type.
18647
18648         (Binary::EmitBranchable): Optimization.
18649
18650         (Binary::Emit): Implement code emission for expressions.
18651
18652         * typemanager.cs (TypeManager): Added two new core types: sbyte
18653         and byte.
18654
18655 2001-09-12  Ravi Pratap  <ravi@ximian.com>
18656
18657         * class.cs (TypeContainer::FindMembers): Method which does exactly
18658         what Type.FindMembers does, only we don't have to use reflection. No
18659         implementation yet.
18660
18661         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
18662         typecontainer objects as we need to get at them.
18663         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
18664
18665         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
18666         typecontainer object.
18667
18668         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
18669         of just a Report object.
18670
18671 2001-09-11  Ravi Pratap  <ravi@ximian.com>
18672
18673         * class.cs (Event::Define): Go back to using the prefixes "add_" and
18674         "remove_"
18675         (TypeContainer::Populate): Now define the delegates of the type too.
18676         (TypeContainer.Delegates): Property to access the list of delegates defined
18677         in the type.
18678
18679         * delegates.cs (Delegate::Define): Implement partially.
18680
18681         * modifiers.cs (TypeAttr): Handle more flags.
18682
18683 2001-09-11  Ravi Pratap  <ravi@ximian.com>
18684
18685         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
18686         and not <=
18687         (Operator::Define): Re-write logic to get types by using the LookupType method
18688         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
18689         (Indexer::Define): Ditto.
18690         (Event::Define): Ditto.
18691         (Property::Define): Ditto.
18692
18693 2001-09-10  Ravi Pratap  <ravi@ximian.com>
18694
18695         * class.cs (TypeContainer::Populate): Now define operators too. 
18696         (TypeContainer.Operators): New property to access the list of operators
18697         in a type.
18698         (Operator.OperatorMethodBuilder): New member to hold the method builder
18699         for the operator we are defining.
18700         (Operator::Define): Implement.
18701
18702 2001-09-10  Ravi Pratap  <ravi@ximian.com>
18703
18704         * class.cs (Event::Define): Make the prefixes of the accessor methods
18705         addOn_ and removeOn_ 
18706
18707         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
18708         of the location being passed in too. Ideally, this should go later since all
18709         error reporting should be done through the Report object.
18710
18711         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
18712         (Populate): Iterate thru the indexers we have and define them too.
18713         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
18714         for the get and set accessors.
18715         (Indexer::Define): Implement.
18716
18717 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
18718
18719         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
18720         my previous implementation, did not work.
18721
18722         * typemanager.cs: Add a couple of missing types (the longs).
18723
18724         * literal.cs: Use TypeManager.bool_type instead of getting it.
18725
18726         * expression.cs (EventExpr): New kind of expressions.
18727         (Expressio::ExprClassFromMemberInfo): finish
18728
18729 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
18730
18731         * assign.cs: Emit stores to static fields differently.
18732
18733 2001-09-08  Ravi Pratap  <ravi@ximian.com>
18734
18735         * Merge in changes and adjust code to tackle conflicts. Backed out my
18736         code in Assign::Resolve ;-) 
18737
18738 2001-09-08  Ravi Pratap  <ravi@ximian.com>
18739
18740         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
18741         instead Report.Error and also pass in the location.
18742         (CSharpParser::Lexer): New readonly property to return the reference
18743         to the Tokenizer object.
18744         (declare_local_variables): Use Report.Error with location instead of plain 
18745         old error.
18746         (CheckDef): Ditto.
18747
18748         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
18749         (Operator.CheckBinaryOperator): Ditto.
18750
18751         * cs-parser.jay (operator_declarator): Update accordingly.
18752
18753         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
18754         (CheckBinaryOperator): Same here.
18755
18756         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
18757         on the name without any prefixes of namespace names etc. This is because we
18758         already might have something already fully qualified like 
18759         'System.Console.WriteLine'
18760
18761         * assign.cs (Resolve): Begin implementation. Stuck ;-)
18762
18763 2001-09-07  Ravi Pratap  <ravi@ximian.com>
18764
18765         * cs-tokenizer.cs (location): Return a string which also contains
18766         the file name.
18767
18768         * expression.cs (ElementAccess): New class for expressions of the
18769         type 'element access.'
18770         (BaseAccess): New class for expressions of the type 'base access.'
18771         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
18772         respectively.
18773
18774         * cs-parser.jay (element_access): Implement action.
18775         (base_access): Implement actions.
18776         (checked_expression, unchecked_expression): Implement.
18777
18778         * cs-parser.jay (local_variable_type): Correct and implement.
18779         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
18780
18781         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
18782
18783         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
18784         name and the specifiers.
18785
18786         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
18787
18788         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
18789         making them all public ;-)
18790
18791         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
18792         class anyways.
18793
18794 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
18795
18796         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
18797         PropertyExprs.
18798         (FieldExpr, PropertyExprs): New resolved expressions.
18799         (SimpleName::MemberStaticCheck): Perform static checks for access
18800         to non-static fields on static methods. Maybe this should be
18801         generalized for MemberAccesses. 
18802         (SimpleName::ResolveSimpleName): More work on simple name
18803         resolution. 
18804
18805         * cs-parser.jay (primary_expression/qualified_identifier): track
18806         the parameter index.
18807
18808         * codegen.cs (CodeGen::Save): Catch save exception, report error.
18809         (EmitContext::EmitBoolExpression): Chain to expression generation
18810         instead of temporary hack.
18811         (::EmitStatementExpression): Put generic expression code generation.
18812
18813         * assign.cs (Assign::Emit): Implement variable assignments to
18814         local variables, parameters and fields.
18815
18816 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
18817
18818         * statement.cs (Block::GetVariableInfo): New method, returns the
18819         VariableInfo for a variable name in a block.
18820         (Block::GetVariableType): Implement in terms of GetVariableInfo
18821
18822         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
18823         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
18824
18825 2001-09-06  Ravi Pratap  <ravi@ximian.com>
18826
18827         * cs-parser.jay (operator_declaration): Continue on my quest : update
18828         to take attributes argument.
18829         (event_declaration): Ditto.
18830         (enum_declaration): Ditto.
18831         (indexer_declaration): Ditto.
18832
18833         * class.cs (Operator::Operator): Update constructor accordingly.
18834         (Event::Event): Ditto.
18835
18836         * delegate.cs (Delegate::Delegate): Same here.
18837
18838         * enum.cs (Enum::Enum): Same here.
18839
18840 2001-09-05  Ravi Pratap  <ravi@ximian.com>
18841
18842         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
18843
18844         * ../tests/cs0658.cs : New file to demonstrate error 0658.
18845
18846         * attribute.cs (Attributes): New class to encapsulate all attributes which were
18847         being passed around as an arraylist.
18848         (Attributes::AddAttribute): Method to add attribute sections.
18849
18850         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
18851         (struct_declaration): Update accordingly.
18852         (constant_declaration): Update.
18853         (field_declaration): Update.
18854         (method_header): Update.
18855         (fixed_parameter): Update.
18856         (parameter_array): Ditto.
18857         (property_declaration): Ditto.
18858         (destructor_declaration): Ditto.
18859
18860         * class.cs (Struct::Struct): Update constructors accordingly.
18861         (Class::Class): Ditto.
18862         (Field::Field): Ditto.
18863         (Method::Method): Ditto.
18864         (Property::Property): Ditto.
18865         (TypeContainer::OptAttribute): update property's return type.
18866
18867         * interface.cs (Interface.opt_attributes): New member.
18868         (Interface::Interface): Update to take the extra Attributes argument.
18869
18870         * parameter.cs (Parameter::Parameter): Ditto.
18871
18872         * constant.cs (Constant::Constant): Ditto.
18873
18874         * interface.cs (InterfaceMemberBase): New OptAttributes field.
18875         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
18876         the attributes as a parameter.
18877         (InterfaceProperty): Update constructor call.
18878         (InterfaceEvent): Ditto.
18879         (InterfaceMethod): Ditto.
18880         (InterfaceIndexer): Ditto.
18881
18882         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
18883         pass the attributes too.
18884         (interface_event_declaration): Ditto.
18885         (interface_property_declaration): Ditto.
18886         (interface_method_declaration): Ditto.
18887         (interface_declaration): Ditto.
18888
18889 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
18890
18891         * class.cs (Method::Define): Track the "static Main" definition to
18892         create an entry point. 
18893
18894         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
18895         EntryPoint if we find it. 
18896
18897         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
18898         (EmitContext::ig): Make this variable public.
18899
18900         * driver.cs: Make the default output file be the first file name
18901         with the .exe extension.  
18902
18903         Detect empty compilations
18904
18905         Handle various kinds of output targets.  Handle --target and
18906         rename -t to --dumper.
18907
18908         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
18909         methods inherited from Expression return now an Expression.  This
18910         will is used during the tree rewriting as we resolve them during
18911         semantic analysis.
18912
18913         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
18914         the spec.  Missing entirely is the information about
18915         accessability of elements of it.
18916
18917         (Expression::ExprClassFromMemberInfo): New constructor for
18918         Expressions that creates a fully initialized Expression based on
18919         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
18920         a Type.
18921
18922         (Invocation::Resolve): Begin implementing resolution of invocations.
18923
18924         * literal.cs (StringLiteral):  Implement Emit.
18925
18926 2001-09-05  Ravi Pratap  <ravi@ximian.com>
18927
18928         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
18929         member.
18930
18931 2001-09-04  Ravi Pratap  <ravi@ximian.com>
18932
18933         * cs-parser.jay (attribute_arguments): Implement actions.
18934         (attribute): Fix bug in production. Implement action.
18935         (attribute_list): Implement.
18936         (attribute_target): Implement.
18937         (attribute_target_specifier, opt_target_specifier): Implement
18938         (CheckAttributeTarget): New method to check if the attribute target
18939         is valid.
18940         (attribute_section): Implement.
18941         (opt_attributes): Implement.
18942
18943         * attribute.cs : New file to handle attributes.
18944         (Attribute): Class to hold attribute info.
18945
18946         * cs-parser.jay (opt_attribute_target_specifier): Remove production
18947         (attribute_section): Modify production to use 2 different rules to 
18948         achieve the same thing. 1 s/r conflict down !
18949         Clean out commented, useless, non-reducing dimension_separator rules.
18950
18951         * class.cs (TypeContainer.attributes): New member to hold list
18952         of attributes for a type.
18953         (Struct::Struct): Modify to take one more argument, the attribute list.
18954         (Class::Class): Ditto.
18955         (Field::Field): Ditto.
18956         (Method::Method): Ditto.
18957         (Property::Property): Ditto.
18958
18959         * cs-parser.jay (struct_declaration): Update constructor call to
18960         pass in the attributes too.
18961         (class_declaration): Ditto.
18962         (constant_declaration): Ditto.
18963         (field_declaration): Ditto.
18964         (method_header): Ditto.
18965         (fixed_parameter): Ditto.
18966         (parameter_array): Ditto.
18967         (property_declaration): Ditto.
18968
18969         * constant.cs (Constant::Constant): Update constructor similarly.
18970         Use System.Collections.
18971
18972         * parameter.cs (Parameter::Parameter): Update as above.
18973
18974 2001-09-02  Ravi Pratap  <ravi@ximian.com>
18975
18976         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
18977         (TypeContainer.delegates): New member to hold list of delegates.
18978
18979         * cs-parser.jay (delegate_declaration): Implement the action correctly 
18980         this time as I seem to be on crack ;-)
18981
18982 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
18983
18984         * rootcontext.cs (RootContext::IsNamespace): new function, used to
18985         tell whether an identifier represents a namespace.
18986
18987         * expression.cs (NamespaceExpr): A namespace expression, used only
18988         temporarly during expression resolution.
18989         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
18990         utility functions to resolve names on expressions.
18991
18992 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
18993
18994         * codegen.cs: Add hook for StatementExpressions. 
18995
18996         * class.cs: Fix inverted test for static flag in methods.
18997
18998 2001-09-02  Ravi Pratap  <ravi@ximian.com>
18999
19000         * class.cs (Operator::CheckUnaryOperator): Correct error number used
19001         to make it coincide with MS' number.
19002         (Operator::CheckBinaryOperator): Ditto.
19003
19004         * ../errors/errors.txt : Remove error numbers added earlier.
19005
19006         * ../errors/cs1019.cs : Test case for error # 1019
19007
19008         * ../errros/cs1020.cs : Test case for error # 1020
19009
19010         * cs-parser.jay : Clean out commented cruft.
19011         (dimension_separators, dimension_separator): Comment out. Ostensibly not
19012         used anywhere - non-reducing rule.
19013         (namespace_declarations): Non-reducing rule - comment out.
19014
19015         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
19016         with TypeContainer::AddEnum.
19017
19018         * delegate.cs : New file for delegate handling classes.
19019         (Delegate): Class for declaring delegates.
19020
19021         * makefile : Update.
19022
19023         * cs-parser.jay (delegate_declaration): Implement.
19024
19025 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
19026
19027         * class.cs (Event::Define): Implement.
19028         (Event.EventBuilder): New member.
19029
19030         * class.cs (TypeContainer::Populate): Update to define all enums and events
19031         we have.
19032         (Events): New property for the events arraylist we hold. Shouldn't we move to using
19033         readonly fields for all these cases ?
19034
19035 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
19036
19037         * class.cs (Property): Revamp to use the convention of making fields readonly.
19038         Accordingly modify code elsewhere.
19039
19040         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
19041         the Define method of the Property class.
19042
19043         * class.cs : Clean up applied patch and update references to variables etc. Fix 
19044         trivial bug.
19045         (TypeContainer::Populate): Update to define all the properties we have. Also
19046         define all enumerations.
19047
19048         * enum.cs (Define): Implement.
19049
19050 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
19051
19052         * cs-parser.jay (overloadable_operator): The semantic value is an
19053         enum of the Operator class.
19054         (operator_declarator): Implement actions.
19055         (operator_declaration): Implement.
19056
19057         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
19058         validity of definitions.
19059         (Operator::CheckBinaryOperator): Static method to check for binary operators
19060         (TypeContainer::AddOperator): New method to add an operator to a type.
19061
19062         * cs-parser.jay (indexer_declaration): Added line to actually call the
19063         AddIndexer method so it gets added ;-)
19064
19065         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
19066         already taken care of by the MS compiler ?  
19067
19068 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
19069
19070         * class.cs (Operator): New class for operator declarations.
19071         (Operator::OpType): Enum for the various operators.
19072
19073 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
19074
19075         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
19076         ostensibly handle this in semantic analysis.
19077
19078         * cs-parser.jay (general_catch_clause): Comment out
19079         (specific_catch_clauses, specific_catch_clause): Ditto.
19080         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
19081         (catch_args, opt_catch_args): New productions.
19082         (catch_clause): Rewrite to use the new productions above
19083         (catch_clauses): Modify accordingly.
19084         (opt_catch_clauses): New production to use in try_statement
19085         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
19086         and re-write the code in the actions to extract the specific and
19087         general catch clauses by being a little smart ;-)
19088
19089         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
19090         Hooray, try and catch statements parse fine !
19091
19092 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19093
19094         * statement.cs (Block::GetVariableType): Fix logic to extract the type
19095         string from the hashtable of variables.
19096
19097         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
19098         I end up making that mistake ;-)
19099         (catch_clauses): Fixed gross error which made Key and Value of the 
19100         DictionaryEntry the same : $1 !!
19101
19102 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19103
19104         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
19105
19106         * cs-parser.jay (event_declaration): Correct to remove the semicolon
19107         when the add and remove accessors are specified. 
19108
19109 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19110
19111         * cs-parser.jay (IndexerDeclaration): New helper class to hold
19112         information about indexer_declarator.
19113         (indexer_declarator): Implement actions.
19114         (parsing_indexer): New local boolean used to keep track of whether
19115         we are parsing indexers or properties. This is necessary because 
19116         implicit_parameters come into picture even for the get accessor in the 
19117         case of an indexer.
19118         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
19119
19120         * class.cs (Indexer): New class for indexer declarations.
19121         (TypeContainer::AddIndexer): New method to add an indexer to a type.
19122         (TypeContainer::indexers): New member to hold list of indexers for the
19123         type.
19124
19125 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
19126
19127         * cs-parser.jay (add_accessor_declaration): Implement action.
19128         (remove_accessor_declaration): Implement action.
19129         (event_accessors_declaration): Implement
19130         (variable_declarators): swap statements for first rule - trivial.
19131
19132         * class.cs (Event): New class to hold information about event
19133         declarations.
19134         (TypeContainer::AddEvent): New method to add an event to a type
19135         (TypeContainer::events): New member to hold list of events.
19136
19137         * cs-parser.jay (event_declaration): Implement actions.
19138
19139 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
19140
19141         * cs-parser.jay (dim_separators): Implement. Make it a string
19142         concatenating all the commas together, just as they appear.
19143         (opt_dim_separators): Modify accordingly
19144         (rank_specifiers): Update accordingly. Basically do the same
19145         thing - instead, collect the brackets here.
19146         (opt_rank_sepcifiers): Modify accordingly.
19147         (array_type): Modify to actually return the complete type string
19148         instead of ignoring the rank_specifiers.
19149         (expression_list): Implement to collect the expressions
19150         (variable_initializer): Implement. We make it a list of expressions
19151         essentially so that we can handle the array_initializer case neatly too.
19152         (variable_initializer_list): Implement.
19153         (array_initializer): Make it a list of variable_initializers
19154         (opt_array_initializer): Modify accordingly.
19155
19156         * expression.cs (New::NType): Add enumeration to help us
19157         keep track of whether we have an object/delegate creation
19158         or an array creation.
19159         (New:NewType, New::Rank, New::Indices, New::Initializers): New
19160         members to hold data about array creation.
19161         (New:New): Modify to update NewType
19162         (New:New): New Overloaded contructor for the array creation
19163         case.
19164
19165         * cs-parser.jay (array_creation_expression): Implement to call
19166         the overloaded New constructor.
19167
19168 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
19169
19170         * class.cs (TypeContainer::Constructors): Return member
19171         constructors instead of returning null.
19172
19173 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
19174
19175         * typemanager.cs (InitCoreTypes): Initialize the various core
19176         types after we have populated the type manager with the user
19177         defined types (this distinction will be important later while
19178         compiling corlib.dll)
19179
19180         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
19181         on Expression Classification.  Now all expressions have a method
19182         `Resolve' and a method `Emit'.
19183
19184         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
19185         generation from working.     Also add some temporary debugging
19186         code. 
19187
19188 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
19189
19190         * codegen.cs: Lots of code generation pieces.  This is only the
19191         beginning, will continue tomorrow with more touches of polish.  We
19192         handle the fundamentals of if, while, do, for, return.  Others are
19193         trickier and I need to start working on invocations soon.
19194
19195         * gen-treedump.cs: Bug fix, use s.Increment here instead of
19196         s.InitStatement. 
19197
19198         * codegen.cs (EmitContext): New struct, used during code
19199         emission to keep a context.   Most of the code generation will be
19200         here. 
19201
19202         * cs-parser.jay: Add embedded blocks to the list of statements of
19203         this block.  So code generation proceeds in a top down fashion.
19204
19205 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
19206
19207         * statement.cs: Add support for multiple child blocks.
19208
19209 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
19210
19211         * codegen.cs (EmitCode): New function, will emit the code for a
19212         Block of code given a TypeContainer and its ILGenerator. 
19213
19214         * statement.cs (Block): Standard public readonly optimization.
19215         (Block::Block constructors): Link children. 
19216         (Block::Child): Child Linker.
19217         (Block::EmitVariables): Emits IL variable declarations.
19218
19219         * class.cs: Drop support for MethodGroups here, delay until
19220         Semantic Analysis.
19221         (Method::): Applied the same simplification that I did before, and
19222         move from Properties to public readonly fields.
19223         (Method::ParameterTypes): Returns the parameter types for the
19224         function, and implements a cache that will be useful later when I
19225         do error checking and the semantic analysis on the methods is
19226         performed.
19227         (Constructor::GetCallingConvention): Renamed from CallingConvetion
19228         and made a method, optional argument tells whether this is a class
19229         or a structure to apply the `has-this' bit.
19230         (Method::GetCallingConvention): Implement, returns the calling
19231         convention. 
19232         (Method::Define): Defines the type, a second pass is performed
19233         later to populate the methods.
19234
19235         (Constructor::ParameterTypes): implement a cache similar to the
19236         one on Method::ParameterTypes, useful later when we do semantic
19237         analysis. 
19238
19239         (TypeContainer::EmitMethod):  New method.  Emits methods.
19240
19241         * expression.cs: Removed MethodGroup class from here.
19242
19243         * parameter.cs (Parameters::GetCallingConvention): new method.
19244
19245 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
19246
19247         * class.cs (TypeContainer::Populate): Drop RootContext from the
19248         argument. 
19249
19250         (Constructor::CallingConvention): Returns the calling convention.
19251         (Constructor::ParameterTypes): Returns the constructor parameter
19252         types. 
19253
19254         (TypeContainer::AddConstructor): Keep track of default constructor
19255         and the default static constructor.
19256
19257         (Constructor::) Another class that starts using `public readonly'
19258         instead of properties. 
19259
19260         (Constructor::IsDefault): Whether this is a default constructor. 
19261
19262         (Field::) use readonly public fields instead of properties also.
19263
19264         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
19265         track of static constructors;  If none is used, turn on
19266         BeforeFieldInit in the TypeAttributes. 
19267
19268         * cs-parser.jay (opt_argument_list): now the return can be null
19269         for the cases where there are no arguments. 
19270
19271         (constructor_declarator): If there is no implicit `base' or
19272         `this', then invoke the default parent constructor. 
19273
19274         * modifiers.cs (MethodAttr): New static function maps a set of
19275         modifiers flags into a MethodAttributes enum
19276         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
19277         MethodAttr, TypeAttr to represent the various mappings where the
19278         modifiers are used.
19279         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
19280
19281 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
19282
19283         * parameter.cs (GetParameterInfo): Fix bug where there would be no
19284         method arguments.
19285
19286         * interface.cs (PopulateIndexer): Implemented the code generator
19287         for interface indexers.
19288
19289 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
19290
19291         * interface.cs (InterfaceMemberBase): Now we track the new status
19292         here.  
19293
19294         (PopulateProperty): Implement property population.  Woohoo!  Got
19295         Methods and Properties going today. 
19296
19297         Removed all the properties for interfaces, and replaced them with
19298         `public readonly' fields. 
19299
19300 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
19301
19302         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
19303         initialize their hashtables/arraylists only when they are needed
19304         instead of doing this always.
19305
19306         * parameter.cs: Handle refs and out parameters.
19307
19308         * cs-parser.jay: Use an ArrayList to construct the arguments
19309         instead of the ParameterCollection, and then cast that to a
19310         Parameter[] array.
19311
19312         * parameter.cs: Drop the use of ParameterCollection and use
19313         instead arrays of Parameters.
19314
19315         (GetParameterInfo): Use the Type, not the Name when resolving
19316         types. 
19317
19318 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
19319
19320         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
19321         and instead use public readonly fields.
19322
19323         * class.cs: Put back walking code for type containers.
19324
19325 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
19326
19327         * class.cs (MakeConstant): Code to define constants.
19328
19329         * rootcontext.cs (LookupType): New function.  Used to locate types 
19330
19331
19332 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
19333
19334         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
19335         this System.Reflection code is.  Kudos to Microsoft
19336
19337         * typemanager.cs: Implement a type cache and avoid loading all
19338         types at boot time.  Wrap in LookupType the internals.  This made
19339         the compiler so much faster.  Wow.  I rule!
19340
19341         * driver.cs: Make sure we always load mscorlib first (for
19342         debugging purposes, nothing really important).
19343
19344         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
19345         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
19346
19347         * rootcontext.cs: Lookup types on their namespace;  Lookup types
19348         on namespaces that have been imported using the `using' keyword.
19349
19350         * class.cs (TypeContainer::TypeAttr): Virtualize.
19351         (Class::TypeAttr): Return attributes suitable for this bad boy.
19352         (Struct::TypeAttr): ditto.
19353         Handle nested classes.
19354         (TypeContainer::) Remove all the type visiting code, it is now
19355         replaced with the rootcontext.cs code
19356
19357         * rootcontext.cs (GetClassBases): Added support for structs. 
19358
19359 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
19360
19361         * interface.cs, statement.cs, class.cs, parameter.cs,
19362         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
19363         Drop use of TypeRefs, and use strings instead.
19364
19365 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
19366
19367         * rootcontext.cs: 
19368
19369         * class.cs (Struct::Struct): set the SEALED flags after
19370         checking the modifiers.
19371         (TypeContainer::TypeAttr): new property, returns the
19372         TypeAttributes for a class.  
19373
19374         * cs-parser.jay (type_list): Oops, list production was creating a
19375         new list of base types.
19376
19377         * rootcontext.cs (StdLib): New property.
19378         (GetInterfaceTypeByName): returns an interface by type name, and
19379         encapsulates error handling here.
19380         (GetInterfaces): simplified.
19381         (ResolveTree): Encapsulated all the tree resolution here.
19382         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
19383         types. 
19384
19385         * driver.cs: Add support for --nostdlib, to avoid loading the
19386         default assemblies.
19387         (Main): Do not put tree resolution here. 
19388
19389         * rootcontext.cs: Beginning of the class resolution.
19390
19391 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
19392
19393         * rootcontext.cs: Provide better error reporting. 
19394
19395         * cs-parser.jay (interface_base): set our $$ to be interfaces.
19396
19397         * rootcontext.cs (CreateInterface): Handle the case where there
19398         are no parent interfaces.
19399
19400         (CloseTypes): Routine to flush types at the end.
19401         (CreateInterface): Track types.
19402         (GetInterfaces): Returns an array of Types from the list of
19403         defined interfaces.
19404
19405         * typemanager.c (AddUserType): Mechanism to track user types (puts
19406         the type on the global type hash, and allows us to close it at the
19407         end). 
19408
19409 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
19410
19411         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
19412         RecordInterface instead.
19413
19414         * cs-parser.jay: Updated to reflect changes above.
19415
19416         * decl.cs (Definition): Keep track of the TypeBuilder type that
19417         represents this type here.  Not sure we will use it in the long
19418         run, but wont hurt for now.
19419
19420         * driver.cs: Smaller changes to accomodate the new code.
19421
19422         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
19423         when done. 
19424
19425         * rootcontext.cs (CreateInterface):  New method, used to create
19426         the System.TypeBuilder type for interfaces.
19427         (ResolveInterfaces): new entry point to resolve the interface
19428         hierarchy. 
19429         (CodeGen): Property, used to keep track of the code generator.
19430
19431 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
19432
19433         * cs-parser.jay: Add a second production for delegate_declaration
19434         with `VOID'.
19435
19436         (enum_body): Put an opt_comma here instead of putting it on
19437         enum_body or enum_member_declarations so we can handle trailing
19438         commas on enumeration members.  Gets rid of a shift/reduce.
19439
19440         (type_list): Need a COMMA in the middle.
19441
19442         (indexer_declaration): Tell tokenizer to recognize get/set
19443
19444         * Remove old targets.
19445
19446         * Re-add the parser target.
19447
19448 2001-07-13  Simon Cozens <simon@simon-cozens.org>
19449
19450         * cs-parser.jay: Add precendence rules for a number of operators
19451         ot reduce the number of shift/reduce conflicts in the grammar.
19452
19453 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
19454
19455         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
19456         and put it here.
19457
19458         Get rid of old crufty code.
19459
19460         * rootcontext.cs: Use this to keep track of the parsed
19461         representation and the defined types available to the program. 
19462
19463         * gen-treedump.cs: adjust for new convention.
19464
19465         * type.cs: Split out the type manager, and the assembly builder
19466         from here. 
19467
19468         * typemanager.cs: the type manager will live here now.
19469
19470         * cil-codegen.cs: And the code generator here. 
19471
19472 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
19473
19474         * makefile: Fixed up for easy making.
19475
19476 2001-07-13  Simon Cozens <simon@simon-cozens.org>
19477
19478         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
19479         the 
19480
19481         (unary_expression): Expand pre_increment_expression and
19482         post_decrement_expression to reduce a shift/reduce.
19483
19484 2001-07-11  Simon Cozens
19485
19486         * cs-tokenizer.cs: Hex numbers should begin with a 0.
19487
19488         Improve allow_keyword_as_indent name.
19489
19490 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
19491
19492         * Adjustments for Beta2. 
19493
19494 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
19495
19496         * decl.cs: Added `Define' abstract method.
19497         (InTransit): new property, used to catch recursive definitions. 
19498
19499         * interface.cs: Implement `Define'. 
19500
19501         * modifiers.cs: Map Modifiers.constants to
19502         System.Reflection.TypeAttribute flags.
19503
19504         * class.cs: Keep track of types and user-defined types.
19505         (BuilderInit): New method for creating an assembly
19506         (ResolveType): New function to launch the resolution process, only
19507         used by interfaces for now.
19508
19509         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
19510         that are inserted into the name space. 
19511
19512 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
19513
19514         * ARGH.  I have screwed up my tree so many times due to the use of
19515         rsync rather than using CVS.  Going to fix this at once. 
19516
19517         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
19518         load types.
19519
19520 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
19521
19522         * Experiment successful: Use System.Type rather that our own
19523         version of Type.  
19524
19525 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
19526
19527         * cs-parser.jay: Removed nsAliases from here.
19528
19529         Use new namespaces, handle `using XXX;' 
19530
19531         * namespace.cs: Reimplemented namespace handling, use a recursive
19532         definition of the class.  Now we can keep track of using clauses
19533         and catch invalid using clauses.
19534
19535 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
19536
19537         * gen-treedump.cs: Adapted for all the renaming.
19538
19539         * expression.cs (Expression): this class now has a Type property
19540         which returns an expression Type.
19541
19542         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
19543         `Type', as this has a different meaning now in the base
19544
19545 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
19546
19547         * interface.cs, class.cs: Removed from all the sources the
19548         references to signature computation, as we can not do method
19549         signature computation during the parsing time, as we are not
19550         trying to solve at that point distinguishing:
19551
19552         class X {
19553                 void a (Blah x) {}
19554                 void a (NS.Blah x) {}
19555         }
19556
19557         Which depending on the context might be valid or not, as we do not
19558         know if Blah is the same thing as NS.Blah at that point.
19559
19560         * Redid everything so the code uses TypeRefs now instead of
19561         Types.  TypeRefs are just temporary type placeholders, that need
19562         to be resolved.  They initially have a pointer to a string and the
19563         current scope in which they are used.  This is used later by the
19564         compiler to resolve the reference to an actual Type. 
19565
19566         * DeclSpace is no longer a CIR.Type, and neither are
19567         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
19568         are all DeclSpaces, but no Types. 
19569
19570         * type.cs (TypeRefManager): This implements the TypeRef manager,
19571         which keeps track of all the types that need to be resolved after
19572         the parsing has finished. 
19573
19574 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
19575
19576         * ARGH.  We are going to have to store `foreach' as a class rather
19577         than resolving it, as we need to verify error 1579 after name
19578         resolution.   *OR* we could keep a flag that says `This request to
19579         IEnumerator comes from a foreach statement' which we can then use
19580         to generate the error.
19581
19582 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
19583
19584         * class.cs (TypeContainer.AddMethod): we now add methods to the
19585         MethodGroup instead of the method hashtable.  
19586
19587         * expression.cs: Add MethodGroup abstraction, which gets us one
19588         step closer to the specification in the way we handle method
19589         declarations.  
19590
19591         * cs-parser.jay (primary_expression): qualified_identifier now
19592         tried to match up an identifier to a local variable reference or
19593         to a parameter reference.
19594
19595         current_local_parameters is now a parser global variable that
19596         points to the current parameters for the block, used during name
19597         lookup.
19598
19599         (property_declaration): Now creates an implicit `value' argument to
19600         the set accessor.
19601
19602 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
19603
19604         * parameter.cs: Do not use `param' arguments as part of the
19605         signature, per the spec.
19606
19607 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
19608
19609         * decl.cs: Base class for classes, structs and interfaces.  This
19610         is the "Declaration Space" 
19611
19612         * cs-parser.jay: Use CheckDef for checking declaration errors
19613         instead of having one on each function.
19614
19615         * class.cs: Factor out some code for handling error handling in
19616         accordance to the "Declarations" section in the "Basic Concepts"
19617         chapter in the ECMA C# spec.
19618
19619         * interface.cs: Make all interface member classes derive from
19620         InterfaceMemberBase.
19621
19622 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
19623
19624         * Many things: all interfaces are parsed and generated in
19625         gen-treedump.  Support for member variables, constructors,
19626         destructors, properties, constants is there.
19627
19628         Beginning of the IL backend, but very little done, just there for
19629         testing purposes. 
19630
19631 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
19632
19633         * cs-parser.jay: Fix labeled statement.
19634
19635         * cs-tokenizer.cs (escape): Escape " and ' always.
19636         ref_line, ref_name: keep track of the line/filename as instructed
19637         by #line by the compiler.
19638         Parse #line.
19639
19640 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
19641
19642         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
19643         to match the values in System.CodeDOM.
19644
19645         Divid renamed to Divide.
19646
19647         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
19648         statements. 
19649         (Statements.set): remove.
19650
19651         * System.CodeDOM/CodeCatchClause.cs: always have a valid
19652         statements. 
19653
19654         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
19655         falseStatements always have valid values. 
19656
19657         * cs-parser.jay: Use System.CodeDOM now.
19658