Bug 325069 (MONO82402) - [GMCS] Compiler crash with nested anonymous methods in a generic method.
Summary: [GMCS] Compiler crash with nested anonymous methods in a generic method.
Status: RESOLVED FIXED
Alias: MONO82402
Product: Mono: Compilers
Classification: Mono
Component: C# (show other bugs)
Version: 1.2
Hardware: Other Other
: P3 - Medium : Major
Target Milestone: ---
Assignee: Marek Safar
QA Contact: Mono Bugs
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-08-10 21:56 UTC by Geoff Norton
Modified: 2008-06-19 17:04 UTC (History)
0 users

See Also:
Found By: ---
Services Priority:
Business Priority:
Blocker: ---
Marketing QA Status: ---
IT Deployment: ---


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Thomas Wiest 2007-09-15 20:48:02 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".

Comment 2 Miguel de Icaza 2007-12-23 23:55:43 UTC
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
Comment 3 Marek Safar 2008-06-19 17:04:06 UTC
Fixed in SVN.