Details
Description
""" B """ interface I: def Foo() class A(I): def I.Foo(): print "A" class B(A): def I.Foo(): print "B" b = B() (b as I).Foo()
Does not matter if B also derives from I.
Output:
test.boo(22,3): BCE0055: Boo.Lang.Compiler.CompilerError: Internal compiler error: entities. ---> System.ArgumentException: entities
at Boo.Lang.Compiler.TypeSystem.Ambiguous..ctor(IEntity[] entities)
at Boo.Lang.Compiler.TypeSystem.Ambiguous..ctor(IList entities)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.ResolveAmbiguousReferenceByAccessibility(Ambiguous candidates)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.ResolveAmbiguousReference(ReferenceExpression node, Ambiguous candidates)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.ProcessMemberReferenceExpression(MemberReferenceExpression node)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.LeaveMemberReferenceExpression(MemberReferenceExpression node)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.OnMemberReferenceExpression(MemberReferenceExpression node)
at Boo.Lang.Compiler.Ast.MemberReferenceExpression.Accept(IAstVisitor visitor)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node)
— End of inner exception stack trace —
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.OnError(Node node, Exception error)
at Boo.Lang.Compiler.Steps.AbstractVisitorCompilerStep.OnError(Node node, Exception error)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.OnMethodInvocationExpression(MethodInvocationExpression node)
at Boo.Lang.Compiler.Ast.MethodInvocationExpression.Accept(IAstVisitor visitor)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.OnExpressionStatement(ExpressionStatement node)
at Boo.Lang.Compiler.Ast.ExpressionStatement.Accept(IAstVisitor visitor)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node[] array)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit[T](NodeCollection`1 collection)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.OnBlock(Block node)
at Boo.Lang.Compiler.Ast.Block.Accept(IAstVisitor visitor)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.ProcessNodeInMethodContext(InternalMethod entity, INamespace ns, Node node)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.ProcessMethodBody(InternalMethod entity, INamespace ns)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.ProcessMethodBody(InternalMethod entity)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.ProcessRegularMethod(Method node)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.OnMethod(Method method)
at Boo.Lang.Compiler.Ast.Method.Accept(IAstVisitor visitor)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node[] array)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit[T](NodeCollection`1 collection)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.VisitTypeDefinition(TypeDefinition node)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.OnClassDefinition(ClassDefinition node)
at Boo.Lang.Compiler.Ast.ClassDefinition.Accept(IAstVisitor visitor)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node[] array)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit[T](NodeCollection`1 collection)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.OnModule(Module module)
at Boo.Lang.Compiler.Ast.Module.Accept(IAstVisitor visitor)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node[] array)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit[T](NodeCollection`1 collection)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.OnCompileUnit(CompileUnit node)
at Boo.Lang.Compiler.Ast.CompileUnit.Accept(IAstVisitor visitor)
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node)
at Boo.Lang.Compiler.Steps.ProcessMethodBodies.Run()
at Boo.Lang.Compiler.CompilerPipeline.RunStep(CompilerContext context, ICompilerStep step)
Turns out it doesn't have anything to do with the others; just some control code which assumed that Assumption() could take an empty list.
Patch attached; passes all the standard tests and this new one.