Skip to content

Commit eb68bbb

Browse files
committed
Include const generic arguments in metadata.
1 parent 446e5e5 commit eb68bbb

File tree

5 files changed

+58
-26
lines changed

5 files changed

+58
-26
lines changed

src/librustc_metadata/encoder.rs

+6-26
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use rustc::middle::cstore::{LinkagePreference, NativeLibrary,
55
EncodedMetadata, ForeignModule};
66
use rustc::hir::def::CtorKind;
77
use rustc::hir::def_id::{CrateNum, CRATE_DEF_INDEX, DefIndex, DefId, LocalDefId, LOCAL_CRATE};
8-
use rustc::hir::GenericParamKind;
8+
use rustc::hir::{GenericParamKind, AnonConst};
99
use rustc::hir::map::definitions::DefPathTable;
1010
use rustc_data_structures::fingerprint::Fingerprint;
1111
use rustc_index::vec::IndexVec;
@@ -1711,6 +1711,11 @@ impl Visitor<'tcx> for EncodeContext<'tcx> {
17111711
intravisit::walk_expr(self, ex);
17121712
self.encode_info_for_expr(ex);
17131713
}
1714+
fn visit_anon_const(&mut self, c: &'tcx AnonConst) {
1715+
intravisit::walk_anon_const(self, c);
1716+
let def_id = self.tcx.hir().local_def_id(c.hir_id);
1717+
self.record(def_id, EncodeContext::encode_info_for_anon_const, def_id);
1718+
}
17141719
fn visit_item(&mut self, item: &'tcx hir::Item) {
17151720
intravisit::walk_item(self, item);
17161721
let def_id = self.tcx.hir().local_def_id(item.hir_id);
@@ -1728,25 +1733,10 @@ impl Visitor<'tcx> for EncodeContext<'tcx> {
17281733
EncodeContext::encode_info_for_foreign_item,
17291734
(def_id, ni));
17301735
}
1731-
fn visit_variant(&mut self,
1732-
v: &'tcx hir::Variant,
1733-
g: &'tcx hir::Generics,
1734-
id: hir::HirId) {
1735-
intravisit::walk_variant(self, v, g, id);
1736-
1737-
if let Some(ref discr) = v.disr_expr {
1738-
let def_id = self.tcx.hir().local_def_id(discr.hir_id);
1739-
self.record(def_id, EncodeContext::encode_info_for_anon_const, def_id);
1740-
}
1741-
}
17421736
fn visit_generics(&mut self, generics: &'tcx hir::Generics) {
17431737
intravisit::walk_generics(self, generics);
17441738
self.encode_info_for_generics(generics);
17451739
}
1746-
fn visit_ty(&mut self, ty: &'tcx hir::Ty) {
1747-
intravisit::walk_ty(self, ty);
1748-
self.encode_info_for_ty(ty);
1749-
}
17501740
fn visit_macro_def(&mut self, macro_def: &'tcx hir::MacroDef) {
17511741
let def_id = self.tcx.hir().local_def_id(macro_def.hir_id);
17521742
self.record(def_id, EncodeContext::encode_info_for_macro_def, macro_def);
@@ -1784,16 +1774,6 @@ impl EncodeContext<'tcx> {
17841774
}
17851775
}
17861776

1787-
fn encode_info_for_ty(&mut self, ty: &hir::Ty) {
1788-
match ty.kind {
1789-
hir::TyKind::Array(_, ref length) => {
1790-
let def_id = self.tcx.hir().local_def_id(length.hir_id);
1791-
self.record(def_id, EncodeContext::encode_info_for_anon_const, def_id);
1792-
}
1793-
_ => {}
1794-
}
1795-
}
1796-
17971777
fn encode_info_for_expr(&mut self, expr: &hir::Expr) {
17981778
match expr.kind {
17991779
hir::ExprKind::Closure(..) => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#![feature(const_generics)]
2+
3+
pub struct Struct<const N: usize>(pub [u8; N]);
4+
5+
pub type Alias = Struct<2>;
6+
7+
pub fn function(value: Struct<3>) -> u8 {
8+
value.0[0]
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// aux-build:const_generic_lib.rs
2+
3+
extern crate const_generic_lib;
4+
5+
fn main() {
6+
let _ = const_generic_lib::function(const_generic_lib::Struct([0u8, 1u8]));
7+
//~^ ERROR mismatched types
8+
let _: const_generic_lib::Alias = const_generic_lib::Struct([0u8, 1u8, 2u8]);
9+
//~^ ERROR mismatched types
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
error[E0308]: mismatched types
2+
--> $DIR/const-argument-cross-crate-mismatch.rs:6:41
3+
|
4+
LL | let _ = const_generic_lib::function(const_generic_lib::Struct([0u8, 1u8]));
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `3usize`, found `2usize`
6+
|
7+
= note: expected type `const_generic_lib::Struct<3usize>`
8+
found type `const_generic_lib::Struct<_: usize>`
9+
10+
error[E0308]: mismatched types
11+
--> $DIR/const-argument-cross-crate-mismatch.rs:8:39
12+
|
13+
LL | let _: const_generic_lib::Alias = const_generic_lib::Struct([0u8, 1u8, 2u8]);
14+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `2usize`, found `3usize`
15+
|
16+
= note: expected type `const_generic_lib::Struct<2usize>`
17+
found type `const_generic_lib::Struct<_: usize>`
18+
19+
error: aborting due to 2 previous errors
20+
21+
For more information about this error, try `rustc --explain E0308`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// run-pass
2+
// aux-build:const_generic_lib.rs
3+
4+
extern crate const_generic_lib;
5+
6+
struct Container(const_generic_lib::Alias);
7+
8+
fn main() {
9+
let res = const_generic_lib::function(const_generic_lib::Struct([14u8, 1u8, 2u8]));
10+
assert_eq!(res, 14u8);
11+
let _ = Container(const_generic_lib::Struct([0u8, 1u8]));
12+
}

0 commit comments

Comments
 (0)