[Mono-bugs] [Bug 478313] New: [Regression] Compiler generates invalid code for classes with generic class constraint
    bugzilla_noreply at novell.com 
    bugzilla_noreply at novell.com
       
    Fri Feb 20 14:11:20 EST 2009
    
    
  
https://bugzilla.novell.com/show_bug.cgi?id=478313
           Summary: [Regression] Compiler generates invalid code for
                    classes with generic class constraint
    Classification: Mono
           Product: Mono: Compilers
           Version: SVN
          Platform: Macintosh
        OS/Version: Mac OS X 10.5
            Status: NEW
          Severity: Major
          Priority: P5 - None
         Component: C#
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: dmitchell at logos.com
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---
User-Agent:       Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us)
AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1
Here's some code:
---
using System;
namespace MonoBug
{
    public class GenericClass<T1>
        where T1 : class
    {
        public void Method()
        {
            T1 refCurrentMerge = default(T1);
        }
    }
    public static class Program
    {
        public static void Main()
        {
            Console.WriteLine("entered main");
            var foo = new GenericClass<object>();
            Console.WriteLine("created foo; it is {0}", foo);
            foo.Method();
            Console.WriteLine("performed method");
        }
    }
}
---
This code compiles with no errors (one warning) in both gmcs 2.2 and gmcs from
svn, but svn's gmcs produces invalid il that causes a crash at runtime.
Reproducible: Always
Steps to Reproduce:
1. Put the included code into a file
2. Compile with gmcs created from svn
3. Run the executable produced by gmcs
Actual Results:  
Application crashes
Expected Results:  
Application should run.
By disassembling the executables produced by the two versions of gmcs, I was
able determine that an additional instruction was added to the implementation
of Method() in the svn version. Here's what 2.2 produces:
    .method public hidebysig 
           instance default void Method ()  cil managed 
    {
        // Method begins at RVA 0x20f4
    // Code size 3 (0x3)
    .maxstack 1
    .locals init (
        !T1    V_0)
    IL_0000:  ldnull 
    IL_0001:  stloc.0 
    IL_0002:  ret 
    } 
and here's what svn produces:
method public hidebysig 
           instance default void Method ()  cil managed 
    {
        // Method begins at RVA 0x20f4
    // Code size 8 (0x8)
    .maxstack 2
    .locals init (
        !T1    V_0)
    IL_0000:  ldnull 
    IL_0001:  unbox.any !0
    IL_0006:  stloc.0 
    IL_0007:  ret 
    }
---
I suspect that the unbox.any instruction is what is causing the error. Also
noteworthy is that removing the generic constraint from GenericClass causes the
compiler (either version) to emit valid il.
-- 
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.
    
    
More information about the mono-bugs
mailing list