https://bugzilla.novell.com/show_bug.cgi?id=657623
https://bugzilla.novell.com/show_bug.cgi?id=657623#c0 Summary: gmcs sees "is" operator as always true (and removes all subsequent code) Classification: Mono Product: Mono: Compilers Version: SVN Platform: x86 OS/Version: All Status: NEW Severity: Normal Priority: P5 - None Component: C# AssignedTo: [email protected] ReportedBy: [email protected] QAContact: [email protected] Found By: --- Blocker: --- Created an attachment (id=403493) --> (http://bugzilla.novell.com/attachment.cgi?id=403493) Example source User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) Tested in mono 2.8 (Linux), and cygwin built from a week or so ago. Sample method: [[ internal static IntPtr Bar<T>(IntPtr x, T val) where T : struct { if (val is IntPtr) throw new ArgumentException("xxxx1"); if (typeof(T) == typeof(IntPtr)) throw new ArgumentException("xxxx2"); // Console.WriteLine("Success, type is: {0} / {1}", typeof(T).Name, val.GetType().Name); return IntPtr.Zero; }]] gmcs/dmcs both output the following, whereas MSFT csc reports no warnings/errors: [[ gmcsIsIntPtr.cs(19,17): warning CS0183: The given expression is always of the provided (`System.IntPtr') type gmcsIsIntPtr.cs(20,9): warning CS0162: Unreachable code detected Compilation succeeded - 2 warning(s) ]] Clearly that is wrong, "val" can be any value type. Running the exe and inspection of its IL shows that gmcs has compiled the method to one throw statement and has thus removed all of the code. Adding a Main that calls the method with Boolean, Int32 and IntPtr argument and running the two compiled samples shows this too. For csc compiled: [[ D:\Temp>gmcsIsIntPtr_msft2.exe Success, type is: Boolean / System.Boolean Success, type is: Int32 / System.Int32 Unhandled Exception: System.ArgumentException: xxxx1 at Foo.Bar[T](IntPtr x, T val) at Foo.Main() D:\Temp> ]] For Mono compiled: [[ a...@linux5:~/dev> mono --debug gmcsIsIntPtr_gmcs2_8_LinuxVm.exe Unhandled Exception: System.ArgumentException: xxxx1 at Foo.Main () [0x00000] in <filename unknown>:0 a...@linux5:~/dev> ]] Reproducible: Always Steps to Reproduce: Compile as described in details, see no warning as described. When run, get two 'good' output lines and exception as described in details. -- Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the QA contact for the bug. _______________________________________________ mono-bugs maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-bugs
