Rust: Diagnostic inutile lors de l'utilisation de macros proc 2.0 sans #![feature(use_extern_macros)]

Créé le 17 avr. 2017  ·  3Commentaires  ·  Source: rust-lang/rust

Supposons que j'ai ces deux fichiers:

// 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!();
}

Lorsque j'essaie de compiler ces fichiers avec rustc foo.rs && rustc bar.rs -L. , j'obtiens les erreurs suivantes :

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

Maintenant, si je suis les conseils du compilateur et que j'essaie #[macro_use] la place, j'obtiens cette erreur :

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

Mais c'est ce que j'avais en premier lieu !

La vraie solution à ce problème est d'ajouter #![feature(use_extern_macros)] à bar.rs . Le compilateur devrait le suggérer à la place lorsqu'il rencontre une macro proc semblable à une fonction.

A-diagnostics A-macros-2.0 C-enhancement

Commentaire le plus utile

Maintenant, avec nightly, j'obtiens même : warning: this feature has been stable since 1.29.0. Attribute no longer needed pour #![feature(proc_macro)] .

Mais j'ai toujours les mêmes problèmes que @lfairy. Et maintenant, si je veux utiliser ma macro, j'obtiens error: cannot find macro 'my_macro!' in this scope . Mais si j'ajoute use my_crate::my_macro; j'obtiens error[E0432]: unresolved import 'my_crate::my_macro' .

Il semble qu'il faille maintenant remplacer la fonctionnalité proc_macro par use_extern_macros . Ce serait un indice utile dans le message Attribute is no longer needed .. ;)

Tous les 3 commentaires

Il pourrait être facile de modifier au moins le message de diagnostic pour suggérer également d'ajouter #![feature(proc_macro)] à bar.rs à court terme. (Ou demandez au diagnostic de vérifier d'abord si cette fonctionnalité est activée avant de faire la suggestion.) Cela ne me dérange pas d'avoir une partie redondante de la suggestion tant qu'elle couvre également le vrai problème.

Maintenant, avec nightly, j'obtiens même : warning: this feature has been stable since 1.29.0. Attribute no longer needed pour #![feature(proc_macro)] .

Mais j'ai toujours les mêmes problèmes que @lfairy. Et maintenant, si je veux utiliser ma macro, j'obtiens error: cannot find macro 'my_macro!' in this scope . Mais si j'ajoute use my_crate::my_macro; j'obtiens error[E0432]: unresolved import 'my_crate::my_macro' .

Il semble qu'il faille maintenant remplacer la fonctionnalité proc_macro par use_extern_macros . Ce serait un indice utile dans le message Attribute is no longer needed .. ;)

De nombreuses fonctionnalités ici ont été stabilisées, donc c'est probablement obsolète, donc fermeture.

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