Bugzilla – Bug 321860
[ANONYMOUS METHODS] Anonymous delegates testcase fails with NullReferenceException
Last modified: 2007-09-15 21:24:23 UTC
---- Reported by horst.reiterer@mind-breeze.com 2006-08-22 22:19:50 MST ---- Compiling the following testcase succeeds with csc but fails with gmcs (1.1.13.6): public delegate void A(); class B { public static event A D; long[] d = new long[1]; void C() { int a = 0; int b = 0; A block = delegate { long c = 0; B.D += delegate { d[a] = c; F(b); }; }; } public void F(int i) { } static void Main() { B b = new B(); b.C(); } } Steps to reproduce the problem: 1. gmcs testcase.cs Actual Results: Target: 1 b Trying: 2 Trying: 0 Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object in <0x001c3> Mono.CSharp.CaptureContext:EmitCapturedVariableInstance (Mono.CSharp.EmitContext ec, Mono.CSharp.LocalInfo li, Mono.CSharp.AnonymousContainer am) in <0x00020> Mono.CSharp.EmitContext:EmitCapturedVariableInstance (Mono.CSharp.LocalInfo li) in <0x00059> Mono.CSharp.LocalVariableReference:Emit (Mono.CSharp.EmitContext ec) in <0x0022b> Mono.CSharp.Argument:Emit (Mono.CSharp.EmitContext ec) in <0x00170> Mono.CSharp.Invocation:EmitArguments (Mono.CSharp.EmitContext ec, System.Reflection.MethodBase mb, System.Collections.ArrayList arguments, Boolean dup_args, Mono.CSharp.LocalTemporary this_arg) in <0x00542> Mono.CSharp.Invocation:EmitCall (Mono.CSharp.EmitContext ec, Boolean is_base, Boolean is_static, Mono.CSharp.Expression instance_expr, System.Reflection.MethodBase method, System.Collections.ArrayList Arguments, Location loc, Boolean dup_args, Boolean omit_args) in <0x00024> Mono.CSharp.Invocation:EmitCall (Mono.CSharp.EmitContext ec, Boolean is_base, Boolean is_static, Mono.CSharp.Expression instance_expr, System.Reflection.MethodBase method, System.Collections.ArrayList Arguments, Location loc) in <0x00066> Mono.CSharp.Invocation:Emit (Mono.CSharp.EmitContext ec) in <0x00015> Mono.CSharp.Invocation: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 <0x0022b> Mono.CSharp.Argument:Emit (Mono.CSharp.EmitContext ec) in <0x00170> Mono.CSharp.Invocation:EmitArguments (Mono.CSharp.EmitContext ec, System.Reflection.MethodBase mb, System.Collections.ArrayList arguments, Boolean dup_args, Mono.CSharp.LocalTemporary this_arg) in <0x00021> Mono.CSharp.BinaryDelegate:Emit (Mono.CSharp.EmitContext ec) in <0x00090> Mono.CSharp.FieldExpr: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 <0x000a8> Mono.CSharp.Block:DoEmit (Mono.CSharp.EmitContext ec) in <0x00268> Mono.CSharp.Block: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 miguel@ximian.com 2006-10-07 11:51:07 MST ---- Fixed for 1.1.18 ---- Additional Comments From pawel.sakowski@mindbreeze.com 2006-12-14 11:39:07 MST ---- The very same test code fails to compile again with mono 1.2.2.1, this time with another exception: delegate-nullref.cs(13,9): warning CS0219: The variable `block' is assigned but its value is never used Unhandled Exception: Mono.CSharp.InternalErrorException: Internal error at Mono.CSharp.ScopeInfo.EmitScopeInstance (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.ScopeInfo+CapturedVariable.EmitInstance (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.VariableReference.EmitLoad (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.VariableReference.Emit (Mono.CSharp.EmitContext ec, Boolean leave_copy) [0x00000] at Mono.CSharp.VariableReference.Emit (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.ArrayAccess.EmitAssign (Mono.CSharp.EmitContext ec, Mono.CSharp.Expression source, Boolean leave_copy, Boolean prepare_for_load) [0x00000] at Mono.CSharp.Assign.Emit (Mono.CSharp.EmitContext ec, Boolean is_statement) [0x00000] at Mono.CSharp.Assign.EmitStatement (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.StatementExpression.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] at Mono.CSharp.EmitContext.EmitResolvedTopBlock (Mono.CSharp.ToplevelBlock block, 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.TypeContainer.EmitType () [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] ---- Additional Comments From martin@ximian.com 2007-03-29 07:44:17 MST ---- Fixed in SVN; added gtest-324.cs. 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.2.2</cf_version_details> Unknown operating system other. Setting to default OS "Other".