forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of rust-lang#63083 - matthewjasper:parameter-hygiene, r=…
…petrochenkov Make generic parameters always use modern hygiene * E0263 (lifetime parameter declared twice in the same scope) now compares modernized identifiers. * Const parameters are now resolved with modern hygiene. Closes rust-lang#58307 Closes rust-lang#60746 Closes rust-lang#61574 Closes rust-lang#62433
- Loading branch information
Showing
9 changed files
with
213 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
// Ensure that lifetime parameter names are modernized before we check for | ||
// duplicates. | ||
|
||
#![feature(decl_macro, rustc_attrs)] | ||
|
||
#[rustc_macro_transparency = "semitransparent"] | ||
macro m($a:lifetime) { | ||
fn g<$a, 'a>() {} //~ ERROR lifetime name `'a` declared twice | ||
} | ||
|
||
#[rustc_macro_transparency = "transparent"] | ||
macro n($a:lifetime) { | ||
fn h<$a, 'a>() {} //~ ERROR lifetime name `'a` declared twice | ||
} | ||
|
||
m!('a); | ||
n!('a); | ||
|
||
fn main() {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
error[E0263]: lifetime name `'a` declared twice in the same scope | ||
--> $DIR/duplicate_lifetimes.rs:8:14 | ||
| | ||
LL | fn g<$a, 'a>() {} | ||
| ^^ declared twice | ||
... | ||
LL | m!('a); | ||
| ------- | ||
| | | | ||
| | previous declaration here | ||
| in this macro invocation | ||
|
||
error[E0263]: lifetime name `'a` declared twice in the same scope | ||
--> $DIR/duplicate_lifetimes.rs:13:14 | ||
| | ||
LL | fn h<$a, 'a>() {} | ||
| ^^ declared twice | ||
... | ||
LL | n!('a); | ||
| ------- | ||
| | | | ||
| | previous declaration here | ||
| in this macro invocation | ||
|
||
error: aborting due to 2 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0263`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
// Ensure that generic parameters always have modern hygiene. | ||
|
||
// check-pass | ||
// ignore-pretty pretty-printing is unhygienic | ||
|
||
#![feature(decl_macro, rustc_attrs, const_generics)] | ||
|
||
mod type_params { | ||
macro m($T:ident) { | ||
fn f<$T: Clone, T: PartialEq>(t1: $T, t2: T) -> ($T, bool) { | ||
(t1.clone(), t2 == t2) | ||
} | ||
} | ||
|
||
#[rustc_macro_transparency = "semitransparent"] | ||
macro n($T:ident) { | ||
fn g<$T: Clone>(t1: $T, t2: T) -> (T, $T) { | ||
(t1.clone(), t2.clone()) | ||
} | ||
fn h<T: Clone>(t1: $T, t2: T) -> (T, $T) { | ||
(t1.clone(), t2.clone()) | ||
} | ||
} | ||
|
||
#[rustc_macro_transparency = "transparent"] | ||
macro p($T:ident) { | ||
fn j<$T: Clone>(t1: $T, t2: T) -> (T, $T) { | ||
(t1.clone(), t2.clone()) | ||
} | ||
fn k<T: Clone>(t1: $T, t2: T) -> (T, $T) { | ||
(t1.clone(), t2.clone()) | ||
} | ||
} | ||
|
||
m!(T); | ||
n!(T); | ||
p!(T); | ||
} | ||
|
||
mod lifetime_params { | ||
macro m($a:lifetime) { | ||
fn f<'b, 'c, $a: 'b, 'a: 'c>(t1: &$a(), t2: &'a ()) -> (&'b (), &'c ()) { | ||
(t1, t2) | ||
} | ||
} | ||
|
||
#[rustc_macro_transparency = "semitransparent"] | ||
macro n($a:lifetime) { | ||
fn g<$a>(t1: &$a(), t2: &'a ()) -> (&'a (), &$a ()) { | ||
(t1, t2) | ||
} | ||
fn h<'a>(t1: &$a(), t2: &'a ()) -> (&'a (), &$a ()) { | ||
(t1, t2) | ||
} | ||
} | ||
|
||
#[rustc_macro_transparency = "transparent"] | ||
macro p($a:lifetime) { | ||
fn j<$a>(t1: &$a(), t2: &'a ()) -> (&'a (), &$a ()) { | ||
(t1, t2) | ||
} | ||
fn k<'a>(t1: &$a(), t2: &'a ()) -> (&'a (), &$a ()) { | ||
(t1, t2) | ||
} | ||
} | ||
|
||
m!('a); | ||
n!('a); | ||
p!('a); | ||
} | ||
|
||
mod const_params { | ||
macro m($C:ident) { | ||
fn f<const $C: usize, const C: usize>(t1: [(); $C], t2: [(); C]) -> ([(); $C], [(); C]) { | ||
(t1, t2) | ||
} | ||
} | ||
|
||
#[rustc_macro_transparency = "semitransparent"] | ||
macro n($C:ident) { | ||
fn g<const $C: usize>(t1: [(); $C], t2: [(); C]) -> ([(); C], [(); $C]) { | ||
(t1, t2) | ||
} | ||
fn h<const C: usize>(t1: [(); $C], t2: [(); C]) -> ([(); C], [(); $C]) { | ||
(t1, t2) | ||
} | ||
} | ||
|
||
#[rustc_macro_transparency = "transparent"] | ||
macro p($C:ident) { | ||
fn j<const $C: usize>(t1: [(); $C], t2: [(); C]) -> ([(); C], [(); $C]) { | ||
(t1, t2) | ||
} | ||
fn k<const C: usize>(t1: [(); $C], t2: [(); C]) -> ([(); C], [(); $C]) { | ||
(t1, t2) | ||
} | ||
} | ||
|
||
m!(C); | ||
n!(C); | ||
p!(C); | ||
} | ||
|
||
fn main() {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
warning: the feature `const_generics` is incomplete and may cause the compiler to crash | ||
--> $DIR/generic_params.rs:6:37 | ||
| | ||
LL | #![feature(decl_macro, rustc_attrs, const_generics)] | ||
| ^^^^^^^^^^^^^^ | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
// A more comprehensive test that const parameters have correctly implemented | ||
// hygiene | ||
|
||
// check-pass | ||
|
||
#![feature(const_generics)] | ||
|
||
use std::ops::Add; | ||
|
||
struct VectorLike<T, const SIZE: usize>([T; {SIZE}]); | ||
|
||
macro_rules! impl_operator_overload { | ||
($trait_ident:ident, $method_ident:ident) => { | ||
|
||
impl<T, const SIZE: usize> $trait_ident for VectorLike<T, {SIZE}> | ||
where | ||
T: $trait_ident, | ||
{ | ||
type Output = VectorLike<T, {SIZE}>; | ||
|
||
fn $method_ident(self, _: VectorLike<T, {SIZE}>) -> VectorLike<T, {SIZE}> { | ||
let _ = SIZE; | ||
unimplemented!() | ||
} | ||
} | ||
|
||
} | ||
} | ||
|
||
impl_operator_overload!(Add, add); | ||
|
||
fn main() {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
warning: the feature `const_generics` is incomplete and may cause the compiler to crash | ||
--> $DIR/issue-61574-const-parameters.rs:6:12 | ||
| | ||
LL | #![feature(const_generics)] | ||
| ^^^^^^^^^^^^^^ | ||
|
This file was deleted.
Oops, something went wrong.