Rust: Überlauf bei doppelt verschachtelten Containertypen

Erstellt am 7. Juni 2016  ·  3Kommentare  ·  Quelle: rust-lang/rust

Ich habe folgenden Code:

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

Wie zu sehen ist, funktioniert #[test] gut, aber wenn ich versuche, einen Ladungstest durchzuführen, erhalte ich die folgende Fehlermeldung im doc_test:

Fehler:

---- vec::<&'ein Vektor>::add_0 stdout ----
Fehler: Überlauf bei der Auswertung der Anforderung <&_ as std::ops::Add<_>>::Output [E0275]
:1:1: 1:1 Hinweis: Erwägen Sie, Ihrer Kiste ein #![recursion_limit="128"] Attribut hinzuzufügen
Fehler: Abbruch wegen vorherigen Fehlers

Es scheint, dass die Funktion, die fehlschlägt, vom Compiler abhängt. Ich habe den Eindruck, dass zu Hause beide Implementierungen von Add for &Vector fehlschlagen, aber ich könnte mich irren und dieses Problem aktualisieren, wenn ich zu Hause bin.

Dies ist die Rostversion, die ich hier verwende:

rustc 1.10.0-dev (14f61c87f 2016-04-18)
binär: rost
Commit-Hash: 14f61c87ff02e57d565d4fab4ce790156c9a596e
Zusagedatum: 2016-04-18
host: x86_64-unknown-linux-gnu
Release: 1.10.0-dev

Die Diskussion in den Rostforen finden Sie hier:
https://users.rust-lang.org/t/weird-problems-with-recursion-in-type-bounds-in-tests-on-libs/6101/4

update: Ich habe mich geirrt, zu Hause bekomme ich das gleiche Verhalten. Aber wie @mbrubeck in der Forumsdiskussion sagte, wenn ich die letzten beiden Add-Impls entferne, funktioniert alles.

A-typesystem C-bug T-compiler

Alle 3 Kommentare

Falls es nützlich ist, zeigt dieses viel kürzere Programm ein ähnliches Verhalten:
https://play.rust-lang.org/?gist=2f793999729aec2cd8274157f7012e5d&version=stable&backtrace=0

Vergleichen Sie diese Version, die problemlos kompiliert und ausgeführt wird:
https://play.rust-lang.org/?gist=6ff433c8cc94c22985180210cc3a8e7d&version=stable&backtrace=0

Hier ist eine weitere Minimierung des Programms von @apt1002 :

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

Allen diesen fehlgeschlagenen Programmen ist gemeinsam, dass es zwei Ebenen der "Containerisierung" gibt, sei es & , Vector oder eine Wrapper-Struktur.

Gute Idee, den lebenslangen Unsinn zu entfernen. Viel klarer.

Ich glaube, wir haben beide Fehler gemacht! Meins war, dass "wo Target: From<&'m T>" hätte sein sollen " wo Target: for<'a> From<&'a T> ". Ich habe gerade erst davon erfahren. Bei Ihnen sollte "(a.0).0" " C((a.0).0) " sein.

Die Fehlermeldung ist in beiden Fällen unverändert, dh es sieht immer noch nach einem Compiler-Bug aus. Ich denke, diese Beispiele sollten funktionieren, aber zumindest gibt der Compiler nicht die richtige Fehlermeldung aus.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen