Address review comments
Adjust a few fulldeps and pretty-printing tests Fix rebase
This commit is contained in:
@@ -329,6 +329,9 @@ impl<'a, 'crateloader: 'a> base::Resolver for Resolver<'a, 'crateloader> {
|
|||||||
self.report_proc_macro_stub(invoc.span());
|
self.report_proc_macro_stub(invoc.span());
|
||||||
return Err(Determinacy::Determined);
|
return Err(Determinacy::Determined);
|
||||||
} else if let Def::NonMacroAttr(attr_kind) = def {
|
} else if let Def::NonMacroAttr(attr_kind) = def {
|
||||||
|
// Note that not only attributes, but anything in macro namespace can result in a
|
||||||
|
// `Def::NonMacroAttr` definition (e.g. `inline!()`), so we must report the error
|
||||||
|
// below for these cases.
|
||||||
let is_attr_invoc =
|
let is_attr_invoc =
|
||||||
if let InvocationKind::Attr { .. } = invoc.kind { true } else { false };
|
if let InvocationKind::Attr { .. } = invoc.kind { true } else { false };
|
||||||
let path = invoc.path().expect("no path for non-macro attr");
|
let path = invoc.path().expect("no path for non-macro attr");
|
||||||
@@ -604,7 +607,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
|
|||||||
// 3. Builtin attributes (closed, controlled).
|
// 3. Builtin attributes (closed, controlled).
|
||||||
|
|
||||||
assert!(ns == TypeNS || ns == MacroNS);
|
assert!(ns == TypeNS || ns == MacroNS);
|
||||||
let force = force || record_used;
|
assert!(force || !record_used); // `record_used` implies `force`
|
||||||
ident = ident.modern();
|
ident = ident.modern();
|
||||||
|
|
||||||
// Names from inner scope that can't shadow names from outer scopes, e.g.
|
// Names from inner scope that can't shadow names from outer scopes, e.g.
|
||||||
@@ -789,7 +792,10 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
|
|||||||
|
|
||||||
let determinacy = Determinacy::determined(force);
|
let determinacy = Determinacy::determined(force);
|
||||||
if determinacy == Determinacy::Determined && is_attr {
|
if determinacy == Determinacy::Determined && is_attr {
|
||||||
// For attributes interpret determinate "no solution" as a custom attribute.
|
// For single-segment attributes interpret determinate "no resolution" as a custom
|
||||||
|
// attribute. (Lexical resolution implies the first segment and is_attr should imply
|
||||||
|
// the last segment, so we are certainly working with a single-segment attribute here.)
|
||||||
|
assert!(ns == MacroNS);
|
||||||
let binding = (Def::NonMacroAttr(NonMacroAttrKind::Custom),
|
let binding = (Def::NonMacroAttr(NonMacroAttrKind::Custom),
|
||||||
ty::Visibility::Public, ident.span, Mark::root())
|
ty::Visibility::Public, ident.span, Mark::root())
|
||||||
.to_name_binding(self.arenas);
|
.to_name_binding(self.arenas);
|
||||||
|
|||||||
@@ -516,6 +516,15 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn expand_invoc(&mut self, invoc: Invocation, ext: &SyntaxExtension) -> Option<AstFragment> {
|
fn expand_invoc(&mut self, invoc: Invocation, ext: &SyntaxExtension) -> Option<AstFragment> {
|
||||||
|
if invoc.fragment_kind == AstFragmentKind::ForeignItems &&
|
||||||
|
!self.cx.ecfg.macros_in_extern_enabled() {
|
||||||
|
if let SyntaxExtension::NonMacroAttr { .. } = *ext {} else {
|
||||||
|
emit_feature_err(&self.cx.parse_sess, "macros_in_extern",
|
||||||
|
invoc.span(), GateIssue::Language,
|
||||||
|
"macro invocations in `extern {}` blocks are experimental");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let result = match invoc.kind {
|
let result = match invoc.kind {
|
||||||
InvocationKind::Bang { .. } => self.expand_bang_invoc(invoc, ext)?,
|
InvocationKind::Bang { .. } => self.expand_bang_invoc(invoc, ext)?,
|
||||||
InvocationKind::Attr { .. } => self.expand_attr_invoc(invoc, ext)?,
|
InvocationKind::Attr { .. } => self.expand_attr_invoc(invoc, ext)?,
|
||||||
@@ -549,6 +558,8 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if let NonMacroAttr { mark_used: false } = *ext {} else {
|
if let NonMacroAttr { mark_used: false } = *ext {} else {
|
||||||
|
// Macro attrs are always used when expanded,
|
||||||
|
// non-macro attrs are considered used when the field says so.
|
||||||
attr::mark_used(&attr);
|
attr::mark_used(&attr);
|
||||||
}
|
}
|
||||||
invoc.expansion_data.mark.set_expn_info(ExpnInfo {
|
invoc.expansion_data.mark.set_expn_info(ExpnInfo {
|
||||||
@@ -1482,21 +1493,7 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
|
|||||||
foreign_item: ast::ForeignItem) -> SmallVector<ast::ForeignItem> {
|
foreign_item: ast::ForeignItem) -> SmallVector<ast::ForeignItem> {
|
||||||
let (attr, traits, foreign_item) = self.classify_item(foreign_item);
|
let (attr, traits, foreign_item) = self.classify_item(foreign_item);
|
||||||
|
|
||||||
let explain = if self.cx.ecfg.use_extern_macros_enabled() {
|
if attr.is_some() || !traits.is_empty() {
|
||||||
feature_gate::EXPLAIN_PROC_MACROS_IN_EXTERN
|
|
||||||
} else {
|
|
||||||
feature_gate::EXPLAIN_MACROS_IN_EXTERN
|
|
||||||
};
|
|
||||||
|
|
||||||
if attr.is_some() || !traits.is_empty() {
|
|
||||||
if !self.cx.ecfg.macros_in_extern_enabled() &&
|
|
||||||
!self.cx.ecfg.custom_attribute_enabled() {
|
|
||||||
if let Some(ref attr) = attr {
|
|
||||||
emit_feature_err(&self.cx.parse_sess, "macros_in_extern", attr.span,
|
|
||||||
GateIssue::Language, explain);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let item = Annotatable::ForeignItem(P(foreign_item));
|
let item = Annotatable::ForeignItem(P(foreign_item));
|
||||||
return self.collect_attr(attr, traits, item, AstFragmentKind::ForeignItems)
|
return self.collect_attr(attr, traits, item, AstFragmentKind::ForeignItems)
|
||||||
.make_foreign_items();
|
.make_foreign_items();
|
||||||
@@ -1504,12 +1501,6 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
|
|||||||
|
|
||||||
if let ast::ForeignItemKind::Macro(mac) = foreign_item.node {
|
if let ast::ForeignItemKind::Macro(mac) = foreign_item.node {
|
||||||
self.check_attributes(&foreign_item.attrs);
|
self.check_attributes(&foreign_item.attrs);
|
||||||
|
|
||||||
if !self.cx.ecfg.macros_in_extern_enabled() {
|
|
||||||
emit_feature_err(&self.cx.parse_sess, "macros_in_extern", foreign_item.span,
|
|
||||||
GateIssue::Language, explain);
|
|
||||||
}
|
|
||||||
|
|
||||||
return self.collect_bang(mac, foreign_item.span, AstFragmentKind::ForeignItems)
|
return self.collect_bang(mac, foreign_item.span, AstFragmentKind::ForeignItems)
|
||||||
.make_foreign_items();
|
.make_foreign_items();
|
||||||
}
|
}
|
||||||
@@ -1671,7 +1662,6 @@ impl<'feat> ExpansionConfig<'feat> {
|
|||||||
fn enable_custom_derive = custom_derive,
|
fn enable_custom_derive = custom_derive,
|
||||||
fn enable_format_args_nl = format_args_nl,
|
fn enable_format_args_nl = format_args_nl,
|
||||||
fn macros_in_extern_enabled = macros_in_extern,
|
fn macros_in_extern_enabled = macros_in_extern,
|
||||||
fn custom_attribute_enabled = custom_attribute,
|
|
||||||
fn proc_macro_mod = proc_macro_mod,
|
fn proc_macro_mod = proc_macro_mod,
|
||||||
fn proc_macro_gen = proc_macro_gen,
|
fn proc_macro_gen = proc_macro_gen,
|
||||||
fn proc_macro_expr = proc_macro_expr,
|
fn proc_macro_expr = proc_macro_expr,
|
||||||
|
|||||||
@@ -1354,13 +1354,6 @@ pub const EXPLAIN_UNSIZED_TUPLE_COERCION: &'static str =
|
|||||||
pub const EXPLAIN_MACRO_AT_MOST_ONCE_REP: &'static str =
|
pub const EXPLAIN_MACRO_AT_MOST_ONCE_REP: &'static str =
|
||||||
"using the `?` macro Kleene operator for \"at most one\" repetition is unstable";
|
"using the `?` macro Kleene operator for \"at most one\" repetition is unstable";
|
||||||
|
|
||||||
pub const EXPLAIN_MACROS_IN_EXTERN: &'static str =
|
|
||||||
"macro invocations in `extern {}` blocks are experimental.";
|
|
||||||
|
|
||||||
// mention proc-macros when enabled
|
|
||||||
pub const EXPLAIN_PROC_MACROS_IN_EXTERN: &'static str =
|
|
||||||
"macro and proc-macro invocations in `extern {}` blocks are experimental.";
|
|
||||||
|
|
||||||
struct PostExpansionVisitor<'a> {
|
struct PostExpansionVisitor<'a> {
|
||||||
context: &'a Context<'a>,
|
context: &'a Context<'a>,
|
||||||
}
|
}
|
||||||
@@ -1969,7 +1962,6 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
|
|||||||
).emit();
|
).emit();
|
||||||
} else {
|
} else {
|
||||||
set(&mut features, mi.span);
|
set(&mut features, mi.span);
|
||||||
feature_checker.collect(&features, mi.span);
|
|
||||||
features.declared_lang_features.push((name, mi.span, None));
|
features.declared_lang_features.push((name, mi.span, None));
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
#![feature(use_extern_macros)]
|
#![feature(use_extern_macros)]
|
||||||
#![emit_unchanged]
|
#![emit_unchanged]
|
||||||
//~^ ERROR: cannot find attribute macro `emit_unchanged` in this scope
|
//~^ ERROR attribute `emit_unchanged` is currently unknown to the compiler
|
||||||
extern crate issue_41211;
|
extern crate issue_41211;
|
||||||
use issue_41211::emit_unchanged;
|
use issue_41211::emit_unchanged;
|
||||||
|
|
||||||
|
|||||||
@@ -26,13 +26,13 @@ fn main() {
|
|||||||
#[link(name = "rust_test_helpers", kind = "static")]
|
#[link(name = "rust_test_helpers", kind = "static")]
|
||||||
extern {
|
extern {
|
||||||
#[no_output]
|
#[no_output]
|
||||||
//~^ ERROR macro and proc-macro invocations in `extern {}` blocks are experimental.
|
//~^ ERROR macro invocations in `extern {}` blocks are experimental
|
||||||
fn some_definitely_unknown_symbol_which_should_be_removed();
|
fn some_definitely_unknown_symbol_which_should_be_removed();
|
||||||
|
|
||||||
#[nop_attr]
|
#[nop_attr]
|
||||||
//~^ ERROR macro and proc-macro invocations in `extern {}` blocks are experimental.
|
//~^ ERROR macro invocations in `extern {}` blocks are experimental
|
||||||
fn rust_get_test_int() -> isize;
|
fn rust_get_test_int() -> isize;
|
||||||
|
|
||||||
emit_input!(fn rust_dbg_extern_identity_u32(arg: u32) -> u32;);
|
emit_input!(fn rust_dbg_extern_identity_u32(arg: u32) -> u32;);
|
||||||
//~^ ERROR macro and proc-macro invocations in `extern {}` blocks are experimental.
|
//~^ ERROR macro invocations in `extern {}` blocks are experimental
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,9 +34,9 @@ fn main() {
|
|||||||
#[link(name = "rust_test_helpers", kind = "static")]
|
#[link(name = "rust_test_helpers", kind = "static")]
|
||||||
extern {
|
extern {
|
||||||
returns_isize!(rust_get_test_int);
|
returns_isize!(rust_get_test_int);
|
||||||
//~^ ERROR macro invocations in `extern {}` blocks are experimental.
|
//~^ ERROR macro invocations in `extern {}` blocks are experimental
|
||||||
takes_u32_returns_u32!(rust_dbg_extern_identity_u32);
|
takes_u32_returns_u32!(rust_dbg_extern_identity_u32);
|
||||||
//~^ ERROR macro invocations in `extern {}` blocks are experimental.
|
//~^ ERROR macro invocations in `extern {}` blocks are experimental
|
||||||
emits_nothing!();
|
emits_nothing!();
|
||||||
//~^ ERROR macro invocations in `extern {}` blocks are experimental.
|
//~^ ERROR macro invocations in `extern {}` blocks are experimental
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,6 @@ fn main() {
|
|||||||
#[align = 8]
|
#[align = 8]
|
||||||
fn f() { }
|
fn f() { }
|
||||||
|
|
||||||
#[vec(1, 2, 3)]
|
#[vector(1, 2, 3)]
|
||||||
fn g() { }
|
fn g() { }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
// aux-build:attr_proc_macro.rs
|
// aux-build:attr_proc_macro.rs
|
||||||
// aux-build:bang_proc_macro.rs
|
// aux-build:bang_proc_macro.rs
|
||||||
|
|
||||||
#![feature(use_extern_macros)]
|
#![feature(custom_attribute)]
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate derive_foo;
|
extern crate derive_foo;
|
||||||
@@ -37,12 +37,10 @@ macro_rules! attr_proc_mac {
|
|||||||
//~^ ERROR cannot find
|
//~^ ERROR cannot find
|
||||||
struct Foo;
|
struct Foo;
|
||||||
|
|
||||||
#[attr_proc_macra]
|
#[attr_proc_macra] // OK, interpreted as a custom attribute
|
||||||
//~^ ERROR cannot find
|
|
||||||
struct Bar;
|
struct Bar;
|
||||||
|
|
||||||
#[FooWithLongNan]
|
#[FooWithLongNan] // OK, interpreted as a custom attribute
|
||||||
//~^ ERROR cannot find
|
|
||||||
struct Asdf;
|
struct Asdf;
|
||||||
|
|
||||||
#[derive(Dlone)]
|
#[derive(Dlone)]
|
||||||
|
|||||||
@@ -4,59 +4,47 @@ error: cannot find derive macro `FooWithLongNan` in this scope
|
|||||||
LL | #[derive(FooWithLongNan)]
|
LL | #[derive(FooWithLongNan)]
|
||||||
| ^^^^^^^^^^^^^^ help: try: `FooWithLongName`
|
| ^^^^^^^^^^^^^^ help: try: `FooWithLongName`
|
||||||
|
|
||||||
error: cannot find attribute macro `attr_proc_macra` in this scope
|
|
||||||
--> $DIR/resolve-error.rs:40:3
|
|
||||||
|
|
|
||||||
LL | #[attr_proc_macra]
|
|
||||||
| ^^^^^^^^^^^^^^^ help: try: `attr_proc_macro`
|
|
||||||
|
|
||||||
error: cannot find attribute macro `FooWithLongNan` in this scope
|
|
||||||
--> $DIR/resolve-error.rs:44:3
|
|
||||||
|
|
|
||||||
LL | #[FooWithLongNan]
|
|
||||||
| ^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error: cannot find derive macro `Dlone` in this scope
|
error: cannot find derive macro `Dlone` in this scope
|
||||||
--> $DIR/resolve-error.rs:48:10
|
--> $DIR/resolve-error.rs:46:10
|
||||||
|
|
|
|
||||||
LL | #[derive(Dlone)]
|
LL | #[derive(Dlone)]
|
||||||
| ^^^^^ help: try: `Clone`
|
| ^^^^^ help: try: `Clone`
|
||||||
|
|
||||||
error: cannot find derive macro `Dlona` in this scope
|
error: cannot find derive macro `Dlona` in this scope
|
||||||
--> $DIR/resolve-error.rs:52:10
|
--> $DIR/resolve-error.rs:50:10
|
||||||
|
|
|
|
||||||
LL | #[derive(Dlona)]
|
LL | #[derive(Dlona)]
|
||||||
| ^^^^^ help: try: `Clona`
|
| ^^^^^ help: try: `Clona`
|
||||||
|
|
||||||
error: cannot find derive macro `attr_proc_macra` in this scope
|
error: cannot find derive macro `attr_proc_macra` in this scope
|
||||||
--> $DIR/resolve-error.rs:56:10
|
--> $DIR/resolve-error.rs:54:10
|
||||||
|
|
|
|
||||||
LL | #[derive(attr_proc_macra)]
|
LL | #[derive(attr_proc_macra)]
|
||||||
| ^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: cannot find macro `FooWithLongNama!` in this scope
|
error: cannot find macro `FooWithLongNama!` in this scope
|
||||||
--> $DIR/resolve-error.rs:61:5
|
--> $DIR/resolve-error.rs:59:5
|
||||||
|
|
|
|
||||||
LL | FooWithLongNama!();
|
LL | FooWithLongNama!();
|
||||||
| ^^^^^^^^^^^^^^^ help: you could try the macro: `FooWithLongNam`
|
| ^^^^^^^^^^^^^^^ help: you could try the macro: `FooWithLongNam`
|
||||||
|
|
||||||
error: cannot find macro `attr_proc_macra!` in this scope
|
error: cannot find macro `attr_proc_macra!` in this scope
|
||||||
--> $DIR/resolve-error.rs:64:5
|
--> $DIR/resolve-error.rs:62:5
|
||||||
|
|
|
|
||||||
LL | attr_proc_macra!();
|
LL | attr_proc_macra!();
|
||||||
| ^^^^^^^^^^^^^^^ help: you could try the macro: `attr_proc_mac`
|
| ^^^^^^^^^^^^^^^ help: you could try the macro: `attr_proc_mac`
|
||||||
|
|
||||||
error: cannot find macro `Dlona!` in this scope
|
error: cannot find macro `Dlona!` in this scope
|
||||||
--> $DIR/resolve-error.rs:67:5
|
--> $DIR/resolve-error.rs:65:5
|
||||||
|
|
|
|
||||||
LL | Dlona!();
|
LL | Dlona!();
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
error: cannot find macro `bang_proc_macrp!` in this scope
|
error: cannot find macro `bang_proc_macrp!` in this scope
|
||||||
--> $DIR/resolve-error.rs:70:5
|
--> $DIR/resolve-error.rs:68:5
|
||||||
|
|
|
|
||||||
LL | bang_proc_macrp!();
|
LL | bang_proc_macrp!();
|
||||||
| ^^^^^^^^^^^^^^^ help: you could try the macro: `bang_proc_macro`
|
| ^^^^^^^^^^^^^^^ help: you could try the macro: `bang_proc_macro`
|
||||||
|
|
||||||
error: aborting due to 10 previous errors
|
error: aborting due to 8 previous errors
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
|
||||||
// file at the top-level directory of this distribution and at
|
// file at the top-level directory of this distribution and at
|
||||||
// http://rust-lang.org/COPYRIGHT.
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
//
|
//
|
||||||
@@ -8,18 +8,11 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
// aux-build:attr_proc_macro.rs
|
// Unresolved multi-segment attributes are not treated as custom.
|
||||||
// ignore-tidy-linelength
|
|
||||||
|
|
||||||
#![feature(custom_attribute)]
|
#![feature(custom_attribute, proc_macro_path_invoc)]
|
||||||
//~^ ERROR Cannot use `#![feature(use_extern_macros)]` and `#![feature(custom_attribute)] at the same time
|
|
||||||
|
|
||||||
extern crate attr_proc_macro;
|
mod existent {}
|
||||||
use attr_proc_macro::attr_proc_macro;
|
|
||||||
|
|
||||||
#[attr_proc_macro]
|
#[existent::nonexistent] //~ ERROR failed to resolve. Could not find `nonexistent` in `existent`
|
||||||
fn foo() {}
|
fn main() {}
|
||||||
|
|
||||||
fn main() {
|
|
||||||
foo();
|
|
||||||
}
|
|
||||||
9
src/test/ui/custom-attribute-multisegment.stderr
Normal file
9
src/test/ui/custom-attribute-multisegment.stderr
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
error[E0433]: failed to resolve. Could not find `nonexistent` in `existent`
|
||||||
|
--> $DIR/custom-attribute-multisegment.rs:17:13
|
||||||
|
|
|
||||||
|
LL | #[existent::nonexistent] //~ ERROR failed to resolve. Could not find `nonexistent` in `existent`
|
||||||
|
| ^^^^^^^^^^^ Could not find `nonexistent` in `existent`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0433`.
|
||||||
@@ -27,9 +27,9 @@ macro_rules! emits_nothing(
|
|||||||
#[link(name = "rust_test_helpers", kind = "static")]
|
#[link(name = "rust_test_helpers", kind = "static")]
|
||||||
extern {
|
extern {
|
||||||
returns_isize!(rust_get_test_int);
|
returns_isize!(rust_get_test_int);
|
||||||
//~^ ERROR macro invocations in `extern {}` blocks are experimental.
|
//~^ ERROR macro invocations in `extern {}` blocks are experimental
|
||||||
takes_u32_returns_u32!(rust_dbg_extern_identity_u32);
|
takes_u32_returns_u32!(rust_dbg_extern_identity_u32);
|
||||||
//~^ ERROR macro invocations in `extern {}` blocks are experimental.
|
//~^ ERROR macro invocations in `extern {}` blocks are experimental
|
||||||
emits_nothing!();
|
emits_nothing!();
|
||||||
//~^ ERROR macro invocations in `extern {}` blocks are experimental.
|
//~^ ERROR macro invocations in `extern {}` blocks are experimental
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
error[E0658]: macro and proc-macro invocations in `extern {}` blocks are experimental. (see issue #49476)
|
error[E0658]: macro invocations in `extern {}` blocks are experimental (see issue #49476)
|
||||||
--> $DIR/feature-gate-macros_in_extern.rs:29:5
|
--> $DIR/feature-gate-macros_in_extern.rs:29:5
|
||||||
|
|
|
|
||||||
LL | returns_isize!(rust_get_test_int);
|
LL | returns_isize!(rust_get_test_int);
|
||||||
@@ -6,7 +6,7 @@ LL | returns_isize!(rust_get_test_int);
|
|||||||
|
|
|
|
||||||
= help: add #![feature(macros_in_extern)] to the crate attributes to enable
|
= help: add #![feature(macros_in_extern)] to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: macro and proc-macro invocations in `extern {}` blocks are experimental. (see issue #49476)
|
error[E0658]: macro invocations in `extern {}` blocks are experimental (see issue #49476)
|
||||||
--> $DIR/feature-gate-macros_in_extern.rs:31:5
|
--> $DIR/feature-gate-macros_in_extern.rs:31:5
|
||||||
|
|
|
|
||||||
LL | takes_u32_returns_u32!(rust_dbg_extern_identity_u32);
|
LL | takes_u32_returns_u32!(rust_dbg_extern_identity_u32);
|
||||||
@@ -14,7 +14,7 @@ LL | takes_u32_returns_u32!(rust_dbg_extern_identity_u32);
|
|||||||
|
|
|
|
||||||
= help: add #![feature(macros_in_extern)] to the crate attributes to enable
|
= help: add #![feature(macros_in_extern)] to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: macro and proc-macro invocations in `extern {}` blocks are experimental. (see issue #49476)
|
error[E0658]: macro invocations in `extern {}` blocks are experimental (see issue #49476)
|
||||||
--> $DIR/feature-gate-macros_in_extern.rs:33:5
|
--> $DIR/feature-gate-macros_in_extern.rs:33:5
|
||||||
|
|
|
|
||||||
LL | emits_nothing!();
|
LL | emits_nothing!();
|
||||||
|
|||||||
Reference in New Issue
Block a user