From: Marek Safar Date: Fri, 8 Mar 2013 21:55:23 +0000 (+0100) Subject: Clone shared members list before operators merging. Fixes #10967 X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=92a6488c89030586d717a69c8fd2a7ab20442f52;p=mono.git Clone shared members list before operators merging. Fixes #10967 --- diff --git a/mcs/mcs/membercache.cs b/mcs/mcs/membercache.cs index 7209af7dc74..cad910e01bc 100644 --- a/mcs/mcs/membercache.cs +++ b/mcs/mcs/membercache.cs @@ -299,6 +299,7 @@ namespace Mono.CSharp { if (member.Kind == MemberKind.Operator) { var dt = member.DeclaringType; + // // Some core types have user operators but they cannot be used like normal // user operators as they are predefined and therefore having different @@ -908,7 +909,7 @@ namespace Mono.CSharp { public static IList GetUserOperator (TypeSpec container, Operator.OpType op, bool declaredOnly) { IList found = null; - + bool shared_list = true; IList applicable; do { var mc = container.MemberCache; @@ -938,10 +939,13 @@ namespace Mono.CSharp { found = new List (); found.Add (applicable[i]); } else { - var prev = found as List; - if (prev == null) { + List prev; + if (shared_list) { + shared_list = false; prev = new List (found.Count + 1); prev.AddRange (found); + } else { + prev = (List) found; } prev.Add (applicable[i]); @@ -950,12 +954,16 @@ namespace Mono.CSharp { } else { if (found == null) { found = applicable; + shared_list = true; } else { - var merged = found as List; - if (merged == null) { + List merged; + if (shared_list) { + shared_list = false; merged = new List (found.Count + applicable.Count); merged.AddRange (found); found = merged; + } else { + merged = (List) found; } merged.AddRange (applicable); diff --git a/mcs/tests/test-866.cs b/mcs/tests/test-866.cs new file mode 100644 index 00000000000..723795ee412 --- /dev/null +++ b/mcs/tests/test-866.cs @@ -0,0 +1,30 @@ +class C : B +{ + public static bool operator + (C a, short b) + { + return false; + } + + public static bool operator + (C a, long b) + { + return false; + } +} + +class B +{ + public static bool operator + (B b, string s) + { + return false; + } +} + +public class Test +{ + public static void Main () + { + var c = new C (); + var a1 = c + "a"; + var a2 = c + "a"; + } +} \ No newline at end of file diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index 36c43c71241..ab4aca730e0 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -46674,6 +46674,35 @@ + + + + 10 + + + 10 + + + 7 + + + + + 10 + + + 7 + + + + + 32 + + + 7 + + +