Bug 321860 (MONO79148) - [ANONYMOUS METHODS] Anonymous delegates testcase fails with NullReferenceException
Summary: [ANONYMOUS METHODS] Anonymous delegates testcase fails with NullReferenceExce...
Status: RESOLVED FIXED
Alias: MONO79148
Product: Mono: Compilers
Classification: Mono
Component: C# (show other bugs)
Version: 1.2
Hardware: Other Other
: P3 - Medium : Major
Target Milestone: ---
Assignee: Martin Baulig
QA Contact: Mono Bugs
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-08-23 05:19 UTC by horst.reiterer
Modified: 2007-09-15 21:24 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:07:11 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".