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


           Summary: InvalidProgramException for unreachable code in iterator
                    with CodeDomProvider
           Product: Mono: Compilers
           Version: 1.9.0
          Platform: i386
        OS/Version: Windows Vista
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: C#
        AssignedTo: [email protected]
        ReportedBy: [EMAIL PROTECTED]
         QAContact: [email protected]
          Found By: ---


When normally compiled, an iterator gives a compiler warning for unreachable
code, but otherwise executes correctly. However, when the same code is compiled
in a CodeDomProvider, it throws an InvalidProgramException when executed. But I
would expect it to execute the same way.

To reproduce, compile and run the following code (also attached).
Using the iterator directly with Temporary.Temporary.func() works correctly,
but using the same iterator compiled with CodeDomProvider throws an
InvalidProgramException.
Even though the "yield break" makes the code following it unreachable, I expect
the code compiled with CodeDomProvider to behave the same as normally-compiled
code called directly with Temporary.Temporary.func().
Even though the code after "yield break" is not reached, the bug still requires
it to be there as a foreach loop with its own "yield return". The bug is not
produced if the code after "yield break" is removed, or if it is changed to
some kind of code other than a foreach loop with its own "yield return".

using System;
using System.Collections.Generic;
using System.CodeDom.Compiler;

class TestDomProvider
{
    static void Main(string[] args)
    {
        string source = @"
using System;
using System.Collections.Generic;

namespace Temporary
{
    public class Temporary
    {
        public static IEnumerable<char> func()
        {
            yield return '0';
            yield break;
            foreach (char c in ""1"")
            {
                yield return c;
            }
        }
    }
}
";
        var parameters = new CompilerParameters();
        // This gets the location of the System assembly.
       
parameters.ReferencedAssemblies.Add(typeof(System.Int32).Assembly.Location);
        parameters.GenerateInMemory = true;
        var results =
CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(parameters,
source);
        var compiledType =
results.CompiledAssembly.GetType("Temporary.Temporary");

        // This works:
        foreach (char c in Temporary.Temporary.func()) { }
        // This should do the same thing but gives InvalidProgramException:
        foreach (char c in
(IEnumerable<char>)compiledType.GetMethod("func").Invoke(null, new object[0]))
{ }
    }
}

namespace Temporary
{
    public class Temporary
    {
        public static IEnumerable<char> func()
        {
            yield return '0';
            yield break;
            foreach (char c in "1")
            {
                yield return c;
            }
        }
    }
}


-- 
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.
_______________________________________________
mono-bugs maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-bugs

Reply via email to