[Mono-bugs] [Bug 359594] New: Mono doesn't support co-/contravariant generic parameters

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Thu Feb 7 10:16:08 EST 2008


https://bugzilla.novell.com/show_bug.cgi?id=359594


           Summary: Mono doesn't support co-/contravariant generic
                    parameters
           Product: Mono: Runtime
           Version: SVN
          Platform: x86-64
        OS/Version: Other
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: generics
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: s-kiess at web.de
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---


Mono doesn't support co-/contravariant generic parameters.

The nemerle program:

using System;

public interface A[+T] {
  getObj () : T;
}

public class B[T] : A[T] {
  public getObj () : T {
    throw Exception ();
  }
}

public class M {
  public static Main () : void {
    def b : B[string] = B ();
    def a : A[object] = b;
    _ = a.getObj ();
  }
}


which will be compiled to the IL:

assembly extern mscorlib
{
  .ver 2:0:0:0
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
}
assembly 'MonoCovariance'
{
  .custom instance void class
[mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype
[mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) =  (01 00 01
01 00 00 00 00 ) // ........

  .custom instance void class
[mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::ctor(int32)
=  (01 00 08 00 00 00 00 00 ) // ........

  .hash algorithm 0x00008004
  .ver  0:0:0:0
}
module MonoCovariance // GUID = {A2F61D8A-1737-45FB-9839-73E733D74B3C}


  .class interface public auto ansi abstract beforefieldinit A`1<+ T>
  {

    // method line 1
    .method public virtual  hidebysig  abstract 
           instance default !T getObj ()  cil managed 
    {
        // Method begins at RVA 0x0
    } // end of method A`1::getObj

  } // end of class A`1

  .class public auto ansi beforefieldinit B`1<T>
        extends [mscorlib]System.Object
        implements class A`1<!0>  {

    // method line 2
    .method public hidebysig  specialname  rtspecialname 
           instance default void .ctor ()  cil managed 
    {
        // Method begins at RVA 0x20ec
        // Code size 7 (0x7)
        .maxstack 8
        IL_0000:  ldarg.0 
        IL_0001:  call instance void object::.ctor()
        IL_0006:  ret 
    } // end of method B`1::.ctor

    // method line 3
    .method public final  virtual  hidebysig  newslot 
           instance default !T getObj ()  cil managed 
    {
        // Method begins at RVA 0x20f4
        // Code size 8 (0x8)
        .maxstack 8
        IL_0000:  nop 
        IL_0001:  nop 
        IL_0002:  newobj instance void class
[mscorlib]System.Exception::.ctor()
        IL_0007:  throw 
    } // end of method B`1::getObj

  } // end of class B`1

  .class public auto ansi beforefieldinit M
        extends [mscorlib]System.Object
  {

    // method line 4
    .method public hidebysig  specialname  rtspecialname 
           instance default void .ctor ()  cil managed 
    {
        // Method begins at RVA 0x2100
        // Code size 7 (0x7)
        .maxstack 8
        IL_0000:  ldarg.0 
        IL_0001:  call instance void object::.ctor()
        IL_0006:  ret 
    } // end of method M::.ctor

    // method line 5
    .method public static  hidebysig 
           default void Main ()  cil managed 
    {
        // Method begins at RVA 0x2108
        .entrypoint
        // Code size 21 (0x15)
        .maxstack 3
        .locals init (
                class B`1<string>       V_0,
                class A`1<object>       V_1)
        IL_0000:  nop 
        IL_0001:  nop 
        IL_0002:  newobj instance void class B`1<string>::.ctor()
        IL_0007:  stloc.0 
        IL_0008:  nop 
        IL_0009:  ldloc.0 
        IL_000a:  stloc.1 
        IL_000b:  nop 
        IL_000c:  ldloc.1 
        IL_000d:  callvirt instance !0 class A`1<object>::getObj()
        IL_0012:  pop 
        IL_0013:  nop 
        IL_0014:  ret 
    } // end of method M::Main

  } // end of class M


will crash mono.

PEVerify says it's fine:

Microsoft (R) .NET Framework PE Verifier.  Version  2.0.50727.42
Copyright (c) Microsoft Corporation.  All rights reserved.

All Classes and Methods in C:\cygwin\tmp\peverify.QLN264\MonoCovariance.exe
Verified.


Output of mono:

B<System.String> doesn't implement interface A<System.Object>

** ERROR **: file mini-trampolines.c: line 42
(mono_convert_imt_slot_to_vtable_slot): should not be reached
aborting...
Stacktrace:

  at M.Main () <0xffffffff>
  at M.Main () <0x00037>
  at (wrapper runtime-invoke) System.Object.runtime_invoke_void
(object,intptr,intptr,intptr) <0xffffffff>

Native stacktrace:

        /home/steffen/mono-svn/bin/mono [0x537eed]
        /lib/libpthread.so.0 [0x2b850cf757d0]
        /lib/libc.so.6(gsignal+0x35) [0x2b850d436025]
        /lib/libc.so.6(abort+0x110) [0x2b850d437a80]
        /usr/lib/libglib-2.0.so.0(g_log+0) [0x2b850caed4b0]
        /usr/lib/libglib-2.0.so.0(g_log+0x83) [0x2b850caed533]
        /usr/lib/libglib-2.0.so.0(g_assert_warning+0x76) [0x2b850caed5b6]
        /home/steffen/mono-svn/bin/mono [0x53c6b7]
        /home/steffen/mono-svn/bin/mono [0x53ca38]
        [0x40000160]

Debug info from gdb:

Using host libthread_db library "/lib/libthread_db.so.1".
[Thread debugging using libthread_db enabled]
[New Thread 0x2b850d989040 (LWP 11642)]
[New Thread 0x40224950 (LWP 11644)]
[New Thread 0x40023950 (LWP 11643)]
0x00002b850d4a1c0b in fork () from /lib/libc.so.6
  3 Thread 0x40023950 (LWP 11643)  0x00002b850cf74e81 in nanosleep ()
   from /lib/libpthread.so.0
  2 Thread 0x40224950 (LWP 11644)  0x00002b850cf71b99 in
pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0
  1 Thread 0x2b850d989040 (LWP 11642)  0x00002b850d4a1c0b in fork ()
   from /lib/libc.so.6

Thread 3 (Thread 0x40023950 (LWP 11643)):
#0  0x00002b850cf74e81 in nanosleep () from /lib/libpthread.so.0
#1  0x00000000004d685f in collection_thread (unused=<value optimized out>)
    at collection.c:34
#2  0x00002b850cf6d3f7 in start_thread () from /lib/libpthread.so.0
#3  0x00002b850d4db97d in clone () from /lib/libc.so.6
#4  0x0000000000000000 in ?? ()

Thread 2 (Thread 0x40224950 (LWP 11644)):
#0  0x00002b850cf71b99 in pthread_cond_wait@@GLIBC_2.3.2 ()
   from /lib/libpthread.so.0
#1  0x00000000004e1aa5 in timedwait_signal_poll_cond (cond=0x2aaaab5f8268, 
    mutex=0x2aaaab5f8240, timeout=0x1, alertable=-1) at handles.c:1443
