Rust: Diagnóstico inútil cuando se usan macros de proceso 2.0 sin #! [característica (use_extern_macros)]

Creado en 17 abr. 2017  ·  3Comentarios  ·  Fuente: rust-lang/rust

Supongamos que tengo estos dos archivos:

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

Cuando intento compilar estos archivos con rustc foo.rs && rustc bar.rs -L. , obtengo los siguientes errores:

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

Ahora, si sigo los consejos del compilador y pruebo #[macro_use] en su lugar, aparece este error:

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

¡Pero eso es lo que tenía en primer lugar!

La verdadera solución a este problema es agregar #![feature(use_extern_macros)] a bar.rs . El compilador debería sugerir esto en su lugar cuando encuentre una macro de proceso similar a una función.

A-diagnostics A-macros-2.0 C-enhancement

Comentario más útil

Ahora con todas las noches incluso obtengo: warning: this feature has been stable since 1.29.0. Attribute no longer needed por #![feature(proc_macro)] .

Pero sigo teniendo los mismos problemas que @lfairy. Y ahora, si quiero usar mi macro, obtengo error: cannot find macro 'my_macro!' in this scope . Pero si agrego use my_crate::my_macro; obtengo error[E0432]: unresolved import 'my_crate::my_macro' .

Parece que uno ahora necesita reemplazar la característica proc_macro con use_extern_macros . Esa sería una pista útil en el mensaje Attribute is no longer needed ... ;)

Todos 3 comentarios

Podría ser una solución fácil al menos cambiar el mensaje de diagnóstico para sugerir también agregar #![feature(proc_macro)] a bar.rs a corto plazo. (O haga que el diagnóstico primero verifique si esa función está habilitada antes de hacer la sugerencia). No me importa tener una parte redundante de la sugerencia siempre que cubra el problema real también.

Ahora con todas las noches incluso obtengo: warning: this feature has been stable since 1.29.0. Attribute no longer needed por #![feature(proc_macro)] .

Pero sigo teniendo los mismos problemas que @lfairy. Y ahora, si quiero usar mi macro, obtengo error: cannot find macro 'my_macro!' in this scope . Pero si agrego use my_crate::my_macro; obtengo error[E0432]: unresolved import 'my_crate::my_macro' .

Parece que uno ahora necesita reemplazar la característica proc_macro con use_extern_macros . Esa sería una pista útil en el mensaje Attribute is no longer needed ... ;)

Muchas características aquí se han estabilizado, por lo que es probable que esté obsoleto, por lo que se cierra.

¿Fue útil esta página
0 / 5 - 0 calificaciones