Rust: Débordement sur les types de conteneurs doubles emboîtés

Créé le 7 juin 2016  ·  3Commentaires  ·  Source: rust-lang/rust

J'ai le code suivant:

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

Comme on peut le voir, le #[test] fonctionne bien, mais si j'essaie d'exécuter un test de fret dessus, j'obtiens l'erreur suivante sur le doc_test :

les échecs:

---- vec::<&'un vecteur>::add_0 sortie standard ----
erreur : débordement évaluant l'exigence <&_ as std::ops::Add<_>>::Output [E0275]
:1:1 : 1:1 note : pensez à ajouter un attribut #![recursion_limit="128"] à votre caisse
erreur : abandon en raison d'une erreur précédente

Il semble que la fonction qui échouera dépend du compilateur. J'ai l'impression qu'à la maison, les deux implémentations d'Add for &Vector échoueront, mais je peux me tromper et je mettrai à jour ce problème lorsque je rentrerai chez moi.

C'est la version rouille que j'utilise ici :

rustc 1.10.0-dev (14f61c87f 2016-04-18)
binaire : rouillec
commit-hachage : 14f61c87ff02e57d565d4fab4ce790156c9a596e
date d'engagement : 2016-04-18
hôte : x86_64-unknown-linux-gnu
version : 1.10.0-dev

La discussion sur les forums de rouille peut être trouvée ici:
https://users.rust-lang.org/t/weird-problems-with-recursion-in-type-bounds-in-tests-on-libs/6101/4

mise à jour : je me suis trompé, à la maison j'obtiens le même comportement. Mais comme @mbrubeck l'a dit sur la discussion du forum, si je supprime les deux derniers Add impls, tout fonctionne.

A-typesystem C-bug T-compiler

Tous les 3 commentaires

Au cas où cela serait utile, ce programme beaucoup plus court donne un comportement similaire :
https://play.rust-lang.org/?gist=2f793999729aec2cd8274157f7012e5d&version=stable&backtrace=0

Comparez cette version, qui compile et fonctionne très bien :
https://play.rust-lang.org/?gist=6ff433c8cc94c22985180210cc3a8e7d&version=stable&backtrace=0

Voici une autre minimisation du programme de @apt1002 :

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

Un fil conducteur sur tous ces programmes défaillants est qu'il y a 2 couches de « conteneurisation », que ce soit & , Vector , ou une structure wrapper.

Bonne idée pour supprimer le non-sens à vie. Beaucoup plus clair.

Je pense que nous avons tous les deux fait des erreurs ! Le mien était que "où Target: From<&'m T>" aurait dû être " where Target: for<'a> From<&'a T> ". Je viens juste d'apprendre ça. Le vôtre est que "(a.0).0" devrait être " C((a.0).0) ".

Le message d'erreur est inchangé dans les deux cas, c'est-à-dire qu'il ressemble toujours à un bogue du compilateur. Je pense que ces exemples devraient fonctionner, mais à tout le moins, le compilateur ne donne pas le bon message d'erreur.

Cette page vous a été utile?
0 / 5 - 0 notes