Rust: Diagnóstico inútil ao usar macros proc 2.0 sem #![feature(use_extern_macros)]

Criado em 17 abr. 2017  ·  3Comentários  ·  Fonte: rust-lang/rust

Suponha que eu tenha esses dois arquivos:

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

Quando tento compilar esses arquivos com rustc foo.rs && rustc bar.rs -L. , recebo os seguintes erros:

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

Agora, se eu seguir o conselho do compilador e tentar #[macro_use] , recebo este erro:

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

Mas isso é o que eu tinha em primeiro lugar!

A solução real para este problema é adicionar #![feature(use_extern_macros)] a bar.rs . O compilador deve sugerir isso quando encontrar uma macro proc do tipo função.

A-diagnostics A-macros-2.0 C-enhancement

Comentários muito úteis

Agora com todas as noites eu até recebo: warning: this feature has been stable since 1.29.0. Attribute no longer needed por #![feature(proc_macro)] .

Mas ainda tenho os mesmos problemas que @lfary. E agora, se eu quiser usar minha macro, recebo error: cannot find macro 'my_macro!' in this scope . Mas se eu adicionar use my_crate::my_macro; eu recebo error[E0432]: unresolved import 'my_crate::my_macro' .

Parece que agora é necessário substituir o recurso proc_macro por use_extern_macros . Isso seria uma dica útil na mensagem Attribute is no longer needed .. ;)

Todos 3 comentários

Pode ser uma solução fácil, pelo menos, alterar a mensagem de diagnóstico para sugerir também a adição de #![feature(proc_macro)] a bar.rs para o curto prazo. (Ou faça o diagnóstico primeiro verificar se esse recurso está habilitado antes de fazer a sugestão.) Não me importo de ter uma parte redundante da sugestão, desde que ela cubra o problema real também.

Agora com todas as noites eu até recebo: warning: this feature has been stable since 1.29.0. Attribute no longer needed por #![feature(proc_macro)] .

Mas ainda tenho os mesmos problemas que @lfary. E agora, se eu quiser usar minha macro, recebo error: cannot find macro 'my_macro!' in this scope . Mas se eu adicionar use my_crate::my_macro; eu recebo error[E0432]: unresolved import 'my_crate::my_macro' .

Parece que agora é necessário substituir o recurso proc_macro por use_extern_macros . Isso seria uma dica útil na mensagem Attribute is no longer needed .. ;)

Muitos recursos aqui foram estabilizados, então isso provavelmente está obsoleto, então fechando.

Esta página foi útil?
0 / 5 - 0 avaliações