Auto merge of #132184 - jieyouxu:rollup-81ht12w, r=jieyouxu
Rollup of 5 pull requests Successful merges: - #132124 (coverage: Consolidate creation of covmap/covfun records) - #132140 (Enable LSX feature for LoongArch Linux targets) - #132169 (Deny calls to non-`#[const_trait]` methods in MIR constck) - #132174 (x86 target features: make pclmulqdq imply sse2) - #132180 (Print unsafety of attribute in AST pretty print) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
9260be36b2
84 changed files with 578 additions and 473 deletions
|
@ -627,6 +627,13 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
|
||||||
|
|
||||||
fn print_attr_item(&mut self, item: &ast::AttrItem, span: Span) {
|
fn print_attr_item(&mut self, item: &ast::AttrItem, span: Span) {
|
||||||
self.ibox(0);
|
self.ibox(0);
|
||||||
|
match item.unsafety {
|
||||||
|
ast::Safety::Unsafe(_) => {
|
||||||
|
self.word("unsafe");
|
||||||
|
self.popen();
|
||||||
|
}
|
||||||
|
ast::Safety::Default | ast::Safety::Safe(_) => {}
|
||||||
|
}
|
||||||
match &item.args {
|
match &item.args {
|
||||||
AttrArgs::Delimited(DelimArgs { dspan: _, delim, tokens }) => self.print_mac_common(
|
AttrArgs::Delimited(DelimArgs { dspan: _, delim, tokens }) => self.print_mac_common(
|
||||||
Some(MacHeader::Path(&item.path)),
|
Some(MacHeader::Path(&item.path)),
|
||||||
|
@ -655,6 +662,10 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
|
||||||
self.word(token_str);
|
self.word(token_str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
match item.unsafety {
|
||||||
|
ast::Safety::Unsafe(_) => self.pclose(),
|
||||||
|
ast::Safety::Default | ast::Safety::Safe(_) => {}
|
||||||
|
}
|
||||||
self.end();
|
self.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,7 @@ pub(crate) struct CodegenCx<'ll, 'tcx> {
|
||||||
|
|
||||||
pub isize_ty: &'ll Type,
|
pub isize_ty: &'ll Type,
|
||||||
|
|
||||||
|
/// Extra codegen state needed when coverage instrumentation is enabled.
|
||||||
pub coverage_cx: Option<coverageinfo::CrateCoverageContext<'ll, 'tcx>>,
|
pub coverage_cx: Option<coverageinfo::CrateCoverageContext<'ll, 'tcx>>,
|
||||||
pub dbg_cx: Option<debuginfo::CodegenUnitDebugContext<'ll, 'tcx>>,
|
pub dbg_cx: Option<debuginfo::CodegenUnitDebugContext<'ll, 'tcx>>,
|
||||||
|
|
||||||
|
@ -592,11 +593,10 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
|
||||||
&self.statics_to_rauw
|
&self.statics_to_rauw
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Extra state that is only available when coverage instrumentation is enabled.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub(crate) fn coverage_context(
|
pub(crate) fn coverage_cx(&self) -> &coverageinfo::CrateCoverageContext<'ll, 'tcx> {
|
||||||
&self,
|
self.coverage_cx.as_ref().expect("only called when coverage instrumentation is enabled")
|
||||||
) -> Option<&coverageinfo::CrateCoverageContext<'ll, 'tcx>> {
|
|
||||||
self.coverage_cx.as_ref()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn create_used_variable_impl(&self, name: &'static CStr, values: &[&'ll Value]) {
|
pub(crate) fn create_used_variable_impl(&self, name: &'static CStr, values: &[&'ll Value]) {
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
use std::ffi::CStr;
|
use std::ffi::CString;
|
||||||
|
|
||||||
use itertools::Itertools as _;
|
use itertools::Itertools as _;
|
||||||
use rustc_codegen_ssa::traits::{BaseTypeCodegenMethods, ConstCodegenMethods};
|
use rustc_abi::Align;
|
||||||
|
use rustc_codegen_ssa::traits::{
|
||||||
|
BaseTypeCodegenMethods, ConstCodegenMethods, StaticCodegenMethods,
|
||||||
|
};
|
||||||
use rustc_data_structures::fx::{FxHashSet, FxIndexMap, FxIndexSet};
|
use rustc_data_structures::fx::{FxHashSet, FxIndexMap, FxIndexSet};
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
use rustc_index::IndexVec;
|
use rustc_index::IndexVec;
|
||||||
|
@ -10,6 +13,7 @@ use rustc_middle::ty::{self, TyCtxt};
|
||||||
use rustc_middle::{bug, mir};
|
use rustc_middle::{bug, mir};
|
||||||
use rustc_span::Symbol;
|
use rustc_span::Symbol;
|
||||||
use rustc_span::def_id::DefIdSet;
|
use rustc_span::def_id::DefIdSet;
|
||||||
|
use rustc_target::spec::HasTargetSpec;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
use crate::common::CodegenCx;
|
use crate::common::CodegenCx;
|
||||||
|
@ -50,11 +54,7 @@ pub(crate) fn finalize(cx: &CodegenCx<'_, '_>) {
|
||||||
add_unused_functions(cx);
|
add_unused_functions(cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
let function_coverage_map = match cx.coverage_context() {
|
let function_coverage_map = cx.coverage_cx().take_function_coverage_map();
|
||||||
Some(ctx) => ctx.take_function_coverage_map(),
|
|
||||||
None => return,
|
|
||||||
};
|
|
||||||
|
|
||||||
if function_coverage_map.is_empty() {
|
if function_coverage_map.is_empty() {
|
||||||
// This module has no functions with coverage instrumentation
|
// This module has no functions with coverage instrumentation
|
||||||
return;
|
return;
|
||||||
|
@ -78,11 +78,9 @@ pub(crate) fn finalize(cx: &CodegenCx<'_, '_>) {
|
||||||
|
|
||||||
// Generate the coverage map header, which contains the filenames used by
|
// Generate the coverage map header, which contains the filenames used by
|
||||||
// this CGU's coverage mappings, and store it in a well-known global.
|
// this CGU's coverage mappings, and store it in a well-known global.
|
||||||
let cov_data_val = generate_coverage_map(cx, covmap_version, filenames_size, filenames_val);
|
generate_covmap_record(cx, covmap_version, filenames_size, filenames_val);
|
||||||
coverageinfo::save_cov_data_to_mod(cx, cov_data_val);
|
|
||||||
|
|
||||||
let mut unused_function_names = Vec::new();
|
let mut unused_function_names = Vec::new();
|
||||||
let covfun_section_name = coverageinfo::covfun_section_name(cx);
|
|
||||||
|
|
||||||
// Encode coverage mappings and generate function records
|
// Encode coverage mappings and generate function records
|
||||||
for (instance, function_coverage) in function_coverage_entries {
|
for (instance, function_coverage) in function_coverage_entries {
|
||||||
|
@ -111,9 +109,8 @@ pub(crate) fn finalize(cx: &CodegenCx<'_, '_>) {
|
||||||
unused_function_names.push(mangled_function_name);
|
unused_function_names.push(mangled_function_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
save_function_record(
|
generate_covfun_record(
|
||||||
cx,
|
cx,
|
||||||
&covfun_section_name,
|
|
||||||
mangled_function_name,
|
mangled_function_name,
|
||||||
source_hash,
|
source_hash,
|
||||||
filenames_ref,
|
filenames_ref,
|
||||||
|
@ -308,15 +305,15 @@ fn encode_mappings_for_function(
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Construct coverage map header and the array of function records, and combine them into the
|
/// Generates the contents of the covmap record for this CGU, which mostly
|
||||||
/// coverage map. Save the coverage map data into the LLVM IR as a static global using a
|
/// consists of a header and a list of filenames. The record is then stored
|
||||||
/// specific, well-known section and name.
|
/// as a global variable in the `__llvm_covmap` section.
|
||||||
fn generate_coverage_map<'ll>(
|
fn generate_covmap_record<'ll>(
|
||||||
cx: &CodegenCx<'ll, '_>,
|
cx: &CodegenCx<'ll, '_>,
|
||||||
version: u32,
|
version: u32,
|
||||||
filenames_size: usize,
|
filenames_size: usize,
|
||||||
filenames_val: &'ll llvm::Value,
|
filenames_val: &'ll llvm::Value,
|
||||||
) -> &'ll llvm::Value {
|
) {
|
||||||
debug!("cov map: filenames_size = {}, 0-based version = {}", filenames_size, version);
|
debug!("cov map: filenames_size = {}, 0-based version = {}", filenames_size, version);
|
||||||
|
|
||||||
// Create the coverage data header (Note, fields 0 and 2 are now always zero,
|
// Create the coverage data header (Note, fields 0 and 2 are now always zero,
|
||||||
|
@ -331,15 +328,37 @@ fn generate_coverage_map<'ll>(
|
||||||
);
|
);
|
||||||
|
|
||||||
// Create the complete LLVM coverage data value to add to the LLVM IR
|
// Create the complete LLVM coverage data value to add to the LLVM IR
|
||||||
cx.const_struct(&[cov_data_header_val, filenames_val], /*packed=*/ false)
|
let covmap_data =
|
||||||
|
cx.const_struct(&[cov_data_header_val, filenames_val], /*packed=*/ false);
|
||||||
|
|
||||||
|
let covmap_var_name = CString::new(llvm::build_byte_buffer(|s| unsafe {
|
||||||
|
llvm::LLVMRustCoverageWriteMappingVarNameToString(s);
|
||||||
|
}))
|
||||||
|
.unwrap();
|
||||||
|
debug!("covmap var name: {:?}", covmap_var_name);
|
||||||
|
|
||||||
|
let covmap_section_name = CString::new(llvm::build_byte_buffer(|s| unsafe {
|
||||||
|
llvm::LLVMRustCoverageWriteMapSectionNameToString(cx.llmod, s);
|
||||||
|
}))
|
||||||
|
.expect("covmap section name should not contain NUL");
|
||||||
|
debug!("covmap section name: {:?}", covmap_section_name);
|
||||||
|
|
||||||
|
let llglobal = llvm::add_global(cx.llmod, cx.val_ty(covmap_data), &covmap_var_name);
|
||||||
|
llvm::set_initializer(llglobal, covmap_data);
|
||||||
|
llvm::set_global_constant(llglobal, true);
|
||||||
|
llvm::set_linkage(llglobal, llvm::Linkage::PrivateLinkage);
|
||||||
|
llvm::set_section(llglobal, &covmap_section_name);
|
||||||
|
// LLVM's coverage mapping format specifies 8-byte alignment for items in this section.
|
||||||
|
// <https://llvm.org/docs/CoverageMappingFormat.html>
|
||||||
|
llvm::set_alignment(llglobal, Align::EIGHT);
|
||||||
|
cx.add_used_global(llglobal);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Construct a function record and combine it with the function's coverage mapping data.
|
/// Generates the contents of the covfun record for this function, which
|
||||||
/// Save the function record into the LLVM IR as a static global using a
|
/// contains the function's coverage mapping data. The record is then stored
|
||||||
/// specific, well-known section and name.
|
/// as a global variable in the `__llvm_covfun` section.
|
||||||
fn save_function_record(
|
fn generate_covfun_record(
|
||||||
cx: &CodegenCx<'_, '_>,
|
cx: &CodegenCx<'_, '_>,
|
||||||
covfun_section_name: &CStr,
|
|
||||||
mangled_function_name: &str,
|
mangled_function_name: &str,
|
||||||
source_hash: u64,
|
source_hash: u64,
|
||||||
filenames_ref: u64,
|
filenames_ref: u64,
|
||||||
|
@ -366,13 +385,28 @@ fn save_function_record(
|
||||||
/*packed=*/ true,
|
/*packed=*/ true,
|
||||||
);
|
);
|
||||||
|
|
||||||
coverageinfo::save_func_record_to_mod(
|
// Choose a variable name to hold this function's covfun data.
|
||||||
cx,
|
// Functions that are used have a suffix ("u") to distinguish them from
|
||||||
covfun_section_name,
|
// unused copies of the same function (from different CGUs), so that if a
|
||||||
func_name_hash,
|
// linker sees both it won't discard the used copy's data.
|
||||||
func_record_val,
|
let func_record_var_name =
|
||||||
is_used,
|
CString::new(format!("__covrec_{:X}{}", func_name_hash, if is_used { "u" } else { "" }))
|
||||||
);
|
.unwrap();
|
||||||
|
debug!("function record var name: {:?}", func_record_var_name);
|
||||||
|
|
||||||
|
let llglobal = llvm::add_global(cx.llmod, cx.val_ty(func_record_val), &func_record_var_name);
|
||||||
|
llvm::set_initializer(llglobal, func_record_val);
|
||||||
|
llvm::set_global_constant(llglobal, true);
|
||||||
|
llvm::set_linkage(llglobal, llvm::Linkage::LinkOnceODRLinkage);
|
||||||
|
llvm::set_visibility(llglobal, llvm::Visibility::Hidden);
|
||||||
|
llvm::set_section(llglobal, cx.covfun_section_name());
|
||||||
|
// LLVM's coverage mapping format specifies 8-byte alignment for items in this section.
|
||||||
|
// <https://llvm.org/docs/CoverageMappingFormat.html>
|
||||||
|
llvm::set_alignment(llglobal, Align::EIGHT);
|
||||||
|
if cx.target_spec().supports_comdat() {
|
||||||
|
llvm::set_comdat(cx.llmod, llglobal, &func_record_var_name);
|
||||||
|
}
|
||||||
|
cx.add_used_global(llglobal);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Each CGU will normally only emit coverage metadata for the functions that it actually generates.
|
/// Each CGU will normally only emit coverage metadata for the functions that it actually generates.
|
||||||
|
@ -504,9 +538,5 @@ fn add_unused_function_coverage<'tcx>(
|
||||||
// zero, because none of its counters/expressions are marked as seen.
|
// zero, because none of its counters/expressions are marked as seen.
|
||||||
let function_coverage = FunctionCoverageCollector::unused(instance, function_coverage_info);
|
let function_coverage = FunctionCoverageCollector::unused(instance, function_coverage_info);
|
||||||
|
|
||||||
if let Some(coverage_context) = cx.coverage_context() {
|
cx.coverage_cx().function_coverage_map.borrow_mut().insert(instance, function_coverage);
|
||||||
coverage_context.function_coverage_map.borrow_mut().insert(instance, function_coverage);
|
|
||||||
} else {
|
|
||||||
bug!("Could not get the `coverage_context`");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,16 @@
|
||||||
use std::cell::RefCell;
|
use std::cell::{OnceCell, RefCell};
|
||||||
use std::ffi::{CStr, CString};
|
use std::ffi::{CStr, CString};
|
||||||
|
|
||||||
use libc::c_uint;
|
use libc::c_uint;
|
||||||
use rustc_codegen_ssa::traits::{
|
use rustc_codegen_ssa::traits::{
|
||||||
BaseTypeCodegenMethods, BuilderMethods, ConstCodegenMethods, CoverageInfoBuilderMethods,
|
BuilderMethods, ConstCodegenMethods, CoverageInfoBuilderMethods, MiscCodegenMethods,
|
||||||
MiscCodegenMethods, StaticCodegenMethods,
|
|
||||||
};
|
};
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
|
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
|
||||||
use rustc_llvm::RustString;
|
use rustc_llvm::RustString;
|
||||||
use rustc_middle::bug;
|
|
||||||
use rustc_middle::mir::coverage::CoverageKind;
|
use rustc_middle::mir::coverage::CoverageKind;
|
||||||
use rustc_middle::ty::Instance;
|
use rustc_middle::ty::Instance;
|
||||||
use rustc_middle::ty::layout::HasTyCtxt;
|
use rustc_middle::ty::layout::HasTyCtxt;
|
||||||
use rustc_target::abi::{Align, Size};
|
use rustc_target::abi::Size;
|
||||||
use rustc_target::spec::HasTargetSpec;
|
|
||||||
use tracing::{debug, instrument};
|
use tracing::{debug, instrument};
|
||||||
|
|
||||||
use crate::builder::Builder;
|
use crate::builder::Builder;
|
||||||
|
@ -32,6 +29,8 @@ pub(crate) struct CrateCoverageContext<'ll, 'tcx> {
|
||||||
RefCell<FxIndexMap<Instance<'tcx>, FunctionCoverageCollector<'tcx>>>,
|
RefCell<FxIndexMap<Instance<'tcx>, FunctionCoverageCollector<'tcx>>>,
|
||||||
pub(crate) pgo_func_name_var_map: RefCell<FxHashMap<Instance<'tcx>, &'ll llvm::Value>>,
|
pub(crate) pgo_func_name_var_map: RefCell<FxHashMap<Instance<'tcx>, &'ll llvm::Value>>,
|
||||||
pub(crate) mcdc_condition_bitmap_map: RefCell<FxHashMap<Instance<'tcx>, Vec<&'ll llvm::Value>>>,
|
pub(crate) mcdc_condition_bitmap_map: RefCell<FxHashMap<Instance<'tcx>, Vec<&'ll llvm::Value>>>,
|
||||||
|
|
||||||
|
covfun_section_name: OnceCell<CString>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ll, 'tcx> CrateCoverageContext<'ll, 'tcx> {
|
impl<'ll, 'tcx> CrateCoverageContext<'ll, 'tcx> {
|
||||||
|
@ -40,6 +39,7 @@ impl<'ll, 'tcx> CrateCoverageContext<'ll, 'tcx> {
|
||||||
function_coverage_map: Default::default(),
|
function_coverage_map: Default::default(),
|
||||||
pgo_func_name_var_map: Default::default(),
|
pgo_func_name_var_map: Default::default(),
|
||||||
mcdc_condition_bitmap_map: Default::default(),
|
mcdc_condition_bitmap_map: Default::default(),
|
||||||
|
covfun_section_name: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,27 +66,38 @@ impl<'ll, 'tcx> CrateCoverageContext<'ll, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// These methods used to be part of trait `CoverageInfoMethods`, which no longer
|
|
||||||
// exists after most coverage code was moved out of SSA.
|
|
||||||
impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
|
impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
|
||||||
pub(crate) fn coverageinfo_finalize(&self) {
|
pub(crate) fn coverageinfo_finalize(&self) {
|
||||||
mapgen::finalize(self)
|
mapgen::finalize(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the section name to use when embedding per-function coverage information
|
||||||
|
/// in the object file, according to the target's object file format. LLVM's coverage
|
||||||
|
/// tools use information from this section when producing coverage reports.
|
||||||
|
///
|
||||||
|
/// Typical values are:
|
||||||
|
/// - `__llvm_covfun` on Linux
|
||||||
|
/// - `__LLVM_COV,__llvm_covfun` on macOS (includes `__LLVM_COV,` segment prefix)
|
||||||
|
/// - `.lcovfun$M` on Windows (includes `$M` sorting suffix)
|
||||||
|
fn covfun_section_name(&self) -> &CStr {
|
||||||
|
self.coverage_cx().covfun_section_name.get_or_init(|| {
|
||||||
|
CString::new(llvm::build_byte_buffer(|s| unsafe {
|
||||||
|
llvm::LLVMRustCoverageWriteFuncSectionNameToString(self.llmod, s);
|
||||||
|
}))
|
||||||
|
.expect("covfun section name should not contain NUL")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/// For LLVM codegen, returns a function-specific `Value` for a global
|
/// For LLVM codegen, returns a function-specific `Value` for a global
|
||||||
/// string, to hold the function name passed to LLVM intrinsic
|
/// string, to hold the function name passed to LLVM intrinsic
|
||||||
/// `instrprof.increment()`. The `Value` is only created once per instance.
|
/// `instrprof.increment()`. The `Value` is only created once per instance.
|
||||||
/// Multiple invocations with the same instance return the same `Value`.
|
/// Multiple invocations with the same instance return the same `Value`.
|
||||||
fn get_pgo_func_name_var(&self, instance: Instance<'tcx>) -> &'ll llvm::Value {
|
fn get_pgo_func_name_var(&self, instance: Instance<'tcx>) -> &'ll llvm::Value {
|
||||||
if let Some(coverage_context) = self.coverage_context() {
|
debug!("getting pgo_func_name_var for instance={:?}", instance);
|
||||||
debug!("getting pgo_func_name_var for instance={:?}", instance);
|
let mut pgo_func_name_var_map = self.coverage_cx().pgo_func_name_var_map.borrow_mut();
|
||||||
let mut pgo_func_name_var_map = coverage_context.pgo_func_name_var_map.borrow_mut();
|
pgo_func_name_var_map
|
||||||
pgo_func_name_var_map
|
.entry(instance)
|
||||||
.entry(instance)
|
.or_insert_with(|| create_pgo_func_name_var(self, instance))
|
||||||
.or_insert_with(|| create_pgo_func_name_var(self, instance))
|
|
||||||
} else {
|
|
||||||
bug!("Could not get the `coverage_context`");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,11 +131,7 @@ impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
|
||||||
cond_bitmaps.push(cond_bitmap);
|
cond_bitmaps.push(cond_bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.coverage_context()
|
self.coverage_cx().mcdc_condition_bitmap_map.borrow_mut().insert(instance, cond_bitmaps);
|
||||||
.expect("always present when coverage is enabled")
|
|
||||||
.mcdc_condition_bitmap_map
|
|
||||||
.borrow_mut()
|
|
||||||
.insert(instance, cond_bitmaps);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(level = "debug", skip(self))]
|
#[instrument(level = "debug", skip(self))]
|
||||||
|
@ -145,8 +152,7 @@ impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
let Some(coverage_context) = bx.coverage_context() else { return };
|
let mut coverage_map = bx.coverage_cx().function_coverage_map.borrow_mut();
|
||||||
let mut coverage_map = coverage_context.function_coverage_map.borrow_mut();
|
|
||||||
let func_coverage = coverage_map
|
let func_coverage = coverage_map
|
||||||
.entry(instance)
|
.entry(instance)
|
||||||
.or_insert_with(|| FunctionCoverageCollector::new(instance, function_coverage_info));
|
.or_insert_with(|| FunctionCoverageCollector::new(instance, function_coverage_info));
|
||||||
|
@ -188,7 +194,8 @@ impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
|
||||||
}
|
}
|
||||||
CoverageKind::CondBitmapUpdate { index, decision_depth } => {
|
CoverageKind::CondBitmapUpdate { index, decision_depth } => {
|
||||||
drop(coverage_map);
|
drop(coverage_map);
|
||||||
let cond_bitmap = coverage_context
|
let cond_bitmap = bx
|
||||||
|
.coverage_cx()
|
||||||
.try_get_mcdc_condition_bitmap(&instance, decision_depth)
|
.try_get_mcdc_condition_bitmap(&instance, decision_depth)
|
||||||
.expect("mcdc cond bitmap should have been allocated for updating");
|
.expect("mcdc cond bitmap should have been allocated for updating");
|
||||||
let cond_index = bx.const_i32(index as i32);
|
let cond_index = bx.const_i32(index as i32);
|
||||||
|
@ -196,7 +203,7 @@ impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
|
||||||
}
|
}
|
||||||
CoverageKind::TestVectorBitmapUpdate { bitmap_idx, decision_depth } => {
|
CoverageKind::TestVectorBitmapUpdate { bitmap_idx, decision_depth } => {
|
||||||
drop(coverage_map);
|
drop(coverage_map);
|
||||||
let cond_bitmap = coverage_context
|
let cond_bitmap = bx.coverage_cx()
|
||||||
.try_get_mcdc_condition_bitmap(&instance, decision_depth)
|
.try_get_mcdc_condition_bitmap(&instance, decision_depth)
|
||||||
.expect("mcdc cond bitmap should have been allocated for merging into the global bitmap");
|
.expect("mcdc cond bitmap should have been allocated for merging into the global bitmap");
|
||||||
assert!(
|
assert!(
|
||||||
|
@ -290,82 +297,3 @@ pub(crate) fn hash_bytes(bytes: &[u8]) -> u64 {
|
||||||
pub(crate) fn mapping_version() -> u32 {
|
pub(crate) fn mapping_version() -> u32 {
|
||||||
unsafe { llvm::LLVMRustCoverageMappingVersion() }
|
unsafe { llvm::LLVMRustCoverageMappingVersion() }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn save_cov_data_to_mod<'ll, 'tcx>(
|
|
||||||
cx: &CodegenCx<'ll, 'tcx>,
|
|
||||||
cov_data_val: &'ll llvm::Value,
|
|
||||||
) {
|
|
||||||
let covmap_var_name = CString::new(llvm::build_byte_buffer(|s| unsafe {
|
|
||||||
llvm::LLVMRustCoverageWriteMappingVarNameToString(s);
|
|
||||||
}))
|
|
||||||
.unwrap();
|
|
||||||
debug!("covmap var name: {:?}", covmap_var_name);
|
|
||||||
|
|
||||||
let covmap_section_name = CString::new(llvm::build_byte_buffer(|s| unsafe {
|
|
||||||
llvm::LLVMRustCoverageWriteMapSectionNameToString(cx.llmod, s);
|
|
||||||
}))
|
|
||||||
.expect("covmap section name should not contain NUL");
|
|
||||||
debug!("covmap section name: {:?}", covmap_section_name);
|
|
||||||
|
|
||||||
let llglobal = llvm::add_global(cx.llmod, cx.val_ty(cov_data_val), &covmap_var_name);
|
|
||||||
llvm::set_initializer(llglobal, cov_data_val);
|
|
||||||
llvm::set_global_constant(llglobal, true);
|
|
||||||
llvm::set_linkage(llglobal, llvm::Linkage::PrivateLinkage);
|
|
||||||
llvm::set_section(llglobal, &covmap_section_name);
|
|
||||||
// LLVM's coverage mapping format specifies 8-byte alignment for items in this section.
|
|
||||||
llvm::set_alignment(llglobal, Align::EIGHT);
|
|
||||||
cx.add_used_global(llglobal);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn save_func_record_to_mod<'ll, 'tcx>(
|
|
||||||
cx: &CodegenCx<'ll, 'tcx>,
|
|
||||||
covfun_section_name: &CStr,
|
|
||||||
func_name_hash: u64,
|
|
||||||
func_record_val: &'ll llvm::Value,
|
|
||||||
is_used: bool,
|
|
||||||
) {
|
|
||||||
// Assign a name to the function record. This is used to merge duplicates.
|
|
||||||
//
|
|
||||||
// In LLVM, a "translation unit" (effectively, a `Crate` in Rust) can describe functions that
|
|
||||||
// are included-but-not-used. If (or when) Rust generates functions that are
|
|
||||||
// included-but-not-used, note that a dummy description for a function included-but-not-used
|
|
||||||
// in a Crate can be replaced by full description provided by a different Crate. The two kinds
|
|
||||||
// of descriptions play distinct roles in LLVM IR; therefore, assign them different names (by
|
|
||||||
// appending "u" to the end of the function record var name, to prevent `linkonce_odr` merging.
|
|
||||||
let func_record_var_name =
|
|
||||||
CString::new(format!("__covrec_{:X}{}", func_name_hash, if is_used { "u" } else { "" }))
|
|
||||||
.unwrap();
|
|
||||||
debug!("function record var name: {:?}", func_record_var_name);
|
|
||||||
debug!("function record section name: {:?}", covfun_section_name);
|
|
||||||
|
|
||||||
let llglobal = llvm::add_global(cx.llmod, cx.val_ty(func_record_val), &func_record_var_name);
|
|
||||||
llvm::set_initializer(llglobal, func_record_val);
|
|
||||||
llvm::set_global_constant(llglobal, true);
|
|
||||||
llvm::set_linkage(llglobal, llvm::Linkage::LinkOnceODRLinkage);
|
|
||||||
llvm::set_visibility(llglobal, llvm::Visibility::Hidden);
|
|
||||||
llvm::set_section(llglobal, covfun_section_name);
|
|
||||||
// LLVM's coverage mapping format specifies 8-byte alignment for items in this section.
|
|
||||||
llvm::set_alignment(llglobal, Align::EIGHT);
|
|
||||||
if cx.target_spec().supports_comdat() {
|
|
||||||
llvm::set_comdat(cx.llmod, llglobal, &func_record_var_name);
|
|
||||||
}
|
|
||||||
cx.add_used_global(llglobal);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the section name string to pass through to the linker when embedding
|
|
||||||
/// per-function coverage information in the object file, according to the target
|
|
||||||
/// platform's object file format.
|
|
||||||
///
|
|
||||||
/// LLVM's coverage tools read coverage mapping details from this section when
|
|
||||||
/// producing coverage reports.
|
|
||||||
///
|
|
||||||
/// Typical values are:
|
|
||||||
/// - `__llvm_covfun` on Linux
|
|
||||||
/// - `__LLVM_COV,__llvm_covfun` on macOS (includes `__LLVM_COV,` segment prefix)
|
|
||||||
/// - `.lcovfun$M` on Windows (includes `$M` sorting suffix)
|
|
||||||
pub(crate) fn covfun_section_name(cx: &CodegenCx<'_, '_>) -> CString {
|
|
||||||
CString::new(llvm::build_byte_buffer(|s| unsafe {
|
|
||||||
llvm::LLVMRustCoverageWriteFuncSectionNameToString(cx.llmod, s);
|
|
||||||
}))
|
|
||||||
.expect("covfun section name should not contain NUL")
|
|
||||||
}
|
|
||||||
|
|
|
@ -616,14 +616,16 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
|
||||||
|
|
||||||
let mut is_trait = false;
|
let mut is_trait = false;
|
||||||
// Attempting to call a trait method?
|
// Attempting to call a trait method?
|
||||||
if tcx.trait_of_item(callee).is_some() {
|
if let Some(trait_did) = tcx.trait_of_item(callee) {
|
||||||
trace!("attempting to call a trait method");
|
trace!("attempting to call a trait method");
|
||||||
|
|
||||||
|
let trait_is_const = tcx.is_const_trait(trait_did);
|
||||||
// trait method calls are only permitted when `effects` is enabled.
|
// trait method calls are only permitted when `effects` is enabled.
|
||||||
// we don't error, since that is handled by typeck. We try to resolve
|
// typeck ensures the conditions for calling a const trait method are met,
|
||||||
// the trait into the concrete method, and uses that for const stability
|
// so we only error if the trait isn't const. We try to resolve the trait
|
||||||
// checks.
|
// into the concrete method, and uses that for const stability checks.
|
||||||
// FIXME(effects) we might consider moving const stability checks to typeck as well.
|
// FIXME(effects) we might consider moving const stability checks to typeck as well.
|
||||||
if tcx.features().effects() {
|
if tcx.features().effects() && trait_is_const {
|
||||||
// This skips the check below that ensures we only call `const fn`.
|
// This skips the check below that ensures we only call `const fn`.
|
||||||
is_trait = true;
|
is_trait = true;
|
||||||
|
|
||||||
|
@ -638,17 +640,24 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
|
||||||
callee = def;
|
callee = def;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// if the trait is const but the user has not enabled the feature(s),
|
||||||
|
// suggest them.
|
||||||
|
let feature = if trait_is_const {
|
||||||
|
Some(if tcx.features().const_trait_impl() {
|
||||||
|
sym::effects
|
||||||
|
} else {
|
||||||
|
sym::const_trait_impl
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
self.check_op(ops::FnCallNonConst {
|
self.check_op(ops::FnCallNonConst {
|
||||||
caller,
|
caller,
|
||||||
callee,
|
callee,
|
||||||
args: fn_args,
|
args: fn_args,
|
||||||
span: *fn_span,
|
span: *fn_span,
|
||||||
call_source,
|
call_source,
|
||||||
feature: Some(if tcx.features().const_trait_impl() {
|
feature,
|
||||||
sym::effects
|
|
||||||
} else {
|
|
||||||
sym::const_trait_impl
|
|
||||||
}),
|
|
||||||
});
|
});
|
||||||
// If we allowed this, we're in miri-unleashed mode, so we might
|
// If we allowed this, we're in miri-unleashed mode, so we might
|
||||||
// as well skip the remaining checks.
|
// as well skip the remaining checks.
|
||||||
|
|
|
@ -15,7 +15,7 @@ pub(crate) fn target() -> Target {
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
code_model: Some(CodeModel::Medium),
|
code_model: Some(CodeModel::Medium),
|
||||||
cpu: "generic".into(),
|
cpu: "generic".into(),
|
||||||
features: "+f,+d".into(),
|
features: "+f,+d,+lsx".into(),
|
||||||
llvm_abiname: "lp64d".into(),
|
llvm_abiname: "lp64d".into(),
|
||||||
max_atomic_width: Some(64),
|
max_atomic_width: Some(64),
|
||||||
supported_sanitizers: SanitizerSet::ADDRESS
|
supported_sanitizers: SanitizerSet::ADDRESS
|
||||||
|
|
|
@ -15,7 +15,7 @@ pub(crate) fn target() -> Target {
|
||||||
options: TargetOptions {
|
options: TargetOptions {
|
||||||
code_model: Some(CodeModel::Medium),
|
code_model: Some(CodeModel::Medium),
|
||||||
cpu: "generic".into(),
|
cpu: "generic".into(),
|
||||||
features: "+f,+d".into(),
|
features: "+f,+d,+lsx".into(),
|
||||||
llvm_abiname: "lp64d".into(),
|
llvm_abiname: "lp64d".into(),
|
||||||
max_atomic_width: Some(64),
|
max_atomic_width: Some(64),
|
||||||
crt_static_default: false,
|
crt_static_default: false,
|
||||||
|
|
|
@ -316,7 +316,7 @@ const X86_ALLOWED_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
|
||||||
("lahfsahf", Unstable(sym::lahfsahf_target_feature), &[]),
|
("lahfsahf", Unstable(sym::lahfsahf_target_feature), &[]),
|
||||||
("lzcnt", Stable, &[]),
|
("lzcnt", Stable, &[]),
|
||||||
("movbe", Stable, &[]),
|
("movbe", Stable, &[]),
|
||||||
("pclmulqdq", Stable, &[]),
|
("pclmulqdq", Stable, &["sse2"]),
|
||||||
("popcnt", Stable, &[]),
|
("popcnt", Stable, &[]),
|
||||||
("prfchw", Unstable(sym::prfchw_target_feature), &[]),
|
("prfchw", Unstable(sym::prfchw_target_feature), &[]),
|
||||||
("rdrand", Stable, &[]),
|
("rdrand", Stable, &[]),
|
||||||
|
|
|
@ -27,11 +27,13 @@ LL + #[derive(ConstParamTy)]
|
||||||
LL | struct Foo(u8);
|
LL | struct Foo(u8);
|
||||||
|
|
|
|
||||||
|
|
||||||
error[E0284]: type annotations needed: cannot normalize `foo<N>::{constant#0}`
|
error[E0015]: cannot call non-const operator in constants
|
||||||
--> $DIR/unify-op-with-fn-call.rs:20:25
|
--> $DIR/unify-op-with-fn-call.rs:20:39
|
||||||
|
|
|
|
||||||
LL | fn foo<const N: Foo>(a: Evaluatable<{ N + N }>) {
|
LL | fn foo<const N: Foo>(a: Evaluatable<{ N + N }>) {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^ cannot normalize `foo<N>::{constant#0}`
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
error[E0741]: `Foo` must implement `ConstParamTy` to be used as the type of a const generic parameter
|
error[E0741]: `Foo` must implement `ConstParamTy` to be used as the type of a const generic parameter
|
||||||
--> $DIR/unify-op-with-fn-call.rs:20:17
|
--> $DIR/unify-op-with-fn-call.rs:20:17
|
||||||
|
@ -63,11 +65,21 @@ error[E0284]: type annotations needed: cannot normalize `foo2<N>::{constant#0}`
|
||||||
LL | fn foo2<const N: usize>(a: Evaluatable2<{ N + N }>) {
|
LL | fn foo2<const N: usize>(a: Evaluatable2<{ N + N }>) {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^ cannot normalize `foo2<N>::{constant#0}`
|
| ^^^^^^^^^^^^^^^^^^^^^^^ cannot normalize `foo2<N>::{constant#0}`
|
||||||
|
|
||||||
error[E0284]: type annotations needed: cannot normalize `foo<N>::{constant#0}`
|
error[E0015]: cannot call non-const fn `<Foo as Add>::add` in constants
|
||||||
--> $DIR/unify-op-with-fn-call.rs:21:11
|
--> $DIR/unify-op-with-fn-call.rs:21:13
|
||||||
|
|
|
|
||||||
LL | bar::<{ std::ops::Add::add(N, N) }>();
|
LL | bar::<{ std::ops::Add::add(N, N) }>();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot normalize `foo<N>::{constant#0}`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error[E0015]: cannot call non-const fn `<usize as Add>::add` in constants
|
||||||
|
--> $DIR/unify-op-with-fn-call.rs:30:14
|
||||||
|
|
|
||||||
|
LL | bar2::<{ std::ops::Add::add(N, N) }>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
error[E0284]: type annotations needed: cannot normalize `foo2<N>::{constant#0}`
|
error[E0284]: type annotations needed: cannot normalize `foo2<N>::{constant#0}`
|
||||||
--> $DIR/unify-op-with-fn-call.rs:30:12
|
--> $DIR/unify-op-with-fn-call.rs:30:12
|
||||||
|
@ -75,7 +87,7 @@ error[E0284]: type annotations needed: cannot normalize `foo2<N>::{constant#0}`
|
||||||
LL | bar2::<{ std::ops::Add::add(N, N) }>();
|
LL | bar2::<{ std::ops::Add::add(N, N) }>();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot normalize `foo2<N>::{constant#0}`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot normalize `foo2<N>::{constant#0}`
|
||||||
|
|
||||||
error: aborting due to 9 previous errors
|
error: aborting due to 10 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0284, E0741.
|
Some errors have detailed explanations: E0015, E0284, E0741.
|
||||||
For more information about an error, try `rustc --explain E0284`.
|
For more information about an error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -6,10 +6,6 @@ LL | (||1usize)()
|
||||||
|
|
|
|
||||||
= note: closures need an RFC before allowed to be called in constants
|
= note: closures need an RFC before allowed to be called in constants
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -29,10 +29,6 @@ LL | If<{ TypeId::of::<T>() != TypeId::of::<()>() }>: True,
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/any.rs:LL:COL
|
--> $SRC_DIR/core/src/any.rs:LL:COL
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const operator in constants
|
error[E0015]: cannot call non-const operator in constants
|
||||||
--> $DIR/issue-90318.rs:22:10
|
--> $DIR/issue-90318.rs:22:10
|
||||||
|
@ -43,10 +39,6 @@ LL | If<{ TypeId::of::<T>() != TypeId::of::<()>() }>: True,
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/any.rs:LL:COL
|
--> $SRC_DIR/core/src/any.rs:LL:COL
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
//@ aux-build:closure-in-foreign-crate.rs
|
// FIXME(effects) aux-build:closure-in-foreign-crate.rs
|
||||||
//@ build-pass
|
//@ build-pass
|
||||||
|
|
||||||
extern crate closure_in_foreign_crate;
|
// FIXME(effects) extern crate closure_in_foreign_crate;
|
||||||
|
|
||||||
const _: () = closure_in_foreign_crate::test();
|
// FIXME(effects) const _: () = closure_in_foreign_crate::test();
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -22,10 +22,6 @@ LL | for i in 0..x {
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const fn `<std::ops::Range<usize> as Iterator>::next` in constant functions
|
error[E0015]: cannot call non-const fn `<std::ops::Range<usize> as Iterator>::next` in constant functions
|
||||||
--> $DIR/const-fn-error.rs:5:14
|
--> $DIR/const-fn-error.rs:5:14
|
||||||
|
@ -34,10 +30,6 @@ LL | for i in 0..x {
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
|
@ -17,10 +17,6 @@ LL | for _ in 0..5 {}
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const fn `<std::ops::Range<i32> as Iterator>::next` in constants
|
error[E0015]: cannot call non-const fn `<std::ops::Range<i32> as Iterator>::next` in constants
|
||||||
--> $DIR/const-for-feature-gate.rs:4:14
|
--> $DIR/const-for-feature-gate.rs:4:14
|
||||||
|
@ -29,10 +25,6 @@ LL | for _ in 0..5 {}
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,6 @@ LL | for _ in 0..5 {}
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const fn `<std::ops::Range<i32> as Iterator>::next` in constants
|
error[E0015]: cannot call non-const fn `<std::ops::Range<i32> as Iterator>::next` in constants
|
||||||
--> $DIR/const-for.rs:4:14
|
--> $DIR/const-for.rs:4:14
|
||||||
|
@ -19,10 +15,6 @@ LL | for _ in 0..5 {}
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -17,10 +17,6 @@ LL | Some(())?;
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/option.rs:LL:COL
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: `?` cannot convert from residual of `Option<()>` in constant functions
|
error[E0015]: `?` cannot convert from residual of `Option<()>` in constant functions
|
||||||
--> $DIR/const-try-feature-gate.rs:4:5
|
--> $DIR/const-try-feature-gate.rs:4:5
|
||||||
|
@ -31,10 +27,6 @@ LL | Some(())?;
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/option.rs:LL:COL
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,8 @@ impl const Try for TryMe {
|
||||||
|
|
||||||
const fn t() -> TryMe {
|
const fn t() -> TryMe {
|
||||||
TryMe?;
|
TryMe?;
|
||||||
|
//~^ ERROR `?` cannot determine the branch of `TryMe` in constant functions
|
||||||
|
//~| ERROR `?` cannot convert from residual of `TryMe` in constant functions
|
||||||
TryMe
|
TryMe
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,5 +16,22 @@ LL | impl const Try for TryMe {
|
||||||
= note: marking a trait with `#[const_trait]` ensures all default method bodies are `const`
|
= note: marking a trait with `#[const_trait]` ensures all default method bodies are `const`
|
||||||
= note: adding a non-const method body in the future would be a breaking change
|
= note: adding a non-const method body in the future would be a breaking change
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error[E0015]: `?` cannot determine the branch of `TryMe` in constant functions
|
||||||
|
--> $DIR/const-try.rs:36:5
|
||||||
|
|
|
||||||
|
LL | TryMe?;
|
||||||
|
| ^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error[E0015]: `?` cannot convert from residual of `TryMe` in constant functions
|
||||||
|
--> $DIR/const-try.rs:36:5
|
||||||
|
|
|
||||||
|
LL | TryMe?;
|
||||||
|
| ^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
//@ check-pass
|
|
||||||
//@ compile-flags: -Znext-solver
|
//@ compile-flags: -Znext-solver
|
||||||
#![feature(const_type_id, const_trait_impl, effects)]
|
#![feature(const_type_id, const_trait_impl, effects)]
|
||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
|
@ -7,11 +6,13 @@ use std::any::TypeId;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
const {
|
const {
|
||||||
// FIXME(effects) this isn't supposed to pass (right now) but it did.
|
|
||||||
// revisit binops typeck please.
|
|
||||||
assert!(TypeId::of::<u8>() == TypeId::of::<u8>());
|
assert!(TypeId::of::<u8>() == TypeId::of::<u8>());
|
||||||
|
//~^ ERROR cannot call non-const operator in constants
|
||||||
assert!(TypeId::of::<()>() != TypeId::of::<u8>());
|
assert!(TypeId::of::<()>() != TypeId::of::<u8>());
|
||||||
|
//~^ ERROR cannot call non-const operator in constants
|
||||||
let _a = TypeId::of::<u8>() < TypeId::of::<u16>();
|
let _a = TypeId::of::<u8>() < TypeId::of::<u16>();
|
||||||
|
//~^ ERROR cannot call non-const operator in constants
|
||||||
// can't assert `_a` because it is not deterministic
|
// can't assert `_a` because it is not deterministic
|
||||||
|
// FIXME(effects) make it pass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
34
tests/ui/consts/const_cmp_type_id.stderr
Normal file
34
tests/ui/consts/const_cmp_type_id.stderr
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
error[E0015]: cannot call non-const operator in constants
|
||||||
|
--> $DIR/const_cmp_type_id.rs:9:17
|
||||||
|
|
|
||||||
|
LL | assert!(TypeId::of::<u8>() == TypeId::of::<u8>());
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: impl defined here, but it is not `const`
|
||||||
|
--> $SRC_DIR/core/src/any.rs:LL:COL
|
||||||
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error[E0015]: cannot call non-const operator in constants
|
||||||
|
--> $DIR/const_cmp_type_id.rs:11:17
|
||||||
|
|
|
||||||
|
LL | assert!(TypeId::of::<()>() != TypeId::of::<u8>());
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: impl defined here, but it is not `const`
|
||||||
|
--> $SRC_DIR/core/src/any.rs:LL:COL
|
||||||
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error[E0015]: cannot call non-const operator in constants
|
||||||
|
--> $DIR/const_cmp_type_id.rs:13:18
|
||||||
|
|
|
||||||
|
LL | let _a = TypeId::of::<u8>() < TypeId::of::<u16>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: impl defined here, but it is not `const`
|
||||||
|
--> $SRC_DIR/core/src/any.rs:LL:COL
|
||||||
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
|
= note: this error originates in the derive macro `PartialOrd` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
|
@ -35,10 +35,6 @@ LL | for i in 0..4 {
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const fn `<std::ops::Range<i32> as Iterator>::next` in constants
|
error[E0015]: cannot call non-const fn `<std::ops::Range<i32> as Iterator>::next` in constants
|
||||||
--> $DIR/loop.rs:53:14
|
--> $DIR/loop.rs:53:14
|
||||||
|
@ -47,10 +43,6 @@ LL | for i in 0..4 {
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot convert `std::ops::Range<i32>` into an iterator in constants
|
error[E0015]: cannot convert `std::ops::Range<i32>` into an iterator in constants
|
||||||
--> $DIR/loop.rs:59:14
|
--> $DIR/loop.rs:59:14
|
||||||
|
@ -61,10 +53,6 @@ LL | for i in 0..4 {
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const fn `<std::ops::Range<i32> as Iterator>::next` in constants
|
error[E0015]: cannot call non-const fn `<std::ops::Range<i32> as Iterator>::next` in constants
|
||||||
--> $DIR/loop.rs:59:14
|
--> $DIR/loop.rs:59:14
|
||||||
|
@ -73,10 +61,6 @@ LL | for i in 0..4 {
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
error: aborting due to 6 previous errors
|
||||||
|
|
||||||
|
|
|
@ -17,10 +17,6 @@ LL | x?;
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/option.rs:LL:COL
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: `?` cannot convert from residual of `Option<i32>` in constant functions
|
error[E0015]: `?` cannot convert from residual of `Option<i32>` in constant functions
|
||||||
--> $DIR/try.rs:6:5
|
--> $DIR/try.rs:6:5
|
||||||
|
@ -31,10 +27,6 @@ LL | x?;
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/option.rs:LL:COL
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
|
@ -183,10 +183,6 @@ LL | assert!(test_one == (1, 1, 1));
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const operator in constants
|
error[E0015]: cannot call non-const operator in constants
|
||||||
--> $DIR/fn_trait_refs.rs:73:17
|
--> $DIR/fn_trait_refs.rs:73:17
|
||||||
|
@ -195,10 +191,6 @@ LL | assert!(test_two == (2, 2));
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const closure in constant functions
|
error[E0015]: cannot call non-const closure in constant functions
|
||||||
--> $DIR/fn_trait_refs.rs:15:5
|
--> $DIR/fn_trait_refs.rs:15:5
|
||||||
|
@ -211,10 +203,6 @@ help: consider further restricting this bound
|
||||||
|
|
|
|
||||||
LL | T: ~const Fn<()> + ~const Destruct + ~const Fn(),
|
LL | T: ~const Fn<()> + ~const Destruct + ~const Fn(),
|
||||||
| +++++++++++++
|
| +++++++++++++
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0493]: destructor of `T` cannot be evaluated at compile-time
|
error[E0493]: destructor of `T` cannot be evaluated at compile-time
|
||||||
--> $DIR/fn_trait_refs.rs:11:23
|
--> $DIR/fn_trait_refs.rs:11:23
|
||||||
|
@ -236,10 +224,6 @@ help: consider further restricting this bound
|
||||||
|
|
|
|
||||||
LL | T: ~const FnMut<()> + ~const Destruct + ~const FnMut(),
|
LL | T: ~const FnMut<()> + ~const Destruct + ~const FnMut(),
|
||||||
| ++++++++++++++++
|
| ++++++++++++++++
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0493]: destructor of `T` cannot be evaluated at compile-time
|
error[E0493]: destructor of `T` cannot be evaluated at compile-time
|
||||||
--> $DIR/fn_trait_refs.rs:18:27
|
--> $DIR/fn_trait_refs.rs:18:27
|
||||||
|
@ -261,10 +245,6 @@ help: consider further restricting this bound
|
||||||
|
|
|
|
||||||
LL | T: ~const FnOnce<()> + ~const FnOnce(),
|
LL | T: ~const FnOnce<()> + ~const FnOnce(),
|
||||||
| +++++++++++++++++
|
| +++++++++++++++++
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0493]: destructor of `T` cannot be evaluated at compile-time
|
error[E0493]: destructor of `T` cannot be evaluated at compile-time
|
||||||
--> $DIR/fn_trait_refs.rs:32:21
|
--> $DIR/fn_trait_refs.rs:32:21
|
||||||
|
|
|
@ -6,10 +6,6 @@ LL | const { (|| {})() } => {}
|
||||||
|
|
|
|
||||||
= note: closures need an RFC before allowed to be called in constants
|
= note: closures need an RFC before allowed to be called in constants
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: could not evaluate constant pattern
|
error: could not evaluate constant pattern
|
||||||
--> $DIR/invalid-inline-const-in-match-arm.rs:5:9
|
--> $DIR/invalid-inline-const-in-match-arm.rs:5:9
|
||||||
|
|
|
@ -6,10 +6,6 @@ LL | || -> u8 { 5 }()
|
||||||
|
|
|
|
||||||
= note: closures need an RFC before allowed to be called in constants
|
= note: closures need an RFC before allowed to be called in constants
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -6,10 +6,6 @@ LL | const fn foo() { (||{})() }
|
||||||
|
|
|
|
||||||
= note: closures need an RFC before allowed to be called in constant functions
|
= note: closures need an RFC before allowed to be called in constant functions
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: function pointer calls are not allowed in constant functions
|
error: function pointer calls are not allowed in constant functions
|
||||||
--> $DIR/issue-56164.rs:5:5
|
--> $DIR/issue-56164.rs:5:5
|
||||||
|
|
|
@ -6,10 +6,6 @@ LL | a: [(); (|| { 0 })()]
|
||||||
|
|
|
|
||||||
= note: closures need an RFC before allowed to be called in constants
|
= note: closures need an RFC before allowed to be called in constants
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,6 @@ LL | GetTypeId::<T>::VALUE == GetTypeId::<usize>::VALUE
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/any.rs:LL:COL
|
--> $SRC_DIR/core/src/any.rs:LL:COL
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,6 @@
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
|
|
||||||
const fn f(a: &u8, b: &u8) -> bool {
|
const fn f(a: &u8, b: &u8) -> bool {
|
||||||
//~^ HELP: add `#![feature(const_trait_impl)]`
|
|
||||||
//~| HELP: add `#![feature(const_trait_impl)]`
|
|
||||||
//~| HELP: add `#![feature(const_trait_impl)]`
|
|
||||||
a == b
|
a == b
|
||||||
//~^ ERROR: cannot call non-const operator in constant functions [E0015]
|
//~^ ERROR: cannot call non-const operator in constant functions [E0015]
|
||||||
//~| HELP: consider dereferencing here
|
//~| HELP: consider dereferencing here
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0015]: cannot call non-const operator in constant functions
|
error[E0015]: cannot call non-const operator in constant functions
|
||||||
--> $DIR/issue-90870.rs:9:5
|
--> $DIR/issue-90870.rs:6:5
|
||||||
|
|
|
|
||||||
LL | a == b
|
LL | a == b
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
@ -9,13 +9,9 @@ help: consider dereferencing here
|
||||||
|
|
|
|
||||||
LL | *a == *b
|
LL | *a == *b
|
||||||
| + +
|
| + +
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const operator in constant functions
|
error[E0015]: cannot call non-const operator in constant functions
|
||||||
--> $DIR/issue-90870.rs:15:5
|
--> $DIR/issue-90870.rs:12:5
|
||||||
|
|
|
|
||||||
LL | a == b
|
LL | a == b
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
@ -25,13 +21,9 @@ help: consider dereferencing here
|
||||||
|
|
|
|
||||||
LL | ****a == ****b
|
LL | ****a == ****b
|
||||||
| ++++ ++++
|
| ++++ ++++
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const operator in constant functions
|
error[E0015]: cannot call non-const operator in constant functions
|
||||||
--> $DIR/issue-90870.rs:22:12
|
--> $DIR/issue-90870.rs:19:12
|
||||||
|
|
|
|
||||||
LL | if l == r {
|
LL | if l == r {
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
@ -41,10 +33,6 @@ help: consider dereferencing here
|
||||||
|
|
|
|
||||||
LL | if *l == *r {
|
LL | if *l == *r {
|
||||||
| + +
|
| + +
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,6 @@ LL | self.bar[0] = baz.len();
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
|
--> $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,6 @@ LL | Err(())?;
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/result.rs:LL:COL
|
--> $SRC_DIR/core/src/result.rs:LL:COL
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: `?` cannot convert from residual of `Result<bool, ()>` in constant functions
|
error[E0015]: `?` cannot convert from residual of `Result<bool, ()>` in constant functions
|
||||||
--> $DIR/try-operator.rs:10:9
|
--> $DIR/try-operator.rs:10:9
|
||||||
|
@ -27,10 +23,6 @@ LL | Err(())?;
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/result.rs:LL:COL
|
--> $SRC_DIR/core/src/result.rs:LL:COL
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: `?` cannot determine the branch of `Option<()>` in constant functions
|
error[E0015]: `?` cannot determine the branch of `Option<()>` in constant functions
|
||||||
--> $DIR/try-operator.rs:18:9
|
--> $DIR/try-operator.rs:18:9
|
||||||
|
@ -41,10 +33,6 @@ LL | None?;
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/option.rs:LL:COL
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: `?` cannot convert from residual of `Option<()>` in constant functions
|
error[E0015]: `?` cannot convert from residual of `Option<()>` in constant functions
|
||||||
--> $DIR/try-operator.rs:18:9
|
--> $DIR/try-operator.rs:18:9
|
||||||
|
@ -55,10 +43,6 @@ LL | None?;
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/option.rs:LL:COL
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
|
|
@ -23,10 +23,6 @@ help: consider further restricting this bound
|
||||||
|
|
|
|
||||||
LL | const fn unwrap_or_else<F: ~const FnOnce() -> T + ~const FnOnce()>(self, f: F) -> T {
|
LL | const fn unwrap_or_else<F: ~const FnOnce() -> T + ~const FnOnce()>(self, f: F) -> T {
|
||||||
| +++++++++++++++++
|
| +++++++++++++++++
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0493]: destructor of `F` cannot be evaluated at compile-time
|
error[E0493]: destructor of `F` cannot be evaluated at compile-time
|
||||||
--> $DIR/unstable-const-fn-in-libcore.rs:19:60
|
--> $DIR/unstable-const-fn-in-libcore.rs:19:60
|
||||||
|
|
|
@ -37,10 +37,6 @@ help: consider further restricting this bound
|
||||||
|
|
|
|
||||||
LL | const fn with_positive<F: for<'a> ~const Fn(&'a Alias<'a>) + ~const Destruct + ~const Fn(&foo::Alias<'_>)>(fun: F) {
|
LL | const fn with_positive<F: for<'a> ~const Fn(&'a Alias<'a>) + ~const Destruct + ~const Fn(&foo::Alias<'_>)>(fun: F) {
|
||||||
| ++++++++++++++++++++++++++++
|
| ++++++++++++++++++++++++++++
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0493]: destructor of `F` cannot be evaluated at compile-time
|
error[E0493]: destructor of `F` cannot be evaluated at compile-time
|
||||||
--> $DIR/normalize-tait-in-const.rs:26:79
|
--> $DIR/normalize-tait-in-const.rs:26:79
|
||||||
|
|
|
@ -17,10 +17,6 @@ LL | impl Deref for A {
|
||||||
| ^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
= note: calls in statics are limited to constant functions, tuple structs and tuple variants
|
= note: calls in statics are limited to constant functions, tuple structs and tuple variants
|
||||||
= note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)`
|
= note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)`
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -50,10 +50,6 @@ LL | [(); { for _ in 0usize.. {}; 0}];
|
||||||
note: impl defined here, but it is not `const`
|
note: impl defined here, but it is not `const`
|
||||||
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const fn `<RangeFrom<usize> as Iterator>::next` in constants
|
error[E0015]: cannot call non-const fn `<RangeFrom<usize> as Iterator>::next` in constants
|
||||||
--> $DIR/issue-52443.rs:9:21
|
--> $DIR/issue-52443.rs:9:21
|
||||||
|
@ -62,10 +58,6 @@ LL | [(); { for _ in 0usize.. {}; 0}];
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 5 previous errors; 1 warning emitted
|
error: aborting due to 5 previous errors; 1 warning emitted
|
||||||
|
|
||||||
|
|
|
@ -353,10 +353,6 @@ LL | static bar: &[i32] = &(&[1,2,3] as &[i32][0..1]);
|
||||||
|
|
|
|
||||||
= note: calls in statics are limited to constant functions, tuple structs and tuple variants
|
= note: calls in statics are limited to constant functions, tuple structs and tuple variants
|
||||||
= note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)`
|
= note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)`
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 40 previous errors
|
error: aborting due to 40 previous errors
|
||||||
|
|
||||||
|
|
|
@ -5,10 +5,6 @@ LL | let array: [usize; Dim3::dim()]
|
||||||
| ^^^^^^^^^^^
|
| ^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const fn `<Dim3 as Dim>::dim` in constants
|
error[E0015]: cannot call non-const fn `<Dim3 as Dim>::dim` in constants
|
||||||
--> $DIR/issue-39559-2.rs:16:15
|
--> $DIR/issue-39559-2.rs:16:15
|
||||||
|
@ -17,10 +13,6 @@ LL | = [0; Dim3::dim()];
|
||||||
| ^^^^^^^^^^^
|
| ^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -5,10 +5,6 @@ LL | self.0
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0493]: destructor of `R` cannot be evaluated at compile-time
|
error[E0493]: destructor of `R` cannot be evaluated at compile-time
|
||||||
--> $DIR/arbitrary-self-from-method-substs-ice.rs:10:43
|
--> $DIR/arbitrary-self-from-method-substs-ice.rs:10:43
|
||||||
|
|
|
@ -37,10 +37,6 @@ LL | field2: SafeEnum::Variant4("str".to_string()),
|
||||||
|
|
|
|
||||||
= note: calls in statics are limited to constant functions, tuple structs and tuple variants
|
= note: calls in statics are limited to constant functions, tuple structs and tuple variants
|
||||||
= note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)`
|
= note: consider wrapping this expression in `std::sync::LazyLock::new(|| ...)`
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0010]: allocations are not allowed in statics
|
error[E0010]: allocations are not allowed in statics
|
||||||
--> $DIR/check-values-constraints.rs:96:5
|
--> $DIR/check-values-constraints.rs:96:5
|
||||||
|
|
|
@ -23,10 +23,6 @@ LL | const ADD_INT: Int = Int(1i32) + Int(2i32);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const fn `<i32 as Plus>::plus` in constant functions
|
error[E0015]: cannot call non-const fn `<i32 as Plus>::plus` in constant functions
|
||||||
--> $DIR/call-const-trait-method-pass.rs:11:20
|
--> $DIR/call-const-trait-method-pass.rs:11:20
|
||||||
|
@ -47,10 +43,6 @@ LL | !self.eq(other)
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const fn `<i32 as Plus>::plus` in constant functions
|
error[E0015]: cannot call non-const fn `<i32 as Plus>::plus` in constant functions
|
||||||
--> $DIR/call-const-trait-method-pass.rs:36:7
|
--> $DIR/call-const-trait-method-pass.rs:36:7
|
||||||
|
|
|
@ -19,10 +19,6 @@ LL | PartialEq::eq(self, other)
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
|
@ -44,5 +44,26 @@ LL | const fn equals_self_wrapper<T: ~const PartialEq>(t: &T) -> bool {
|
||||||
|
|
|
|
||||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||||
|
|
||||||
error: aborting due to 5 previous errors; 1 warning emitted
|
error[E0015]: cannot call non-const operator in constant functions
|
||||||
|
--> $DIR/call-generic-method-chain.rs:21:5
|
||||||
|
|
|
||||||
|
LL | *t == *t
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
help: consider further restricting this bound
|
||||||
|
|
|
||||||
|
LL | const fn equals_self<T: ~const PartialEq + ~const std::cmp::PartialEq>(t: &T) -> bool {
|
||||||
|
| ++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
error[E0015]: cannot call non-const fn `<S as PartialEq>::eq` in constant functions
|
||||||
|
--> $DIR/call-generic-method-chain.rs:16:15
|
||||||
|
|
|
||||||
|
LL | !self.eq(other)
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error: aborting due to 7 previous errors; 1 warning emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -44,5 +44,38 @@ LL | const fn equals_self2<T: A + ~const PartialEq>(t: &T) -> bool {
|
||||||
|
|
|
|
||||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||||
|
|
||||||
error: aborting due to 5 previous errors; 1 warning emitted
|
error[E0015]: cannot call non-const operator in constant functions
|
||||||
|
--> $DIR/call-generic-method-dup-bound.rs:21:5
|
||||||
|
|
|
||||||
|
LL | *t == *t
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
help: consider further restricting this bound
|
||||||
|
|
|
||||||
|
LL | const fn equals_self<T: PartialEq + ~const PartialEq + ~const std::cmp::PartialEq>(t: &T) -> bool {
|
||||||
|
| ++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
error[E0015]: cannot call non-const fn `<S as PartialEq>::eq` in constant functions
|
||||||
|
--> $DIR/call-generic-method-dup-bound.rs:14:15
|
||||||
|
|
|
||||||
|
LL | !self.eq(other)
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error[E0015]: cannot call non-const operator in constant functions
|
||||||
|
--> $DIR/call-generic-method-dup-bound.rs:28:5
|
||||||
|
|
|
||||||
|
LL | *t == *t
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
help: consider further restricting this bound
|
||||||
|
|
|
||||||
|
LL | const fn equals_self2<T: A + ~const PartialEq + ~const std::cmp::PartialEq>(t: &T) -> bool {
|
||||||
|
| ++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
error: aborting due to 8 previous errors; 1 warning emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
//@ check-pass
|
|
||||||
//@ compile-flags: -Znext-solver
|
//@ compile-flags: -Znext-solver
|
||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
#![feature(const_trait_impl, effects)]
|
#![feature(const_trait_impl, effects)]
|
||||||
|
|
||||||
pub const fn equals_self<T: PartialEq>(t: &T) -> bool {
|
pub const fn equals_self<T: PartialEq>(t: &T) -> bool {
|
||||||
*t == *t
|
*t == *t
|
||||||
// FIXME(effects) ~^ ERROR mismatched types
|
//~^ ERROR cannot call non-const operator in constant functions
|
||||||
// FIXME(effects): diagnostic
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
15
tests/ui/traits/const-traits/call-generic-method-fail.stderr
Normal file
15
tests/ui/traits/const-traits/call-generic-method-fail.stderr
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
error[E0015]: cannot call non-const operator in constant functions
|
||||||
|
--> $DIR/call-generic-method-fail.rs:6:5
|
||||||
|
|
|
||||||
|
LL | *t == *t
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
help: consider further restricting this bound
|
||||||
|
|
|
||||||
|
LL | pub const fn equals_self<T: PartialEq + ~const std::cmp::PartialEq>(t: &T) -> bool {
|
||||||
|
| ++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
|
@ -30,5 +30,26 @@ LL | const fn equals_self<T: ~const PartialEq>(t: &T) -> bool {
|
||||||
|
|
|
|
||||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||||
|
|
||||||
error: aborting due to 3 previous errors; 1 warning emitted
|
error[E0015]: cannot call non-const operator in constant functions
|
||||||
|
--> $DIR/call-generic-method-pass.rs:21:5
|
||||||
|
|
|
||||||
|
LL | *t == *t
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
help: consider further restricting this bound
|
||||||
|
|
|
||||||
|
LL | const fn equals_self<T: ~const PartialEq + ~const std::cmp::PartialEq>(t: &T) -> bool {
|
||||||
|
| ++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
error[E0015]: cannot call non-const fn `<S as PartialEq>::eq` in constant functions
|
||||||
|
--> $DIR/call-generic-method-pass.rs:16:15
|
||||||
|
|
|
||||||
|
LL | !self.eq(other)
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error: aborting due to 5 previous errors; 1 warning emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
//@ check-pass
|
// FIXME(effects) check-pass
|
||||||
//@ compile-flags: -Znext-solver
|
//@ compile-flags: -Znext-solver
|
||||||
#![feature(const_closures, const_trait_impl, effects)]
|
#![feature(const_closures, const_trait_impl, effects)]
|
||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
|
|
||||||
pub const _: () = {
|
pub const _: () = {
|
||||||
assert!((const || true)());
|
assert!((const || true)());
|
||||||
|
//~^ ERROR cannot call non-const closure in constants
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
12
tests/ui/traits/const-traits/call.stderr
Normal file
12
tests/ui/traits/const-traits/call.stderr
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
error[E0015]: cannot call non-const closure in constants
|
||||||
|
--> $DIR/call.rs:7:13
|
||||||
|
|
|
||||||
|
LL | assert!((const || true)());
|
||||||
|
| ^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: closures need an RFC before allowed to be called in constants
|
||||||
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
|
@ -23,10 +23,6 @@ help: consider further restricting this bound
|
||||||
|
|
|
|
||||||
LL | const fn need_const_closure<T: ~const FnOnce(()) -> i32 + ~const FnOnce(())>(x: T) -> i32 {
|
LL | const fn need_const_closure<T: ~const FnOnce(()) -> i32 + ~const FnOnce(())>(x: T) -> i32 {
|
||||||
| +++++++++++++++++++
|
| +++++++++++++++++++
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
|
@ -23,10 +23,6 @@ help: consider further restricting this bound
|
||||||
|
|
|
|
||||||
LL | const fn need_const_closure<T: ~const FnOnce(()) -> i32 + ~const FnOnce(())>(x: T) -> i32 {
|
LL | const fn need_const_closure<T: ~const FnOnce(()) -> i32 + ~const FnOnce(())>(x: T) -> i32 {
|
||||||
| +++++++++++++++++++
|
| +++++++++++++++++++
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
|
@ -65,10 +65,6 @@ help: consider further restricting this bound
|
||||||
|
|
|
|
||||||
LL | const fn answer<F: ~const Fn() -> u8 + ~const Fn()>(f: &F) -> u8 {
|
LL | const fn answer<F: ~const Fn() -> u8 + ~const Fn()>(f: &F) -> u8 {
|
||||||
| +++++++++++++
|
| +++++++++++++
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const closure in constant functions
|
error[E0015]: cannot call non-const closure in constant functions
|
||||||
--> $DIR/const-closures.rs:24:11
|
--> $DIR/const-closures.rs:24:11
|
||||||
|
@ -81,10 +77,6 @@ help: consider further restricting this bound
|
||||||
|
|
|
|
||||||
LL | const fn answer<F: ~const Fn() -> u8 + ~const Fn()>(f: &F) -> u8 {
|
LL | const fn answer<F: ~const Fn() -> u8 + ~const Fn()>(f: &F) -> u8 {
|
||||||
| +++++++++++++
|
| +++++++++++++
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const closure in constant functions
|
error[E0015]: cannot call non-const closure in constant functions
|
||||||
--> $DIR/const-closures.rs:12:5
|
--> $DIR/const-closures.rs:12:5
|
||||||
|
@ -97,10 +89,6 @@ help: consider further restricting this bound
|
||||||
|
|
|
|
||||||
LL | F: ~const FnOnce() -> u8 + ~const Fn(),
|
LL | F: ~const FnOnce() -> u8 + ~const Fn(),
|
||||||
| +++++++++++++
|
| +++++++++++++
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 11 previous errors
|
error: aborting due to 11 previous errors
|
||||||
|
|
||||||
|
|
|
@ -22,5 +22,17 @@ LL | #[derive_const(Default)]
|
||||||
= note: adding a non-const method body in the future would be a breaking change
|
= note: adding a non-const method body in the future would be a breaking change
|
||||||
= note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error: aborting due to 2 previous errors; 1 warning emitted
|
error[E0015]: cannot call non-const fn `<A as Default>::default` in constant functions
|
||||||
|
--> $DIR/derive-const-non-const-type.rs:11:14
|
||||||
|
|
|
||||||
|
LL | #[derive_const(Default)]
|
||||||
|
| ------- in this derive macro expansion
|
||||||
|
LL | pub struct S(A);
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
= note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors; 1 warning emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -62,29 +62,67 @@ LL | #[derive_const(Default, PartialEq)]
|
||||||
= note: adding a non-const method body in the future would be a breaking change
|
= note: adding a non-const method body in the future would be a breaking change
|
||||||
= note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error[E0080]: evaluation of constant value failed
|
error[E0015]: cannot call non-const fn `<S as Default>::default` in constants
|
||||||
--> $DIR/derive-const-use.rs:16:14
|
--> $DIR/derive-const-use.rs:18:35
|
||||||
|
|
|
|
||||||
LL | #[derive_const(Default, PartialEq)]
|
LL | const _: () = assert!(S((), A) == S::default());
|
||||||
| ------- in this derive macro expansion
|
| ^^^^^^^^^^^^
|
||||||
LL | pub struct S((), A);
|
|
||||||
| ^^ calling non-const function `<() as Default>::default`
|
|
||||||
|
|
|
|
||||||
note: inside `<S as Default>::default`
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error[E0015]: cannot call non-const operator in constants
|
||||||
|
--> $DIR/derive-const-use.rs:18:23
|
||||||
|
|
|
||||||
|
LL | const _: () = assert!(S((), A) == S::default());
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error[E0015]: cannot call non-const fn `<() as Default>::default` in constant functions
|
||||||
--> $DIR/derive-const-use.rs:16:14
|
--> $DIR/derive-const-use.rs:16:14
|
||||||
|
|
|
|
||||||
LL | #[derive_const(Default, PartialEq)]
|
LL | #[derive_const(Default, PartialEq)]
|
||||||
| ------- in this derive macro expansion
|
| ------- in this derive macro expansion
|
||||||
LL | pub struct S((), A);
|
LL | pub struct S((), A);
|
||||||
| ^^
|
| ^^
|
||||||
note: inside `_`
|
|
||||||
--> $DIR/derive-const-use.rs:18:35
|
|
||||||
|
|
|
|
||||||
LL | const _: () = assert!(S((), A) == S::default());
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
| ^^^^^^^^^^^^
|
|
||||||
= note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error: aborting due to 8 previous errors; 1 warning emitted
|
error[E0015]: cannot call non-const fn `<A as Default>::default` in constant functions
|
||||||
|
--> $DIR/derive-const-use.rs:16:18
|
||||||
|
|
|
||||||
|
LL | #[derive_const(Default, PartialEq)]
|
||||||
|
| ------- in this derive macro expansion
|
||||||
|
LL | pub struct S((), A);
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
= note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
Some errors have detailed explanations: E0080, E0635.
|
error[E0015]: cannot call non-const operator in constant functions
|
||||||
For more information about an error, try `rustc --explain E0080`.
|
--> $DIR/derive-const-use.rs:16:14
|
||||||
|
|
|
||||||
|
LL | #[derive_const(Default, PartialEq)]
|
||||||
|
| --------- in this derive macro expansion
|
||||||
|
LL | pub struct S((), A);
|
||||||
|
| ^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
= note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
error[E0015]: cannot call non-const operator in constant functions
|
||||||
|
--> $DIR/derive-const-use.rs:16:18
|
||||||
|
|
|
||||||
|
LL | #[derive_const(Default, PartialEq)]
|
||||||
|
| --------- in this derive macro expansion
|
||||||
|
LL | pub struct S((), A);
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
= note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
error: aborting due to 13 previous errors; 1 warning emitted
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0015, E0635.
|
||||||
|
For more information about an error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -30,5 +30,25 @@ LL | #[derive_const(PartialEq)]
|
||||||
|
|
|
|
||||||
= note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error: aborting due to 3 previous errors; 1 warning emitted
|
error[E0015]: cannot call non-const operator in constant functions
|
||||||
|
--> $DIR/derive-const-with-params.rs:8:23
|
||||||
|
|
|
||||||
|
LL | #[derive_const(PartialEq)]
|
||||||
|
| --------- in this derive macro expansion
|
||||||
|
LL | pub struct Reverse<T>(T);
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
= note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
error[E0015]: cannot call non-const operator in constant functions
|
||||||
|
--> $DIR/derive-const-with-params.rs:11:5
|
||||||
|
|
|
||||||
|
LL | a == b
|
||||||
|
| ^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error: aborting due to 5 previous errors; 1 warning emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
//@ check-pass
|
|
||||||
// FIXME(effects) this shouldn't pass
|
|
||||||
//@ compile-flags: -Znext-solver
|
//@ compile-flags: -Znext-solver
|
||||||
#![feature(const_closures, const_trait_impl, effects)]
|
#![feature(const_closures, const_trait_impl, effects)]
|
||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
|
@ -14,5 +12,6 @@ impl Foo for () {
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
(const || { (()).foo() })();
|
(const || { (()).foo() })();
|
||||||
// FIXME(effects) ~^ ERROR: cannot call non-const fn
|
//~^ ERROR: cannot call non-const fn `<() as Foo>::foo` in constant functions
|
||||||
|
// FIXME(effects) this should probably say constant closures
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
error[E0015]: cannot call non-const fn `<() as Foo>::foo` in constant functions
|
||||||
|
--> $DIR/const_closure-const_trait_impl-ice-113381.rs:14:22
|
||||||
|
|
|
||||||
|
LL | (const || { (()).foo() })();
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
|
@ -10,6 +10,7 @@ const fn test() -> impl ~const Fn() {
|
||||||
[first, remainder @ ..] => {
|
[first, remainder @ ..] => {
|
||||||
assert_eq!(first, &b'f');
|
assert_eq!(first, &b'f');
|
||||||
//~^ ERROR cannot call non-const fn
|
//~^ ERROR cannot call non-const fn
|
||||||
|
//~| ERROR cannot call non-const operator
|
||||||
}
|
}
|
||||||
[] => panic!(),
|
[] => panic!(),
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,15 @@ LL | const fn test() -> impl ~const Fn() {
|
||||||
|
|
|
|
||||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||||
|
|
||||||
|
error[E0015]: cannot call non-const operator in constant functions
|
||||||
|
--> $DIR/ice-112822-expected-type-for-param.rs:11:17
|
||||||
|
|
|
||||||
|
LL | assert_eq!(first, &b'f');
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
= note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error[E0015]: cannot call non-const fn `core::panicking::assert_failed::<&u8, &u8>` in constant functions
|
error[E0015]: cannot call non-const fn `core::panicking::assert_failed::<&u8, &u8>` in constant functions
|
||||||
--> $DIR/ice-112822-expected-type-for-param.rs:11:17
|
--> $DIR/ice-112822-expected-type-for-param.rs:11:17
|
||||||
|
|
|
|
||||||
|
@ -45,7 +54,7 @@ LL | assert_eq!(first, &b'f');
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
= note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error: aborting due to 5 previous errors; 1 warning emitted
|
error: aborting due to 6 previous errors; 1 warning emitted
|
||||||
|
|
||||||
Some errors have detailed explanations: E0015, E0658.
|
Some errors have detailed explanations: E0015, E0658.
|
||||||
For more information about an error, try `rustc --explain E0015`.
|
For more information about an error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -14,10 +14,6 @@ LL | arg + arg
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,8 @@ pub trait MyTrait {
|
||||||
impl const MyTrait for () {
|
impl const MyTrait for () {
|
||||||
fn method(&self) -> Option<()> {
|
fn method(&self) -> Option<()> {
|
||||||
Some(())?; //~ ERROR `?` is not allowed in a `const fn`
|
Some(())?; //~ ERROR `?` is not allowed in a `const fn`
|
||||||
|
//~^ ERROR `?` cannot determine the branch of `Option<()>` in constant functions
|
||||||
|
//~| ERROR `?` cannot convert from residual of `Option<()>` in constant functions
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,27 @@ LL | Some(())?;
|
||||||
= help: add `#![feature(const_try)]` to the crate attributes to enable
|
= help: add `#![feature(const_try)]` to the crate attributes to enable
|
||||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
error: aborting due to 1 previous error; 1 warning emitted
|
error[E0015]: `?` cannot determine the branch of `Option<()>` in constant functions
|
||||||
|
--> $DIR/hir-const-check.rs:14:9
|
||||||
|
|
|
||||||
|
LL | Some(())?;
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: impl defined here, but it is not `const`
|
||||||
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
error[E0015]: `?` cannot convert from residual of `Option<()>` in constant functions
|
||||||
|
--> $DIR/hir-const-check.rs:14:9
|
||||||
|
|
|
||||||
|
LL | Some(())?;
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: impl defined here, but it is not `const`
|
||||||
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors; 1 warning emitted
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0015, E0658.
|
||||||
|
For more information about an error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -18,6 +18,8 @@ impl const Try for TryMe {
|
||||||
|
|
||||||
const fn t() -> TryMe {
|
const fn t() -> TryMe {
|
||||||
TryMe?;
|
TryMe?;
|
||||||
|
//~^ ERROR `?` cannot determine the branch of `TryMe` in constant functions
|
||||||
|
//~| ERROR `?` cannot convert from residual of `TryMe` in constant functions
|
||||||
TryMe
|
TryMe
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,23 @@ LL | impl const Try for TryMe {
|
||||||
= help: implement the missing item: `fn from_output(_: <Self as Try>::Output) -> Self { todo!() }`
|
= help: implement the missing item: `fn from_output(_: <Self as Try>::Output) -> Self { todo!() }`
|
||||||
= help: implement the missing item: `fn branch(self) -> ControlFlow<<Self as Try>::Residual, <Self as Try>::Output> { todo!() }`
|
= help: implement the missing item: `fn branch(self) -> ControlFlow<<Self as Try>::Residual, <Self as Try>::Output> { todo!() }`
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error[E0015]: `?` cannot determine the branch of `TryMe` in constant functions
|
||||||
|
--> $DIR/ice-126148-failed-to-normalize.rs:20:5
|
||||||
|
|
|
||||||
|
LL | TryMe?;
|
||||||
|
| ^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0046`.
|
error[E0015]: `?` cannot convert from residual of `TryMe` in constant functions
|
||||||
|
--> $DIR/ice-126148-failed-to-normalize.rs:20:5
|
||||||
|
|
|
||||||
|
LL | TryMe?;
|
||||||
|
| ^^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0015, E0046.
|
||||||
|
For more information about an error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -25,6 +25,7 @@ impl Trait for () {
|
||||||
|
|
||||||
const fn foo() {
|
const fn foo() {
|
||||||
().foo();
|
().foo();
|
||||||
|
//~^ ERROR cannot call non-const fn `<() as Trait>::foo` in constant functions
|
||||||
}
|
}
|
||||||
|
|
||||||
const UWU: () = foo();
|
const UWU: () = foo();
|
||||||
|
|
|
@ -16,6 +16,15 @@ LL | fn foo(self);
|
||||||
LL | fn foo<T>(self) {
|
LL | fn foo<T>(self) {
|
||||||
| ^ found 1 type parameter
|
| ^ found 1 type parameter
|
||||||
|
|
||||||
error: aborting due to 1 previous error; 1 warning emitted
|
error[E0015]: cannot call non-const fn `<() as Trait>::foo` in constant functions
|
||||||
|
--> $DIR/inline-incorrect-early-bound-in-ctfe.rs:27:8
|
||||||
|
|
|
||||||
|
LL | ().foo();
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0049`.
|
error: aborting due to 2 previous errors; 1 warning emitted
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0015, E0049.
|
||||||
|
For more information about an error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -6,10 +6,6 @@ LL | n => n(),
|
||||||
|
|
|
|
||||||
= note: closures need an RFC before allowed to be called in constants
|
= note: closures need an RFC before allowed to be called in constants
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -5,10 +5,6 @@ LL | T::assoc()
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -6,10 +6,6 @@ LL | "a" => (), //FIXME [gated]~ ERROR can't compare `str` with `str` in
|
||||||
|
|
|
|
||||||
= note: `str` cannot be compared in compile-time, and therefore cannot be used in `match`es
|
= note: `str` cannot be compared in compile-time, and therefore cannot be used in `match`es
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -6,10 +6,6 @@ LL | "a" => (), //FIXME [gated]~ ERROR can't compare `str` with `str` in
|
||||||
|
|
|
|
||||||
= note: `str` cannot be compared in compile-time, and therefore cannot be used in `match`es
|
= note: `str` cannot be compared in compile-time, and therefore cannot be used in `match`es
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -5,10 +5,6 @@ LL | (const || { (()).foo() })();
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,6 @@ LL | B::from(self)
|
||||||
| ^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
|
@ -11,10 +11,6 @@ LL | Default::default()
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(effects)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(effects)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -5,10 +5,6 @@ LL | Default::default()
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -32,5 +32,14 @@ LL | trait Bar: ~const Foo {}
|
||||||
|
|
|
|
||||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
error[E0015]: cannot call non-const fn `<T as Foo>::a` in constant functions
|
||||||
|
--> $DIR/super-traits-fail-2.rs:21:7
|
||||||
|
|
|
||||||
|
LL | x.a();
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -36,5 +36,14 @@ LL | trait Bar: ~const Foo {}
|
||||||
|
|
|
|
||||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error[E0015]: cannot call non-const fn `<T as Foo>::a` in constant functions
|
||||||
|
--> $DIR/super-traits-fail-2.rs:21:7
|
||||||
|
|
|
||||||
|
LL | x.a();
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error: aborting due to 6 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -20,6 +20,7 @@ trait Bar: ~const Foo {}
|
||||||
const fn foo<T: Bar>(x: &T) {
|
const fn foo<T: Bar>(x: &T) {
|
||||||
x.a();
|
x.a();
|
||||||
//[yy,yn]~^ ERROR the trait bound `T: ~const Foo`
|
//[yy,yn]~^ ERROR the trait bound `T: ~const Foo`
|
||||||
|
//[nn,ny]~^^ ERROR cannot call non-const fn `<T as Foo>::a` in constant functions
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -46,5 +46,14 @@ LL | const fn foo<T: ~const Bar>(x: &T) {
|
||||||
|
|
|
|
||||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
error[E0015]: cannot call non-const fn `<T as Foo>::a` in constant functions
|
||||||
|
--> $DIR/super-traits-fail-3.rs:25:7
|
||||||
|
|
|
||||||
|
LL | x.a();
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -36,5 +36,14 @@ LL | trait Bar: ~const Foo {}
|
||||||
|
|
|
|
||||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error[E0015]: cannot call non-const fn `<T as Foo>::a` in constant functions
|
||||||
|
--> $DIR/super-traits-fail-3.rs:25:7
|
||||||
|
|
|
||||||
|
LL | x.a();
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error: aborting due to 6 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -24,6 +24,7 @@ const fn foo<T: ~const Bar>(x: &T) {
|
||||||
//[yn,nn]~| ERROR: `~const` can only be applied to `#[const_trait]`
|
//[yn,nn]~| ERROR: `~const` can only be applied to `#[const_trait]`
|
||||||
x.a();
|
x.a();
|
||||||
//[yn]~^ ERROR: the trait bound `T: ~const Foo` is not satisfied
|
//[yn]~^ ERROR: the trait bound `T: ~const Foo` is not satisfied
|
||||||
|
//[nn,ny]~^^ ERROR: cannot call non-const fn `<T as Foo>::a` in constant functions
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -16,5 +16,22 @@ LL | impl const FromResidual for T {
|
||||||
= note: marking a trait with `#[const_trait]` ensures all default method bodies are `const`
|
= note: marking a trait with `#[const_trait]` ensures all default method bodies are `const`
|
||||||
= note: adding a non-const method body in the future would be a breaking change
|
= note: adding a non-const method body in the future would be a breaking change
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error[E0015]: `?` cannot determine the branch of `T` in constant functions
|
||||||
|
--> $DIR/trait-default-body-stability.rs:45:9
|
||||||
|
|
|
||||||
|
LL | T?
|
||||||
|
| ^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error[E0015]: `?` cannot convert from residual of `T` in constant functions
|
||||||
|
--> $DIR/trait-default-body-stability.rs:45:9
|
||||||
|
|
|
||||||
|
LL | T?
|
||||||
|
| ^^
|
||||||
|
|
|
||||||
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0015`.
|
||||||
|
|
|
@ -675,10 +675,6 @@ LL | const _: _ = (1..10).filter(|x| x % 2 == 0).map(|x| x * x);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0015]: cannot call non-const fn `<Filter<std::ops::Range<i32>, {closure@$DIR/typeck_type_placeholder_item.rs:230:29: 230:32}> as Iterator>::map::<i32, {closure@$DIR/typeck_type_placeholder_item.rs:230:49: 230:52}>` in constants
|
error[E0015]: cannot call non-const fn `<Filter<std::ops::Range<i32>, {closure@$DIR/typeck_type_placeholder_item.rs:230:29: 230:32}> as Iterator>::map::<i32, {closure@$DIR/typeck_type_placeholder_item.rs:230:49: 230:52}>` in constants
|
||||||
--> $DIR/typeck_type_placeholder_item.rs:230:45
|
--> $DIR/typeck_type_placeholder_item.rs:230:45
|
||||||
|
@ -687,10 +683,6 @@ LL | const _: _ = (1..10).filter(|x| x % 2 == 0).map(|x| x * x);
|
||||||
| ^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|
||||||
|
|
|
||||||
LL + #![feature(const_trait_impl)]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 74 previous errors
|
error: aborting due to 74 previous errors
|
||||||
|
|
||||||
|
|
11
tests/ui/unpretty/unsafe-attr.rs
Normal file
11
tests/ui/unpretty/unsafe-attr.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
//@ compile-flags: -Zunpretty=normal
|
||||||
|
//@ check-pass
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
extern "C" fn foo() {}
|
||||||
|
|
||||||
|
#[unsafe(no_mangle)]
|
||||||
|
extern "C" fn bar() {}
|
||||||
|
|
||||||
|
#[cfg_attr(FALSE, unsafe(no_mangle))]
|
||||||
|
extern "C" fn zoo() {}
|
11
tests/ui/unpretty/unsafe-attr.stdout
Normal file
11
tests/ui/unpretty/unsafe-attr.stdout
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
//@ compile-flags: -Zunpretty=normal
|
||||||
|
//@ check-pass
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
extern "C" fn foo() {}
|
||||||
|
|
||||||
|
#[unsafe(no_mangle)]
|
||||||
|
extern "C" fn bar() {}
|
||||||
|
|
||||||
|
#[cfg_attr(FALSE, unsafe(no_mangle))]
|
||||||
|
extern "C" fn zoo() {}
|
Loading…
Add table
Add a link
Reference in a new issue