Rust: Nicht hilfreiche Diagnose bei Verwendung von proc-Makros 2.0 ohne #![feature(use_extern_macros)]

Erstellt am 17. Apr. 2017  ·  3Kommentare  ·  Quelle: rust-lang/rust

Angenommen, ich hätte diese beiden Dateien:

// foo.rs
#![crate_type = "proc-macro"]

extern crate proc_macro;
use proc_macro::TokenStream;

#[proc_macro]
pub fn foo(x: TokenStream) -> TokenStream {
    x
}
// bar.rs
extern crate foo;
use foo::foo;

fn main() {
    foo!();
}

Wenn ich versuche, diese Dateien mit rustc foo.rs && rustc bar.rs -L. zu kompilieren, erhalte ich die folgenden Fehler:

warning: proc macro crates and `#[no_link]` crates have no effect without `#[macro_use]`
 --> bar.rs:1:1
  |
1 | extern crate foo;
  | ^^^^^^^^^^^^^^^^^

error[E0432]: unresolved import `foo::foo`
 --> bar.rs:2:5
  |
2 | use foo::foo;
  |     ^^^^^^^^ no `foo` in the root

error: cannot find macro `foo!` in this scope
 --> bar.rs:5:5
  |
5 |     foo!();
  |     ^^^

error: aborting due to 2 previous errors

Wenn ich jetzt dem Rat des Compilers folge und stattdessen #[macro_use] versuche, wird mir dieser Fehler angezeigt:

error: procedural macros cannot be imported with `#[macro_use]`
 --> bar.rs:5:5
  |
5 |     foo!();
  |     ^^^
  |
  = help: instead, import the procedural macro like any other item: `use foo::foo;`

error: aborting due to previous error

Aber das war es, was ich in erster Linie hatte!

Die wirkliche Lösung für dieses Problem besteht darin, #![feature(use_extern_macros)] zu bar.rs hinzuzufügen. Der Compiler sollte dies stattdessen vorschlagen, wenn er auf ein funktionsähnliches proc-Makro trifft.

A-diagnostics A-macros-2.0 C-enhancement

Hilfreichster Kommentar

Jetzt mit nightly bekomme ich sogar: warning: this feature has been stable since 1.29.0. Attribute no longer needed für #![feature(proc_macro)] .

Aber ich habe immer noch die gleichen Probleme wie @lfairy. Und jetzt, wenn ich mein Makro verwenden möchte, bekomme ich error: cannot find macro 'my_macro!' in this scope . Aber wenn ich use my_crate::my_macro; hinzufüge, bekomme ich error[E0432]: unresolved import 'my_crate::my_macro' .

Es scheint, dass man jetzt das Feature proc_macro durch use_extern_macros ersetzen muss . Das wäre ein hilfreicher Hinweis in der Attribute is no longer needed Nachricht.. ;)

Alle 3 Kommentare

Es könnte eine einfache Lösung sein, zumindest die Diagnosemeldung so zu ändern, dass auch kurzfristig vorgeschlagen wird, #![feature(proc_macro)] zu bar.rs hinzuzufügen. (Oder lassen Sie die Diagnose zuerst prüfen, ob diese Funktion aktiviert ist, bevor Sie den Vorschlag machen.) Es macht mir nichts aus, einen redundanten Teil des Vorschlags zu haben, solange er auch das eigentliche Problem abdeckt.

Jetzt mit nightly bekomme ich sogar: warning: this feature has been stable since 1.29.0. Attribute no longer needed für #![feature(proc_macro)] .

Aber ich habe immer noch die gleichen Probleme wie @lfairy. Und jetzt, wenn ich mein Makro verwenden möchte, bekomme ich error: cannot find macro 'my_macro!' in this scope . Aber wenn ich use my_crate::my_macro; hinzufüge, bekomme ich error[E0432]: unresolved import 'my_crate::my_macro' .

Es scheint, dass man jetzt das Feature proc_macro durch use_extern_macros ersetzen muss . Das wäre ein hilfreicher Hinweis in der Attribute is no longer needed Nachricht.. ;)

Viele Funktionen hier wurden stabilisiert, daher ist dies wahrscheinlich veraltet, also schließen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen