Rollup merge of #86750 - fee1-dead:impl-const-test, r=jonas-schievink
Test cross-crate usage of `feature(const_trait_impl)` This PR does two things: - Fixes metadata not encoded properly for functions in const trait impls. - Adds tests for using const trait impls cross-crate with the feature gate on the user crate either enabled or disabled. AFAIK, this means we can now constify some trait impls in the standard library 🎉 See #67792 for the tracking issue, cc `@oli-obk`
This commit is contained in:
commit
7714a9a0e3
@ -1223,7 +1223,12 @@ fn encode_info_for_impl_item(&mut self, def_id: DefId) {
|
||||
let fn_data = if let hir::ImplItemKind::Fn(ref sig, body) = ast_item.kind {
|
||||
FnData {
|
||||
asyncness: sig.header.asyncness,
|
||||
constness: sig.header.constness,
|
||||
// Can be inside `impl const Trait`, so using sig.header.constness is not reliable
|
||||
constness: if self.tcx.is_const_fn_raw(def_id) {
|
||||
hir::Constness::Const
|
||||
} else {
|
||||
hir::Constness::NotConst
|
||||
},
|
||||
param_names: self.encode_fn_param_names_for_body(body),
|
||||
}
|
||||
} else {
|
||||
|
@ -0,0 +1,22 @@
|
||||
#![feature(const_trait_impl)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
pub trait MyTrait {
|
||||
fn func(self);
|
||||
}
|
||||
|
||||
pub struct NonConst;
|
||||
|
||||
impl MyTrait for NonConst {
|
||||
fn func(self) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Const;
|
||||
|
||||
impl const MyTrait for Const {
|
||||
fn func(self) {
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
// aux-build: cross-crate.rs
|
||||
extern crate cross_crate;
|
||||
|
||||
use cross_crate::*;
|
||||
|
||||
fn non_const_context() {
|
||||
NonConst.func();
|
||||
Const.func();
|
||||
}
|
||||
|
||||
const fn const_context() {
|
||||
NonConst.func();
|
||||
//~^ ERROR: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||
Const.func();
|
||||
//~^ ERROR: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,15 @@
|
||||
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||
--> $DIR/cross-crate-feature-disabled.rs:12:5
|
||||
|
|
||||
LL | NonConst.func();
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||
--> $DIR/cross-crate-feature-disabled.rs:14:5
|
||||
|
|
||||
LL | Const.func();
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0015`.
|
@ -0,0 +1,20 @@
|
||||
#![feature(const_trait_impl)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
// aux-build: cross-crate.rs
|
||||
extern crate cross_crate;
|
||||
|
||||
use cross_crate::*;
|
||||
|
||||
fn non_const_context() {
|
||||
NonConst.func();
|
||||
Const.func();
|
||||
}
|
||||
|
||||
const fn const_context() {
|
||||
NonConst.func();
|
||||
//~^ ERROR: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||
Const.func();
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,9 @@
|
||||
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||
--> $DIR/cross-crate-feature-enabled.rs:15:5
|
||||
|
|
||||
LL | NonConst.func();
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0015`.
|
Loading…
Reference in New Issue
Block a user