Still reproducible (2017.11,HEAD(e5b660e))

On 2015-04-01 13:19:33, masak wrote:
> <[Tux]> m: class C { has Int $!x; method foo { ($!x, my $b) =
> (1,2);}};C.foo
> 19:45 <+camelia> rakudo-moar 6caf1d: OUTPUT«Cannot look up attributes
> in a type object␤ in method foo [...]
> <[Tux]> is that explainable?
> <masak> you're calling C.foo, the .foo method on the type object C
> <masak> the type object doesn't really properly have an $!x
> <masak> m: class C { has Int $!x; method foo { ($!x, my $b) =
> (1,2);}}; C.new.foo
> <camelia> rakudo-moar 6caf1d: ( no output )
> <masak> that works.
> <TimToady> "Cannot look up attributes in a type object" is an
> implementor-centric error message, not a user-centric one
> <Juerd> TimToady: "Instance attribute used in non-instance method
> call"? :)
> <masak> TimToady: actually, that error message could fail statically
> in this case.
> <masak> since C is already resolved at compile time.
> <masak> no need to make it survive until runtime and then fail.
> [...]
> <masak> no-one else liked the idea of statically erroring out with
> "call will never work" for the C.foo case where C is already
> statically resolved?
> <nine_> masak: I do
> <Juerd> masak: Could work, but can't methods be marked as instance-
> only?
> <nine_> masak: the earlier errors are reported the better
> <PerlJam> masak: How does the compiler decide that it will never work?
> and when?
> <Juerd> Because then, any use of $!foo could simply mark the method as
> instance-only
> <Juerd> And the error message could be simpler.
> <Juerd> "Method foo can only be called on an instance of C, not on C
> itself."
> <PerlJam> (compiler hints)++ if we can reasonably have them.
> <PerlJam> I guess, if you declare the sig right, all the info is easy
> to get at. But without that, it seems like a bit of guessing for the
> compiler to do it.
> <masak> PerlJam: compiler sees the call C.foo, and has already set a
> flag that the foo method in class C accesses an attribute. boom.
> * masak submits rakudobug
> <Juerd> "Method foo can only be called on an instance of C, not on C
> itself, because C.foo accesses instance attribute $!x."
> <masak> neat. +1
> <PerlJam> masak: flagging methods like that seems like quite a bit of
> bookkeeping for marginal benefit.
> <masak> really? seems worth it to me...
> <masak> it's a small hash somewhere in the compiler.
> <masak> %accattr<C.foo> = True;
> <Juerd> It could be a boolean flag (instance-only) and an array of
> further explanations
> <[Coke]> masak: I think you mean a compile-time static check, not a
> static static check. ;)
> <masak> [Coke]: yes. thank you. I meant... that, what you said.

Reply via email to