#2  0x00000000004e4017 in _wapi_handle_timedwait_signal_handle (
    handle=<value optimized out>, timeout=0x0, alertable=0) at handles.c:1523
#3  0x00000000004d1a53 in WaitForSingleObjectEx (handle=0x404, 
    timeout=4294967295, alertable=0) at wait.c:200
#4  0x000000000053db81 in finalizer_thread (unused=<value optimized out>)
    at gc.c:894
#5  0x000000000046cd7c in start_wrapper (data=<value optimized out>)
    at threads.c:589
#6  0x00000000004d6593 in thread_start_routine (args=0x2aaaab661a60)
    at threads.c:282
#7  0x00000000004ed7b2 in GC_start_routine (arg=<value optimized out>)
    at pthread_support.c:1369
#8  0x00002b850cf6d3f7 in start_thread () from /lib/libpthread.so.0
#9  0x00002b850d4db97d in clone () from /lib/libc.so.6
#10 0x0000000000000000 in ?? ()

Thread 1 (Thread 0x2b850d989040 (LWP 11642)):
#0  0x00002b850d4a1c0b in fork () from /lib/libc.so.6
#1  0x00002b850cb1335d in ?? () from /usr/lib/libglib-2.0.so.0
#2  0x00002b850cb13eaf in g_spawn_sync () from /usr/lib/libglib-2.0.so.0
#3  0x00002b850cb14368 in g_spawn_command_line_sync ()
   from /usr/lib/libglib-2.0.so.0
#4  0x0000000000537f7f in mono_handle_native_sigsegv (
    signal=<value optimized out>, ctx=<value optimized out>)
    at mini-exceptions.c:1046
#5  <signal handler called>
#6  0x00002b850d436025 in raise () from /lib/libc.so.6
#7  0x00002b850d437a80 in abort () from /lib/libc.so.6
#8  0x00002b850caed4b0 in g_logv () from /usr/lib/libglib-2.0.so.0
#9  0x00002b850caed533 in g_log () from /usr/lib/libglib-2.0.so.0
#10 0x00002b850caed5b6 in g_assert_warning () from /usr/lib/libglib-2.0.so.0
#11 0x000000000053c6b7 in mono_convert_imt_slot_to_vtable_slot (slot=0x88ad70, 
    regs=<value optimized out>, code=<value optimized out>, 
    method=<value optimized out>, impl_method=0x7fff9e61d5b8)
    at mini-trampolines.c:42
#12 0x000000000053ca38 in mono_magic_trampoline (regs=0x7fff9e61d7b0, 
    code=0x40010327 "L\213,$H\203�\030������\004�U\212",
m=0x8a5830, 
    tramp=<value optimized out>) at mini-trampolines.c:125
#13 0x0000000040000160 in ?? ()
#14 0x0000000000000000 in ?? ()
#0  0x00002b850d4a1c0b in fork () from /lib/libc.so.6


=================================================================
Got a SIGABRT while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================

Mono is SVN rev 95083.


-- 
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