diff options
| author | bors <bors@rust-lang.org> | 2019-05-11 09:24:45 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-05-11 09:24:45 +0000 |
| commit | af39a1fd73de7f4b9c895d3377e03f8fa3221449 (patch) | |
| tree | 1dca4bf55864e9c2fc95391236b26b737a07d834 /src | |
| parent | b8e0d0a2aa4f18d76a701150fccb67533f377368 (diff) | |
| parent | b3207d531d01c1dc6c1f3d4e7b1c20a1546fe108 (diff) | |
| download | rust-af39a1fd73de7f4b9c895d3377e03f8fa3221449.tar.gz rust-af39a1fd73de7f4b9c895d3377e03f8fa3221449.zip | |
Auto merge of #60717 - varkor:impl-const-generic, r=matthewjasper
Fix a bug preventing const parameters from being used in const generic impls Fixes https://github.com/rust-lang/rust/issues/60712.
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_typeck/astconv.rs | 13 | ||||
| -rw-r--r-- | src/test/ui/const-generics/impl-const-generic-struct.rs | 16 | ||||
| -rw-r--r-- | src/test/ui/const-generics/impl-const-generic-struct.stderr | 6 |
3 files changed, 34 insertions, 1 deletions
diff --git a/src/librustc_typeck/astconv.rs b/src/librustc_typeck/astconv.rs index 16033c6c50f..da47ccf38a0 100644 --- a/src/librustc_typeck/astconv.rs +++ b/src/librustc_typeck/astconv.rs @@ -1902,7 +1902,18 @@ impl<'o, 'gcx: 'tcx, 'tcx> dyn AstConv<'gcx, 'tcx> + 'o { ty, }; - let expr = &tcx.hir().body(ast_const.body).value; + let mut expr = &tcx.hir().body(ast_const.body).value; + + // Unwrap a block, so that e.g. `{ P }` is recognised as a parameter. Const arguments + // currently have to be wrapped in curly brackets, so it's necessary to special-case. + if let ExprKind::Block(block, _) = &expr.node { + if block.stmts.is_empty() { + if let Some(trailing) = &block.expr { + expr = &trailing; + } + } + } + if let ExprKind::Path(ref qpath) = expr.node { if let hir::QPath::Resolved(_, ref path) = qpath { if let Res::Def(DefKind::ConstParam, def_id) = path.res { diff --git a/src/test/ui/const-generics/impl-const-generic-struct.rs b/src/test/ui/const-generics/impl-const-generic-struct.rs new file mode 100644 index 00000000000..7a0c0f2be5d --- /dev/null +++ b/src/test/ui/const-generics/impl-const-generic-struct.rs @@ -0,0 +1,16 @@ +// run-pass + +#![feature(const_generics)] +//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash + +struct S<const X: u32>; + +impl<const X: u32> S<{X}> { + fn x() -> u32 { + X + } +} + +fn main() { + assert_eq!(S::<19>::x(), 19); +} diff --git a/src/test/ui/const-generics/impl-const-generic-struct.stderr b/src/test/ui/const-generics/impl-const-generic-struct.stderr new file mode 100644 index 00000000000..d443e060a97 --- /dev/null +++ b/src/test/ui/const-generics/impl-const-generic-struct.stderr @@ -0,0 +1,6 @@ +warning: the feature `const_generics` is incomplete and may cause the compiler to crash + --> $DIR/impl-const-generic-struct.rs:3:12 + | +LL | #![feature(const_generics)] + | ^^^^^^^^^^^^^^ + |
