From bcf98841d47b23dfc4cc85568fcd8dbb79748965 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Fri, 4 Feb 2022 20:56:32 -0800 Subject: [PATCH] resolve lifetimes for const generic defaults --- compiler/rustc_resolve/src/late/lifetimes.rs | 5 ++++- src/test/ui/const-generics/issue-93647.rs | 6 ++++++ src/test/ui/const-generics/issue-93647.stderr | 9 +++++++++ .../outer-lifetime-in-const-generic-default.rs | 10 ++++++++++ .../outer-lifetime-in-const-generic-default.stderr | 11 +++++++++++ 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/const-generics/issue-93647.rs create mode 100644 src/test/ui/const-generics/issue-93647.stderr create mode 100644 src/test/ui/const-generics/outer-lifetime-in-const-generic-default.rs create mode 100644 src/test/ui/const-generics/outer-lifetime-in-const-generic-default.stderr diff --git a/compiler/rustc_resolve/src/late/lifetimes.rs b/compiler/rustc_resolve/src/late/lifetimes.rs index 6ef85c426be70..f3d57139e0817 100644 --- a/compiler/rustc_resolve/src/late/lifetimes.rs +++ b/compiler/rustc_resolve/src/late/lifetimes.rs @@ -1339,11 +1339,14 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> { this.visit_ty(&ty); } } - GenericParamKind::Const { ref ty, .. } => { + GenericParamKind::Const { ref ty, default } => { let was_in_const_generic = this.is_in_const_generic; this.is_in_const_generic = true; walk_list!(this, visit_param_bound, param.bounds); this.visit_ty(&ty); + if let Some(default) = default { + this.visit_body(this.tcx.hir().body(default.body)); + } this.is_in_const_generic = was_in_const_generic; } } diff --git a/src/test/ui/const-generics/issue-93647.rs b/src/test/ui/const-generics/issue-93647.rs new file mode 100644 index 0000000000000..6a8fe64d1875d --- /dev/null +++ b/src/test/ui/const-generics/issue-93647.rs @@ -0,0 +1,6 @@ +struct X; + +fn main() {} diff --git a/src/test/ui/const-generics/issue-93647.stderr b/src/test/ui/const-generics/issue-93647.stderr new file mode 100644 index 0000000000000..0fe54e7de41f0 --- /dev/null +++ b/src/test/ui/const-generics/issue-93647.stderr @@ -0,0 +1,9 @@ +error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants + --> $DIR/issue-93647.rs:2:5 + | +LL | (||1usize)() + | ^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0015`. diff --git a/src/test/ui/const-generics/outer-lifetime-in-const-generic-default.rs b/src/test/ui/const-generics/outer-lifetime-in-const-generic-default.rs new file mode 100644 index 0000000000000..3018439afa717 --- /dev/null +++ b/src/test/ui/const-generics/outer-lifetime-in-const-generic-default.rs @@ -0,0 +1,10 @@ +struct Foo< + 'a, + const N: usize = { + let x: &'a (); + //~^ ERROR use of non-static lifetime `'a` in const generic + 3 + }, +>(&'a ()); + +fn main() {} diff --git a/src/test/ui/const-generics/outer-lifetime-in-const-generic-default.stderr b/src/test/ui/const-generics/outer-lifetime-in-const-generic-default.stderr new file mode 100644 index 0000000000000..9d9555d3f647f --- /dev/null +++ b/src/test/ui/const-generics/outer-lifetime-in-const-generic-default.stderr @@ -0,0 +1,11 @@ +error[E0771]: use of non-static lifetime `'a` in const generic + --> $DIR/outer-lifetime-in-const-generic-default.rs:4:17 + | +LL | let x: &'a (); + | ^^ + | + = note: for more information, see issue #74052 + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0771`.