[Mono-bugs] [Bug 609801] New: gmcs crash InternalErrorException NotSupportedException with mixture of generics, delegate, inner class

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Fri May 28 06:29:13 EDT 2010


http://bugzilla.novell.com/show_bug.cgi?id=609801

http://bugzilla.novell.com/show_bug.cgi?id=609801#c0


           Summary: gmcs crash InternalErrorException
                    NotSupportedException with mixture of generics,
                    delegate, inner class
    Classification: Mono
           Product: Mono: Compilers
           Version: 2.6.x
          Platform: x86
        OS/Version: Linux
            Status: NEW
          Severity: Major
          Priority: P5 - None
         Component: C#
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: mfuzzey at parkeon.com
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---
           Blocker: ---


Created an attachment (id=365446)
 --> (http://bugzilla.novell.com/attachment.cgi?id=365446)
test code

User-Agent:       Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/533.2
(KHTML, like Gecko) Chrome/5.0.342.9 Safari/533.2

Running on Debian lenny using mono2.6.4 compiled from tarball gives this
problem.
2.4.2.3 from lenny/backports works OK.

Test code:  (also as attachment)

using System;

public class CompilerTest1 {

    private class MyAttribute<T> {
        private T m_Value;
        private ConvertMethod<T> m_UpdateMethod;
        private delegate X ConvertMethod<X>(string stringValue);

        internal MyAttribute() {
            if (typeof(T) == typeof(Int32)) {
                SetUpdateMethod(DefaultInt32ConvertMethod<T>);
                //m_UpdateMethod = DefaultInt32ConvertMethod<T>;
            }
        }

        private void SetUpdateMethod(ConvertMethod<T> updateMethod) {
            m_UpdateMethod = updateMethod;
        }

        public void Update(string value) {
            m_Value = m_UpdateMethod(value);
        }

        public T GetValue() {
            return m_Value;
        }

        internal static Target DefaultInt32ConvertMethod<Target>(string value)
{
            return (Target)(object)Int32.Parse(value);
        }
    }


    public CompilerTest1() {
        MyAttribute<Int32> toTest = new MyAttribute<Int32>();
        toTest.Update("42");
        System.Console.WriteLine("Value is " + toTest.GetValue());
    }

    static void Main() {
        new CompilerTest1();
    }
}


Backtrace using gmcs:
mfuzzey at mf-dt:~/work/mono/scratch$ /usr/local/bin/gmcs compilerTest1.cs 

Unhandled Exception: Mono.CSharp.InternalErrorException:
compilerTest1.cs(10,18): CompilerTest1.MyAttribute<T>.MyAttribute() --->
System.NotSupportedException: Operation is not supported.
  at System.Reflection.Emit.MethodOnTypeBuilderInst.MakeGenericMethod
(System.Type[] typeArguments) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.MethodGroupExpr.IsApplicable (Mono.CSharp.ResolveContext ec,
Mono.CSharp.Arguments& arguments, Int32 arg_count,
System.Reflection.MethodBase& method, System.Boolean& params_expanded_form)
[0x00000] in <filename unknown>:0 
  at Mono.CSharp.MethodGroupExpr.OverloadResolve (Mono.CSharp.ResolveContext
ec, Mono.CSharp.Arguments& Arguments, Boolean may_fail, Location loc) [0x00000]
in <filename unknown>:0 
  at Mono.CSharp.DelegateCreation.DoResolve (Mono.CSharp.ResolveContext ec)
[0x00000] in <filename unknown>:0 
  at Mono.CSharp.ImplicitDelegateCreation.Create (Mono.CSharp.ResolveContext
ec, Mono.CSharp.MethodGroupExpr mge, System.Type target_type, Location loc)
[0x00000] in <filename unknown>:0 
  at Mono.CSharp.Convert.ImplicitConversionStandard (Mono.CSharp.ResolveContext
ec, Mono.CSharp.Expression expr, System.Type target_type, Location loc, Boolean
explicit_cast) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Convert.ImplicitConversionStandard (Mono.CSharp.ResolveContext
ec, Mono.CSharp.Expression expr, System.Type target_type, Location loc)
[0x00000] in <filename unknown>:0 
  at Mono.CSharp.Convert.ImplicitConversion (Mono.CSharp.ResolveContext ec,
Mono.CSharp.Expression expr, System.Type target_type, Location loc) [0x00000]
in <filename unknown>:0 
  at Mono.CSharp.MethodGroupExpr.VerifyArgumentsCompat
(Mono.CSharp.ResolveContext ec, Mono.CSharp.Arguments& arguments, Int32
arg_count, System.Reflection.MethodBase method, Boolean chose_params_expanded,
Boolean may_fail, Location loc) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.MethodGroupExpr.OverloadResolve (Mono.CSharp.ResolveContext
ec, Mono.CSharp.Arguments& Arguments, Boolean may_fail, Location loc) [0x00000]
in <filename unknown>:0 
  at Mono.CSharp.Invocation.DoResolveOverload (Mono.CSharp.ResolveContext ec)
[0x00000] in <filename unknown>:0 
  at Mono.CSharp.Invocation.DoResolve (Mono.CSharp.ResolveContext ec) [0x00000]
in <filename unknown>:0 
  at Mono.CSharp.Expression.Resolve (Mono.CSharp.ResolveContext ec,
ResolveFlags flags) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Expression.Resolve (Mono.CSharp.ResolveContext ec) [0x00000]
in <filename unknown>:0 
  at Mono.CSharp.ExpressionStatement.ResolveStatement (Mono.CSharp.BlockContext
ec) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.StatementExpression.Resolve (Mono.CSharp.BlockContext ec)
[0x00000] in <filename unknown>:0 
  at Mono.CSharp.Block.Resolve (Mono.CSharp.BlockContext ec) [0x00000] in
<filename unknown>:0 
  at Mono.CSharp.If.Resolve (Mono.CSharp.BlockContext ec) [0x00000] in
<filename unknown>:0 
  at Mono.CSharp.Block.Resolve (Mono.CSharp.BlockContext ec) [0x00000] in
<filename unknown>:0 
  at Mono.CSharp.ToplevelBlock.Resolve (Mono.CSharp.FlowBranching parent,
Mono.CSharp.BlockContext rc, Mono.CSharp.ParametersCompiled ip, IMethodData md)
[0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at Mono.CSharp.TypeContainer.EmitConstructors () [0x00000] in <filename
unknown>:0 
  at Mono.CSharp.TypeContainer.EmitType () [0x00000] in <filename unknown>:0 
  at Mono.CSharp.RootContext.EmitCode () [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Driver.Compile () [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in <filename
unknown>:0 


Problem does not occur if
                SetUpdateMethod(DefaultInt32ConvertMethod<T>);
is replaced by
                m_UpdateMethod = DefaultInt32ConvertMethod<T>;

Problem also does not occur if DefaultInt32ConvertMethod is moved to the outer
class




Reproducible: Always

Steps to Reproduce:
1.
2.
3.

-- 
Configure bugmail: http://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