Bugzilla – Bug 325069
[GMCS] Compiler crash with nested anonymous methods in a generic method.
Last modified: 2008-06-19 17:04:06 UTC
---- Reported by grompf@sublimeintervention.com 2007-08-10 14:56:01 MST ---- The following code crashes GMCS with the following exception: Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object at Mono.CSharp.ConstructedType..ctor (System.Type t, Mono.CSharp.TypeParameter[] type_params, Location l) [0x00000] at Mono.CSharp.TypeContainer.DoResolveType () [0x00000] at Mono.CSharp.TypeContainer.ResolveType () [0x00000] at Mono.CSharp.TypeContainer.ResolveType () [0x00000] at Mono.CSharp.RootScopeInfo.LinkScopes () [0x00000] at Mono.CSharp.ToplevelBlock.CompleteContexts (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.EmitContext.ResolveTopBlock (Mono.CSharp.EmitContext anonymous_method_host, Mono.CSharp.ToplevelBlock block, Mono.CSharp.Parameters ip, IMethodData md, System.Boolean& unreachable) [0x00000] at Mono.CSharp.EmitContext.EmitTopBlock (IMethodData md, Mono.CSharp.ToplevelBlock block) [0x00000] at Mono.CSharp.MethodData.Emit (Mono.CSharp.DeclSpace parent) [0x00000] at Mono.CSharp.Method.Emit () [0x00000] at Mono.CSharp.TypeContainer.EmitType () [0x00000] at Mono.CSharp.RootContext.EmitCode () [0x00000] at Mono.CSharp.Driver.MainDriver (System.String[] args) [0x00000] at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] --code-- using System; using System.Threading; public delegate void VoidHandler(); public delegate TResult ResultHandler<TResult>(); class Result <T>{ public Result () {} } class TaskBehaviour { public Exception Execute (VoidHandler handler) { return new Exception (); } } class GmcsCrash { static Result<TResult> Fork<TResult> (ResultHandler <TResult> handler, Result <TResult> result) { if (handler == null) { throw new Exception ("null"); } TaskBehaviour behaviour = new TaskBehaviour (); ThreadPool.QueueUserWorkItem (delegate (object unused) { try { TResult response = default (TResult); Exception exception = behaviour.Execute (delegate () { response = handler (); }); } catch (Exception e) { } finally { } }); return result; } } ---- Additional Comments From miguel@ximian.com 2007-08-10 17:00:03 MST ---- In trunk things are slightly different, but we now have an issue with the conversion It should not be too hard to fix. Exception caught by the compiler while compiling: Block that caused the problem begin at: a.cs(26,39): Block being compiled: [a.cs(29,17):,Internal(1,1):] Mono.CSharp.InternalErrorException: VerifyArgumentsCompat and IsApplicable do not agree; likely reason: ImplicitConversion and ImplicitConversionExists have gone out of sync Exception caught by the compiler while compiling: Block that caused the problem begin at: a.cs(18,28): Block being compiled: [a.cs(24,9):,Internal(1,1):] Mono.CSharp.InternalErrorException: a.cs(26,39): Interna compiler error at a.cs(18,28):: exception caught while emitting MethodBuilder [GmcsCrash::Fork] Unhandled Exception: Mono.CSharp.InternalErrorException: a.cs(26,39): ---> Mono.CSharp.InternalErrorException: VerifyArgumentsCompat and IsApplicable do not agree; likely reason: ImplicitConversion and ImplicitConversionExists have gone out of sync at Mono.CSharp.MethodGroupExpr.OverloadResolve (Mono.CSharp.EmitContext ec, System.Collections.ArrayList Arguments, Boolean may_fail, Location loc) [0x00000] at Mono.CSharp.Invocation.DoResolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.Expression.Resolve (Mono.CSharp.EmitContext ec, ResolveFlags flags) [0x00000] at Mono.CSharp.Expression.Resolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.Assign.DoResolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.Expression.Resolve (Mono.CSharp.EmitContext ec, ResolveFlags flags) [0x00000] at Mono.CSharp.Expression.Resolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.ExpressionStatement.ResolveStatement (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.StatementExpression.Resolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.Block.Resolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.Block.Resolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.Try.Resolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.Block.Resolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.EmitContext.ResolveTopBlock (Mono.CSharp.EmitContext anonymous_method_host, Mono.CSharp.ToplevelBlock block, Mono.CSharp.Parameters ip, IMethodData md, System.Boolean& unreachable) [0x00000] --- End of inner exception stack trace --- at Mono.CSharp.AnonymousMethodExpression.Compatible (Mono.CSharp.EmitContext ec, System.Type delegateType) [0x00000] at Mono.CSharp.Convert.ImplicitConversionStandard (Mono.CSharp.EmitContext ec, Mono.CSharp.Expression expr, System.Type target_type, Location loc) [0x00000] at Mono.CSharp.Convert.ImplicitConversion (Mono.CSharp.EmitContext ec, Mono.CSharp.Expression expr, System.Type target_type, Location loc) [0x00000] at Mono.CSharp.Invocation.VerifyArgumentsCompat (Mono.CSharp.EmitContext ec, System.Collections.ArrayList Arguments, Int32 arg_count, System.Reflection.MethodBase method, Boolean chose_params_expanded, System.Type delegate_type, Boolean may_fail, Location loc) [0x00000] at Mono.CSharp.MethodGroupExpr.OverloadResolve (Mono.CSharp.EmitContext ec, System.Collections.ArrayList Arguments, Boolean may_fail, Location loc) [0x00000] at Mono.CSharp.Invocation.DoResolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.Expression.Resolve (Mono.CSharp.EmitContext ec, ResolveFlags flags) [0x00000] at Mono.CSharp.Expression.Resolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.ExpressionStatement.ResolveStatement (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.StatementExpression.Resolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.Block.Resolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.Block.Resolve (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.EmitContext.ResolveTopBlock (Mono.CSharp.EmitContext anonymous_method_host, Mono.CSharp.ToplevelBlock block, Mono.CSharp.Parameters ip, IMethodData md, System.Boolean& unreachable) [0x00000] Unknown operating system other. Setting to default OS "Other".
Update, this is the output with 1.2.6: es.cs(31,21): error CS0029: Cannot implicitly convert type `TResult' to `TResult' es.cs(31,21): The generic parameter `TResult' of `GmcsCrash.Fork<TResult>(ResultHandler<TResult>, Result<TResult>)' cannot be converted to the generic parameter `TResult' of `GmcsCrash.<>c__CompilerGenerated0<TResult>' (in the previous error) es.cs(33,32): warning CS0168: The variable `e' is declared but never used Compilation failed: 1 error(s), 2 warnings
Fixed in SVN.