Rust: Estouro em tipos de contêiner aninhados duplos

Criado em 7 jun. 2016  ·  3Comentários  ·  Fonte: rust-lang/rust

Eu tenho o seguinte código:

https://play.rust-lang.org/?gist=b8c78d5084a9b9ab7c53a2a9faa022af&version=stable&backtrace=0

Como pode ser visto, o # [teste] funciona bem, mas se eu tentar executar um teste de carga nele, obtenho o seguinte erro no doc_test:

falhas:

---- vec :: <& 'um vetor> :: add_0 stdout ----
erro: estouro avaliando o requisito <&_ as std::ops::Add<_>>::Output [E0275]
: 1: 1: 1: 1 nota: considere adicionar um atributo #![recursion_limit="128"] à sua caixa
erro: abortando devido a erro anterior

Parece que a função que falhará depende do compilador. Tenho a impressão de que em casa ambas as implementações de Add for & Vector irão falhar, mas posso estar enganado e irei atualizar este problema quando chegar a casa.

Esta é a versão de ferrugem que estou usando aqui:

rustc 1.10.0-dev (14f61c87f 18/04/2016)
binário: rustc
commit-hash: 14f61c87ff02e57d565d4fab4ce790156c9a596e
data de confirmação: 18/04/2016
host: x86_64-unknown-linux-gnu
lançamento: 1.10.0-dev

A discussão nos fóruns sobre ferrugem pode ser encontrada aqui:
https://users.rust-lang.org/t/weird-problems-with-recursion-in-type-bounds-in-tests-on-libs/6101/4

atualização: me enganei, em casa fico com o mesmo comportamento. Mas como @mbrubeck disse na discussão do fórum, se eu remover os dois últimos Add impls tudo funcionará.

A-typesystem C-bug T-compiler

Todos 3 comentários

Caso seja útil, este programa muito mais curto oferece um comportamento semelhante:
https://play.rust-lang.org/?gist=2f793999729aec2cd8274157f7012e5d&version=stable&backtrace=0

Compare esta versão, que compila e funciona perfeitamente:
https://play.rust-lang.org/?gist=6ff433c8cc94c22985180210cc3a8e7d&version=stable&backtrace=0

Aqui está uma minimização adicional do programa de @ apt1002 :

https://play.rust-lang.org/?gist=0a77e1bd0f8e539d8a85ee30ed63b1f6&version=stable&backtrace=0

Um traço comum em todos esses programas com falha é que existem 2 camadas de "contêinerização", seja & , Vector ou uma estrutura de invólucro.

Boa ideia para remover o absurdo da vida. Muito mais claro.

Acho que ambos cometemos erros! O meu era que "where Target: From <& 'm T>" deveria ter sido " where Target: for <' a> From <& 'a T> ". Acabei de saber disso. O seu é que "(a.0) .0" deve ser " C ((a.0) .0) ".

A mensagem de erro permanece inalterada em ambos os casos, ou seja, ainda parece um bug do compilador. Acho que esses exemplos devem funcionar, mas pelo menos o compilador não está dando a mensagem de erro correta.

Esta página foi útil?
0 / 5 - 0 avaliações