/* Check for finding the prototype when there multiple conflicting available. */ /* Contributed by David Ayers and Alexander Malmberg */ /* { dg-do compile } */ #include @class ClassA; @class ClassB; @interface Class1 - (ClassA *)getObject; + (Class1 *)class1; + (id)new; @end @interface Class2 - (ClassB *)getObject; + (Class2 *)class2; + (id)new; @end void foo1(void) { Class1 *varClass1; Class2 *varClassB; id varId = nil; ClassA *objA; ClassB *objB; id objId; varClass1 = [Class1 class1]; objA = [[Class1 class1] getObject]; objA = [[Class1 new] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ /* { dg-warning "using .\\-\\(ClassA \\*\\)getObject." "" { target *-*-* } 13 } */ /* { dg-warning "also found .\\-\\(ClassB \\*\\)getObject." "" { target *-*-* } 19 } */ objA = [Class1 getObject]; objA = [varClass1 getObject]; varClassB = [Class2 class2]; objB = [[Class2 class2] getObject]; objB = [[Class2 new] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ /* { dg-warning "assignment from incompatible pointer type" "" { target *-*-* } 44 } */ objB = [Class2 getObject]; objB = [varClassB getObject]; objId = [varId getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ objId = [(Class1 *)varId getObject]; objId = [(Class2 *)varId getObject]; objA = [varClassB getObject]; /* { dg-warning "assignment from incompatible pointer type" } */ objB = [varClass1 getObject]; /* { dg-warning "assignment from incompatible pointer type" } */ objA = [(Class1 *)varClassB getObject]; objB = [(Class2 *)varClass1 getObject]; } @class ClassC; @interface Class3 : Class1 - (ClassC *)getObject; + (Class3 *)class3; @end void foo2(void) { ClassA *varClassA; ClassC *varClassC; id varId = nil; id objId; varClassA = [[Class3 class3] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found for receiver of type .Class3 \\*." } */ /* { dg-warning "using .\\-\\(ClassC \\*\\)getObject." "" { target *-*-* } 63 } */ /* { dg-warning "instead of .\\-\\(ClassA \\*\\)getObject." "" { target *-*-* } 13 } */ /* { dg-warning "assignment from incompatible pointer type" "" { target *-*-* } 75 } */ varClassC = [[Class3 class3] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found for receiver of type .Class3 \\*." } */ objId = [[Class3 class3] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found for receiver of type .Class3 \\*." } */ varClassA = [[Class3 new] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ /* { dg-warning "also found .\\-\\(ClassC \\*\\)getObject." "" { target *-*-* } 63 } */ varClassC = [[Class3 new] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ /* { dg-warning "assignment from incompatible pointer type" "" { target *-*-* } 84 } */ objId = [[Class3 new] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ varClassA = [Class3 getObject]; varClassC = [Class3 getObject]; /* { dg-warning "assignment from incompatible pointer type" } */ objId = [Class3 getObject]; varClassA = [(Class3 *)varId getObject]; /* { dg-warning "multiple methods named .\\-getObject. found for receiver of type .Class3 \\*." } */ /* { dg-warning "assignment from incompatible pointer type" "" { target *-*-* } 92 } */ varClassC = [(Class3 *)varId getObject]; /* { dg-warning "multiple methods named .\\-getObject. found for receiver of type .Class3 \\*." } */ /* Test Random/merged selection. */ varClassA = [varId getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ varClassC = [varId getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ /* { dg-warning "assignment from incompatible pointer type" "" { target *-*-* } 98 } */ } @protocol Proto1 -(id)getObject; @end @interface Class4 : Class2 + (Class4 *)class4; @end void foo3(void) { ClassA *varClassA; ClassB *varClassB; id varProto1; id varId = nil; id objId; varClassA = [[Class4 class4] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found for receiver of type .Class4 \\*." } */ /* { dg-warning "using .\\-\\(id \\\\)getObject." "" { target *-*-* } 103 } */ /* { dg-warning "instead of .\\-\\(ClassB \\*\\)getObject." "" { target *-*-* } 19 } */ /* { dg-warning "assignment from incompatible pointer type" "" { target *-*-* } 118 } */ varClassB = [[Class4 class4] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found for receiver of type .Class4 \\*." } */ /* { dg-warning "assignment from incompatible pointer type" "" { target *-*-* } 122 } */ varProto1 = [[Class4 class4] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found for receiver of type .Class4 \\*." } */ objId = [[Class4 class4] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found for receiver of type .Class4 \\*." } */ varClassA = [[Class4 new] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ /* { dg-warning "also found .\\-\\(id \\\\)getObject." "" { target *-*-* } 103 } */ varClassB = [[Class4 new] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ /* { dg-warning "assignment from incompatible pointer type" "" { target *-*-* } 129 } */ varProto1 = [[Class4 new] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ /* { dg-warning "class .ClassA. does not implement the .Proto1. protocol" "" { target *-*-* } 131 } */ objId = [[Class4 new] getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ varClassA = [Class4 getObject]; /* { dg-warning "assignment from incompatible pointer type" } */ varClassB = [Class4 getObject]; varProto1 = [Class4 getObject]; /* { dg-warning "class .ClassB. does not implement the .Proto1. protocol" } */ objId = [Class4 getObject]; varClassA = [(Class4 *)varId getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ /* { dg-warning "assignment from incompatible pointer type" "" { target *-*-* } 140 } */ varClassB = [(Class4 *)varId getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ /* { dg-warning "assignment from incompatible pointer type" "" { target *-*-* } 142 } */ varProto1 = [(Class4 *)varId getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ objId = [(Class4 *)varId getObject]; /* { dg-warning "multiple methods named .\\-getObject. found" } */ varClassA = [(id )varId getObject]; /* { dg-warning "assignment from incompatible pointer type" } */ varClassB = [(id )varId getObject]; /* { dg-warning "assignment from incompatible pointer type" } */ varProto1 = [(id )varId getObject]; objId = [(id )varId getObject]; }