*** empty log message ***
[mono.git] / mcs / mcs / ChangeLog
index 3947a61b08dc20072f180de81f58a8500db40ac3..b16f45b5c554dda79fc5fa5fafe180a8972c6288 100755 (executable)
@@ -1,3 +1,541 @@
+2001-10-02  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs (TypeOf::Emit): Implement.
+
+       * typemanager.cs: runtime_handle_type, new global type.
+
+       * class.cs (Property::Emit): Generate code for properties.
+
+2001-10-02  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (Unary::ResolveOperator): Find operators on base type
+       too - we now conform exactly to the spec.
+
+       (Binary::ResolveOperator): Same here.
+
+       * class.cs (Operator::Define): Fix minor quirk in the tests.
+
+       * ../errors/cs0215.cs : Added.
+
+       * ../errors/cs0556.cs : Added.
+
+       * ../errors/cs0555.cs : Added.
+
+2001-10-01  Miguel de Icaza  <miguel@ximian.com>
+
+       * cs-tokenizer.cs: Reimplemented Location to be a struct with a
+       single integer which is really efficient
+
+2001-10-01  Ravi Pratap  <ravi@ximian.com>
+
+       *  expression.cs (Expression::ImplicitUserConversion): Use location
+        even in the case when we are examining True operators.
+        * class.cs (Operator::Define): Perform extensive checks to conform
+        with the rules for operator overloading in the spec.
+
+       * expression.cs (Expression::ImplicitReferenceConversion): Implement
+       some of the other conversions mentioned in the spec.
+
+       * typemanager.cs (array_type): New static member for the System.Array built-in
+       type.
+
+       (cloneable_interface): For System.ICloneable interface.
+
+       * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
+       we start resolving the tree and populating types.
+
+       * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
+2001-10-01  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs (Expression::ExprClassFromMemberInfo,
+       Expression::Literalize): Create literal expressions from
+       FieldInfos which are literals.
+
+       (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
+       type casts, because they were wrong.  The test suite in tests
+       caught these ones.
+
+       (ImplicitNumericConversion): ushort to ulong requires a widening
+       cast. 
+
+       Int32 constant to long requires widening cast as well.
+
+       * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
+       for integers because the type on the stack is not i4.
+
+2001-09-30  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs (report118): require location argument. 
+
+       * parameter.cs: Do not dereference potential null value.
+
+       * class.cs: Catch methods that lack the `new' keyword when
+       overriding a name.  Report warnings when `new' is used without
+       anything being there to override.
+
+       * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
+
+       * class.cs: Only add constructor to hashtable if it is non-null
+       (as now constructors can fail on define).
+
+       (TypeManager, Class, Struct): Take location arguments.
+
+       Catch field instance initialization in structs as errors.
+
+       accepting_filter: a new filter for FindMembers that is static so
+       that we dont create an instance per invocation.
+
+       (Constructor::Define): Catch errors where a struct constructor is
+       parameterless 
+
+       * cs-parser.jay: Pass location information for various new
+       constructs. 
+       
+       * delegate.cs (Delegate): take a location argument.
+
+       * driver.cs: Do not call EmitCode if there were problesm in the
+       Definition of the types, as many Builders wont be there. 
+
+       * decl.cs (Decl::Decl): Require a location argument.
+
+       * cs-tokenizer.cs: Handle properly hex constants that can not fit
+       into integers, and find the most appropiate integer for it.
+
+       * literal.cs: Implement ULongLiteral.
+
+       * rootcontext.cs: Provide better information about the location of
+       failure when CreateType fails.
+       
+2001-09-29  Miguel de Icaza  <miguel@ximian.com>
+
+       * rootcontext.cs (RootContext::PopulateTypes): Populates structs
+       as well.
+
+       * expression.cs (Binary::CheckShiftArguments): Add missing type
+       computation.
+       (Binary::ResolveOperator): Add type to the logical and and logical
+       or, Bitwise And/Or and Exclusive Or code paths, it was missing
+       before.
+
+       (Binary::DoNumericPromotions): In the case where either argument
+       is ulong (and most signed types combined with ulong cause an
+       error) perform implicit integer constant conversions as well.
+
+2001-09-28  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs (UserImplicitCast): Method should always be
+       non-null. 
+       (Invocation::BetterConversion): Simplified test for IntLiteral.
+
+       (Expression::ImplicitNumericConversion): Split this routine out.
+       Put the code that performs implicit constant integer conversions
+       here. 
+
+       (Expression::Resolve): Become a wrapper around DoResolve so we can
+       check eclass and type being set after resolve.
+
+       (Invocation::Badness): Remove this dead function
+
+       (Binary::ResolveOperator): Do not compute the expensive argumnets
+       unless we have a union for it.
+
+       (Probe::Emit): Is needs to do an isinst and then
+       compare against null.
+
+       (::CanConvert): Added Location argument.  If the Location argument
+       is null (Location.Null), then we do not report errors.  This is
+       used by the `probe' mechanism of the Explicit conversion.  We do
+       not want to generate an error for something that the user
+       explicitly requested to be casted.  But the pipeline for an
+       explicit cast first tests for potential implicit casts.
+
+       So for now, if the Location is null, it means `Probe only' to
+       avoid adding another argument.   Might have to revise this
+       strategy later.
+
+       (ClassCast): New class used to type cast objects into arbitrary
+       classes (used in Explicit Reference Conversions).
+
+       Implement `as' as well.
+
+       Reverted all the patches from Ravi below: they were broken:
+
+               * The use of `level' as a mechanism to stop recursive
+                 invocations is wrong.  That was there just to catch the
+                 bug with a strack trace but not as a way of addressing
+                 the problem.
+
+                 To fix the problem we have to *understand* what is going
+                 on and the interactions and come up with a plan, not
+                 just get things going.
+
+               * The use of the type conversion cache that I proposed
+                 last night had an open topic: How does this work across
+                 protection domains.  A user defined conversion might not
+                 be public in the location where we are applying the
+                 conversion, a different conversion might be selected
+                 (ie, private A->B (better) but public B->A (worse),
+                 inside A, A->B applies, but outside it, B->A will
+                 apply).
+
+               * On top of that (ie, even if the above is solved),
+                 conversions in a cache need to be abstract.  Ie, `To
+                 convert from an Int to a Short use an OpcodeCast', not
+                 `To convert from an Int to a Short use the OpcodeCast on
+                 the variable 5' (which is what this patch was doing).
+       
+2001-09-28  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (Invocation::ConversionExists): Re-write to use
+       the conversion cache
+       
+       (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
+       cache all conversions done, not just user-defined ones.
+
+       (Invocation::BetterConversion): The real culprit. Use ConversionExists
+       to determine if a conversion exists instead of acutually trying to 
+       perform the conversion. It's faster too.
+
+       (Expression::ConvertExplicit): Modify to use ConversionExists to check
+       and only then attempt the implicit conversion.
+
+2001-09-28  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (ConvertImplicit): Use a cache for conversions
+       already found. Check level of recursion and bail out if necessary.
+       
+2001-09-28  Miguel de Icaza  <miguel@ximian.com>
+
+       * typemanager.cs (string_concat_string_string, string_concat_object_object):
+       Export standard methods that we expect for string operations.
+       
+       * statement.cs (Block::UsageWarning): Track usage of variables and
+       report the errors for not used variables.
+
+       * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
+       operator. 
+
+2001-09-27  Miguel de Icaza  <miguel@ximian.com>
+
+       * codegen.cs: remove unnneded code 
+
+       * expression.cs: Removed BuiltinTypeAccess class
+
+       Fix the order in which implicit conversions are
+       done.  
+
+       The previous fixed dropped support for boxed conversions (adding a
+       test to the test suite now)
+
+       (UserImplicitCast::CanConvert): Remove test for source being null,
+       that code is broken.  We should not feed a null to begin with, if
+       we do, then we should track the bug where the problem originates
+       and not try to cover it up here.
+
+       Return a resolved expression of type UserImplicitCast on success
+       rather than true/false.  Ravi: this is what I was talking about,
+       the pattern is to use a static method as a "constructor" for
+       objects. 
+
+       Also, do not create arguments until the very last minute,
+       otherwise we always create the arguments even for lookups that
+       will never be performed. 
+
+       (UserImplicitCast::Resolve): Eliminate, objects of type
+       UserImplicitCast are born in a fully resolved state. 
+       
+       * typemanager.cs (InitCoreTypes): Init also value_type
+       (System.ValueType). 
+
+       * expression.cs (Cast::Resolve): First resolve the child expression.
+
+       (LValue): Add new method AddressOf to be used by
+       the `&' operator.  
+
+       Change the argument of Store to take an EmitContext instead of an
+       ILGenerator, because things like FieldExpr need to be able to call
+       their children expression to generate the instance code. 
+
+       (Expression::Error, Expression::Warning): Sugar functions for
+       reporting errors.
+
+       (Expression::MemberLookup): Accept a TypeContainer instead of a
+       Report as the first argument.
+
+       (Expression::ResolvePrimary): Killed.  I still want to improve
+       this as currently the code is just not right.
+
+       (Expression::ResolveMemberAccess): Simplify, but it is still
+       wrong. 
+
+       (Unary::Resolve): Catch errors in AddressOf operators.
+
+       (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
+       index to a byte for the short-version, or the compiler will choose
+       the wrong Emit call, which generates the wrong data.
+
+       (ParameterReference::Emit, ::Store): same.
+
+       (FieldExpr::AddressOf): Implement.
+       
+       * typemanager.cs: TypeManager: made public variable instead of
+       property.
+       
+       * driver.cs: document --fatal.
+
+       * report.cs (ErrorMessage, WarningMessage): new names for the old
+       Error and Warning classes.
+
+       * cs-parser.jay (member_access): Turn built-in access to types
+       into a normal simplename
+
+2001-09-27  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (Invocation::BetterConversion): Fix to cope
+       with q being null, since this was introducing a bug.
+
+       * expression.cs (ConvertImplicit): Do built-in conversions first.
+
+2001-09-27  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (UserImplicitCast::Resolve): Fix bug.
+
+2001-09-27  Ravi Pratap  <ravi@ximian.com>
+
+       * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
+       I had introduced long ago (what's new ?).
+
+       * expression.cs (UserImplicitCast::CanConvert): Static method to do 
+       the work of all the checking. 
+       (ConvertImplicit): Call CanConvert and only then create object if necessary.
+       (UserImplicitCast::CanConvert, ::Resolve): Re-write.
+
+       (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
+       that is the right way. 
+
+       (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
+       overloading resolution. Use everywhere instead of cutting and pasting code.
+
+       (Binary::ResolveOperator): Use MakeUnionSet.
+
+       (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
+       we have to convert to bool types. Not complete yet.
+       
+2001-09-27  Miguel de Icaza  <miguel@ximian.com>
+
+       * typemanager.cs (TypeManager::CSharpName): support ushort.
+
+       * expression.cs (Expression::TryImplicitIntConversion): Attempts
+       to provide an expression that performsn an implicit constant int
+       conversion (section 6.1.6).
+       (Expression::ConvertImplicitRequired): Reworked to include
+       implicit constant expression conversions.
+
+       (Expression::ConvertNumericExplicit): Finished.
+
+       (Invocation::Emit): If InstanceExpression is null, then it means
+       that we perform a call on this.
+       
+2001-09-26  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs (Unary::Emit): Remove some dead code.
+       (Probe): Implement Resolve and Emit for `is'.
+       (Expression::ConvertImplicitRequired): Attempt to do constant
+       expression conversions here.  Maybe should be moved to
+       ConvertImplicit, but I am not sure.
+       (Expression::ImplicitLongConstantConversionPossible,
+       Expression::ImplicitIntConstantConversionPossible): New functions
+       that tell whether is it possible to apply an implicit constant
+       expression conversion.
+
+       (ConvertNumericExplicit): Started work on explicit numeric
+       conversions.
+
+       * cs-parser.jay: Update operator constants.
+
+       * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
+       (Parameters::GetSignature): Hook up VerifyArgs here.
+       (Parameters::VerifyArgs): Verifies that no two arguments have the
+       same name. 
+
+       * class.cs (Operator): Update the operator names to reflect the
+       ones that the spec expects (as we are just stringizing the
+       operator names).
+       
+       * expression.cs (Unary::ResolveOperator): Fix bug: Use
+       MethodInfo's ReturnType instead of LookupMethodByBuilder as the
+       previous usage did only work for our methods.
+       (Expression::ConvertImplicit): Handle decimal implicit numeric
+       conversions as well.
+       (Expression::InternalTypeConstructor): Used to invoke constructors
+       on internal types for default promotions.
+
+       (Unary::Emit): Implement special handling for the pre/post
+       increment/decrement for overloaded operators, as they need to have
+       the same semantics as the other operators.
+
+       (Binary::ResolveOperator): ditto.
+       (Invocation::ConversionExists): ditto.
+       (UserImplicitCast::Resolve): ditto.
+       
+2001-09-26  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
+       operator, return after emitting body. Regression tests pass again !
+
+       * expression.cs (ConvertImplicit): Take TypeContainer as first argument
+       (Unary::ForceConversion, Binary::ForceConversion): Ditto.
+       (Invocation::OverloadResolve): Ditto.
+       (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
+
+       * everywhere : update calls to the above methods accordingly.
+
+2001-09-26  Miguel de Icaza  <miguel@ximian.com>
+
+       * assign.cs (Assign): Make it inherit from ExpressionStatement.
+
+       * expression.cs (ExpressionStatement): New base class used for
+       expressions that can appear in statements, so that we can provide
+       an alternate path to generate expression that do not leave a value
+       on the stack.
+
+       (Expression::Emit, and all the derivatives): We no longer return
+       whether a value is left on the stack or not.  Every expression
+       after being emitted leaves a single value on the stack.
+
+       * codegen.cs (EmitContext::EmitStatementExpression): Use the
+       facilties of ExpressionStatement if possible.
+
+       * cs-parser.jay: Update statement_expression.
+
+2001-09-25  Miguel de Icaza  <miguel@ximian.com>
+
+       * driver.cs: Change the wording of message
+
+2001-09-25  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (Binary::ResolveOperator): Had forgottten to set 
+       the type of the expression to the return type of the method if
+       we have an overloaded operator match ! The regression tests pass again !
+       (Unary::ResolveOperator): Ditto.
+
+       * expression.cs (Invocation::ConversionExists): Correct the member lookup
+       to find "op_Implicit", not "implicit" ;-)
+       (UserImplicitCast): New class to take care of user-defined implicit conversions.
+       (ConvertImplicit, ForceConversion): Take TypeContainer argument
+
+       * everywhere : Correct calls to the above accordingly.
+
+       * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
+       (ConvertImplicit): Do user-defined conversion if it exists.
+
+2001-09-24  Miguel de Icaza  <miguel@ximian.com>
+
+       * assign.cs: track location.
+       (Resolve): Use implicit conversions on assignment.
+
+       * literal.cs: Oops.  Not good, Emit of short access values should
+       pass (Bytes) or the wrong argument will be selected.
+
+       * expression.cs (Unary::Emit): Emit code for -expr.
+       
+       (Unary::ResolveOperator): Handle `Substract' for non-constants
+       (substract from zero from the non-constants).
+       Deal with Doubles as well. 
+       
+       (Expression::ConvertImplicitRequired): New routine that reports an
+       error if no implicit conversion exists. 
+
+       (Invocation::OverloadResolve): Store the converted implicit
+       expressions if we make them
+       
+2001-09-24  Ravi Pratap  <ravi@ximian.com>
+
+       * class.cs (ConstructorInitializer): Take a Location argument.
+       (ConstructorBaseInitializer): Same here.
+       (ConstructorThisInitializer): Same here.
+
+       * cs-parser.jay : Update all calls accordingly.
+
+       * expression.cs (Unary, Binary, New): Take location argument.
+       Update accordingly everywhere.
+
+       * cs-parser.jay : Update all calls to the above to take a location
+       argument.
+
+       * class.cs : Ditto.
+
+2001-09-24  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
+       (Invocation::BetterConversion): Same here
+       (Invocation::ConversionExists): Ditto.
+
+       (Invocation::ConversionExists): Implement.
+
+2001-09-22  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
+       Also take an additional TypeContainer argument.
+
+       * All over : Pass in TypeContainer as argument to OverloadResolve.
+
+       * typemanager.cs (CSharpName): Update to check for the string type and return
+       that too.
+
+       * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
+       a given method.
+       
+2001-09-21  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
+       (Invocation::BetterFunction): Implement.
+       (Invocation::BetterConversion): Implement.
+       (Invocation::ConversionExists): Skeleton, no implementation yet.
+
+       Okay, things work fine !
+
+2001-09-21  Miguel de Icaza  <miguel@ximian.com>
+
+       * typemanager.cs: declare and load enum_type, delegate_type and
+       void_type. 
+
+       * expression.cs (Expression::Emit): Now emit returns a value that
+       tells whether a value is left on the stack or not.  This strategy
+       might be reveted tomorrow with a mechanism that would address
+       multiple assignments.
+       (Expression::report118): Utility routine to report mismatches on
+       the ExprClass.
+
+       (Unary::Report23): Report impossible type/operator combination
+       utility function.
+
+       (Unary::IsIncrementableNumber): Whether the type can be
+       incremented or decremented with add.
+       (Unary::ResolveOperator): Also allow enumerations to be bitwise
+       complemented. 
+       (Unary::ResolveOperator): Implement ++, !, ~, ++ and --.
+
+       (Invocation::Emit): Deal with new Emit convetion.
+       
+       * All Expression derivatives: Updated their Emit method to return
+       whether they leave values on the stack or not.
+       
+       * codegen.cs (CodeGen::EmitStatement): Pop values left on the
+       stack for expressions that are statements. 
+
+2001-09-20  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs (LValue): New interface.  Must be implemented by
+       LValue objects.
+       (LocalVariableReference, ParameterReference, FieldExpr): Implement
+       LValue interface.
+       
+       * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
+       interface for generating code, simplifies the code.
+
 2001-09-20  Ravi Pratap  <ravi@ximian.com>
 
        * expression.cs (everywhere): Comment out return statements in ::Resolve