LYR-SEM0122
an unqualified call of a name two conformance blocks implement
A member is called by its bare name on a type that implements it separately in two conformance blocks, for two interfaces.
Explanation
When a type implements greet once in its Greeter block and once in its Waver block, the name belongs to each block; the call p.greet() says nothing about which one is meant. Both stay reachable through the interface they implement.
Qualify the call with the interface: Greeter.greet(p).
Wrong
interface Greeter { fn greet(): string; }
interface Waver { fn greet(): string; }
struct Person { name: string }
extend Person :: [Greeter] { fn greet(): string { return "hello"; } }
extend Person :: [Waver] { fn greet(): string { return "hi"; } }
fn main(): void {
let p = Person { name = "ada" };
let _ = p.greet();
}
Right
interface Greeter { fn greet(): string; }
interface Waver { fn greet(): string; }
struct Person { name: string }
extend Person :: [Greeter] { fn greet(): string { return "hello"; } }
extend Person :: [Waver] { fn greet(): string { return "hi"; } }
fn main(): void {
let p = Person { name = "ada" };
let _ = Greeter.greet(p);
}