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
public static IList<MemberSpec> GetUserOperator (TypeSpec container, Operator.OpType op, bool declaredOnly)
{
IList<MemberSpec> found = null;
-
+ bool shared_list = true;
IList<MemberSpec> applicable;
do {
var mc = container.MemberCache;
found = new List<MemberSpec> ();
found.Add (applicable[i]);
} else {
- var prev = found as List<MemberSpec>;
- if (prev == null) {
+ List<MemberSpec> prev;
+ if (shared_list) {
+ shared_list = false;
prev = new List<MemberSpec> (found.Count + 1);
prev.AddRange (found);
+ } else {
+ prev = (List<MemberSpec>) found;
}
prev.Add (applicable[i]);
} else {
if (found == null) {
found = applicable;
+ shared_list = true;
} else {
- var merged = found as List<MemberSpec>;
- if (merged == null) {
+ List<MemberSpec> merged;
+ if (shared_list) {
+ shared_list = false;
merged = new List<MemberSpec> (found.Count + applicable.Count);
merged.AddRange (found);
found = merged;
+ } else {
+ merged = (List<MemberSpec>) found;
}
merged.AddRange (applicable);
--- /dev/null
+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
</method>\r
</type>\r
</test>\r
+ <test name="test-866.cs">\r
+ <type name="C">\r
+ <method name="Boolean op_Addition(C, Int16)" attrs="2198">\r
+ <size>10</size>\r
+ </method>\r
+ <method name="Boolean op_Addition(C, Int64)" attrs="2198">\r
+ <size>10</size>\r
+ </method>\r
+ <method name="Void .ctor()" attrs="6278">\r
+ <size>7</size>\r
+ </method>\r
+ </type>\r
+ <type name="B">\r
+ <method name="Boolean op_Addition(B, System.String)" attrs="2198">\r
+ <size>10</size>\r
+ </method>\r
+ <method name="Void .ctor()" attrs="6278">\r
+ <size>7</size>\r
+ </method>\r
+ </type>\r
+ <type name="Test">\r
+ <method name="Void Main()" attrs="150">\r
+ <size>32</size>\r
+ </method>\r
+ <method name="Void .ctor()" attrs="6278">\r
+ <size>7</size>\r
+ </method>\r
+ </type>\r
+ </test>\r
<test name="test-87.cs">\r
<type name="Top">\r
<method name="Int32 Main()" attrs="150">\r