mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-14 17:48:10 +00:00
226edf64fa
Attribute values must be literals. The error you get when that doesn't hold is pretty bad, e.g.: ``` unexpected expression: 1 + 1 ``` You also get the same error if the attribute value is a literal, but an invalid literal, e.g.: ``` unexpected expression: "foo"suffix ``` This commit does two things. - Changes the error message to "attribute value must be a literal", which gives a better idea of what the problem is and how to fix it. It also no longer prints the invalid expression, because the carets below highlight it anyway. - Separates the "not a literal" case from the "invalid literal" case. Which means invalid literals now get the specific error at the literal level, rather than at the attribute level.
56 lines
1.2 KiB
Rust
56 lines
1.2 KiB
Rust
// Regression tests for issue #55414, expansion happens in the value of a key-value attribute,
|
|
// and the expanded expression is more complex than simply a macro call.
|
|
|
|
// aux-build:key-value-expansion.rs
|
|
|
|
#![feature(rustc_attrs)]
|
|
|
|
extern crate key_value_expansion;
|
|
|
|
// Minimized test case.
|
|
|
|
macro_rules! bug {
|
|
($expr:expr) => {
|
|
#[rustc_dummy = $expr] // Any key-value attribute, not necessarily `doc`
|
|
struct S;
|
|
};
|
|
}
|
|
|
|
// Any expressions containing macro call `X` that's more complex than `X` itself.
|
|
// Parentheses will work.
|
|
bug!((column!())); //~ ERROR attribute value must be a literal
|
|
|
|
// Original test case.
|
|
|
|
macro_rules! bug {
|
|
() => {
|
|
bug!("bug" + stringify!(found)); //~ ERROR attribute value must be a literal
|
|
};
|
|
($test:expr) => {
|
|
#[doc = $test]
|
|
struct Test {}
|
|
};
|
|
}
|
|
|
|
bug!();
|
|
|
|
// Test case from #66804.
|
|
|
|
macro_rules! doc_comment {
|
|
($x:expr) => {
|
|
#[doc = $x]
|
|
extern {}
|
|
};
|
|
}
|
|
|
|
macro_rules! some_macro {
|
|
($t1: ty) => {
|
|
doc_comment! {format!("{coor}", coor = stringify!($t1)).as_str()}
|
|
//~^ ERROR attribute value must be a literal
|
|
};
|
|
}
|
|
|
|
some_macro!(u8);
|
|
|
|
fn main() {}
|