Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/macro_expansion_tests/mbe/regression.rs')
-rw-r--r--crates/hir-def/src/macro_expansion_tests/mbe/regression.rs96
1 files changed, 78 insertions, 18 deletions
diff --git a/crates/hir-def/src/macro_expansion_tests/mbe/regression.rs b/crates/hir-def/src/macro_expansion_tests/mbe/regression.rs
index 9010050ee6..71ba497217 100644
--- a/crates/hir-def/src/macro_expansion_tests/mbe/regression.rs
+++ b/crates/hir-def/src/macro_expansion_tests/mbe/regression.rs
@@ -13,37 +13,97 @@ fn test_vec() {
check(
r#"
macro_rules! vec {
- ($($item:expr),*) => {{
- let mut v = Vec::new();
- $( v.push($item); )*
- v
- }};
+ () => (
+ $crate::__rust_force_expr!($crate::vec::Vec::new())
+ );
+ ($elem:expr; $n:expr) => (
+ $crate::__rust_force_expr!($crate::vec::from_elem($elem, $n))
+ );
+ ($($x:expr),+ $(,)?) => (
+ $crate::__rust_force_expr!(<[_]>::into_vec(
+ // This rustc_box is not required, but it produces a dramatic improvement in compile
+ // time when constructing arrays with many elements.
+ #[rustc_box]
+ $crate::boxed::Box::new([$($x),+])
+ ))
+ );
+}
+
+macro_rules! __rust_force_expr {
+ ($e:expr) => {
+ $e
+ };
}
+
fn main() {
vec!();
vec![1u32,2];
+ vec![a.];
}
"#,
expect![[r#"
macro_rules! vec {
- ($($item:expr),*) => {{
- let mut v = Vec::new();
- $( v.push($item); )*
- v
- }};
+ () => (
+ $crate::__rust_force_expr!($crate::vec::Vec::new())
+ );
+ ($elem:expr; $n:expr) => (
+ $crate::__rust_force_expr!($crate::vec::from_elem($elem, $n))
+ );
+ ($($x:expr),+ $(,)?) => (
+ $crate::__rust_force_expr!(<[_]>::into_vec(
+ // This rustc_box is not required, but it produces a dramatic improvement in compile
+ // time when constructing arrays with many elements.
+ #[rustc_box]
+ $crate::boxed::Box::new([$($x),+])
+ ))
+ );
+}
+
+macro_rules! __rust_force_expr {
+ ($e:expr) => {
+ $e
+ };
}
+
fn main() {
- {
- let mut v = Vec::new();
- v
+ $crate::__rust_force_expr!($crate:: vec:: Vec:: new());
+ $crate::__rust_force_expr!(<[_]>:: into_vec(#[rustc_box]$crate:: boxed:: Box:: new([1u32, 2])));
+ /* error: expected Expr */$crate::__rust_force_expr!($crate:: vec:: from_elem((a.), $n));
+}
+"#]],
+ );
+ // FIXME we should ahev testing infra for multi level expansion tests
+ check(
+ r#"
+macro_rules! __rust_force_expr {
+ ($e:expr) => {
+ $e
};
- {
- let mut v = Vec::new();
- v.push(1u32);
- v.push(2);
- v
+}
+
+fn main() {
+ __rust_force_expr!(crate:: vec:: Vec:: new());
+ __rust_force_expr!(<[_]>:: into_vec(#[rustc_box] crate:: boxed:: Box:: new([1u32, 2])));
+ __rust_force_expr/*+errors*/!(crate:: vec:: from_elem((a.), $n));
+}
+"#,
+ expect![[r#"
+macro_rules! __rust_force_expr {
+ ($e:expr) => {
+ $e
};
}
+
+fn main() {
+ (crate ::vec::Vec::new());
+ (<[_]>::into_vec(#[rustc_box] crate ::boxed::Box::new([1u32, 2])));
+ /* error: expected Expr *//* parse error: expected field name or number */
+/* parse error: expected expression */
+/* parse error: expected R_PAREN */
+/* parse error: expected COMMA */
+/* parse error: expected expression, item or let statement */
+(crate ::vec::from_elem((a.), $n));
+}
"#]],
);
}