Bugzilla – Bug 321859
[ANONYMOUS METHODS] (FIXED) Compiling nested anonymous delegate accessing 'this' fails
Last modified: 2007-09-15 21:24:23 UTC
---- Reported by horst.reiterer@mind-breeze.com 2006-08-22 21:36:30 MST ---- Compiling the following testcase succeeds with csc but fails with gmcs (1.1.13.6): public delegate void A(); class B { void C() { A a = delegate { A b = delegate { B c = this; }; }; } static void Main() { B b = new B(); b.C(); } } Steps to reproduce the problem: 1. gmcs testcase.cs Actual Results: Unhandled Exception: System.Exception: Trying to emit a local from a different ILGenerator. in <0x005e7> System.Reflection.Emit.ILGenerator:Emit (OpCode opcode, System.Reflection.Emit.LocalBuilder lbuilder) in <0x00072> Mono.CSharp.ScopeInfo:EmitScopeInstance (System.Reflection.Emit.ILGenerator ig) in <0x0008a> Mono.CSharp.CaptureContext:EmitMethodHostInstance (Mono.CSharp.EmitContext target, Mono.CSharp.AnonymousContainer am) in <0x0001f> Mono.CSharp.EmitContext:EmitMethodHostInstance (Mono.CSharp.EmitContext target, Mono.CSharp.AnonymousMethod am) in <0x0001c> Mono.CSharp.AnonymousDelegate+AnonymousInstance:Emit (Mono.CSharp.EmitContext ec) in <0x0005c> Mono.CSharp.DelegateCreation:Emit (Mono.CSharp.EmitContext ec) in <0x000c6> Mono.CSharp.AnonymousDelegate:Emit (Mono.CSharp.EmitContext ec) in <0x0003e> Mono.CSharp.LocalVariableReference:EmitAssign (Mono.CSharp.EmitContext ec, Mono.CSharp.Expression source, Boolean leave_copy, Boolean prepare_for_load) in <0x0017f> Mono.CSharp.Assign:Emit (Mono.CSharp.EmitContext ec, Boolean is_statement) in <0x0000f> Mono.CSharp.Assign:EmitStatement (Mono.CSharp.EmitContext ec) in <0x00011> Mono.CSharp.StatementExpression:DoEmit (Mono.CSharp.EmitContext ec) in <0x00024> Mono.CSharp.Statement:Emit (Mono.CSharp.EmitContext ec) in <0x000a8> Mono.CSharp.Block:DoEmit (Mono.CSharp.EmitContext ec) in <0x00268> Mono.CSharp.Block:Emit (Mono.CSharp.EmitContext ec) in <0x0001b> Mono.CSharp.EmitContext:EmitResolvedTopBlock (Mono.CSharp.ToplevelBlock block, Boolean unreachable) in <0x000a8> Mono.CSharp.AnonymousMethod:EmitMethod (Mono.CSharp.EmitContext ec) in <0x0001a> Mono.CSharp.AnonymousDelegate:Emit (Mono.CSharp.EmitContext ec) in <0x0003e> Mono.CSharp.LocalVariableReference:EmitAssign (Mono.CSharp.EmitContext ec, Mono.CSharp.Expression source, Boolean leave_copy, Boolean prepare_for_load) in <0x0017f> Mono.CSharp.Assign:Emit (Mono.CSharp.EmitContext ec, Boolean is_statement) in <0x0000f> Mono.CSharp.Assign:EmitStatement (Mono.CSharp.EmitContext ec) in <0x00011> Mono.CSharp.StatementExpression:DoEmit (Mono.CSharp.EmitContext ec) in <0x00024> Mono.CSharp.Statement:Emit (Mono.CSharp.EmitContext ec) in <0x000a8> Mono.CSharp.Block:DoEmit (Mono.CSharp.EmitContext ec) in <0x00268> Mono.CSharp.Block:Emit (Mono.CSharp.EmitContext ec) in <0x0001b> Mono.CSharp.EmitContext:EmitResolvedTopBlock (Mono.CSharp.ToplevelBlock block, Boolean unreachable) in <0x0007e> Mono.CSharp.EmitContext:EmitTopBlock (IMethodData md, Mono.CSharp.ToplevelBlock block) in <0x001c0> Mono.CSharp.MethodData:Emit (Mono.CSharp.TypeContainer container, Mono.CSharp.Attributable kind) in <0x00030> Mono.CSharp.Method:Emit () in <0x0072d> Mono.CSharp.TypeContainer:EmitType () in <0x00226> Mono.CSharp.RootContext:EmitCode () in <0x00a9f> Mono.CSharp.Driver:MainDriver (System.String[] args) in <0x00051> Mono.CSharp.Driver:Main (System.String[] args) Expected Results: Successful compilation. How often does this happen? 100 out of 100 times ---- Additional Comments From martin@ximian.com 2006-10-04 18:14:51 MST ---- Fixed in SVN. ---- Additional Comments From martin@ximian.com 2006-10-04 18:18:36 MST ---- Fixed in SVN. Unknown bug field "cf_op_sys_details" encountered while moving bug <cf_op_sys_details>Red Hat Enterprise Linux 4 Update 2</cf_op_sys_details> Unknown bug field "cf_version_details" encountered while moving bug <cf_version_details>1.1.13.6</cf_version_details> Unknown operating system other. Setting to default OS "Other".