]> git.lizzy.rs Git - rust.git/commitdiff
Report const eval error inside the query
authorOliver Schneider <github35764891676564198441@oli-obk.de>
Sun, 26 Aug 2018 13:19:34 +0000 (15:19 +0200)
committerOliver Scherer <github35764891676564198441@oli-obk.de>
Thu, 25 Oct 2018 14:46:19 +0000 (16:46 +0200)
135 files changed:
src/librustc/dep_graph/dep_node.rs
src/librustc/hir/def.rs
src/librustc/hir/map/mod.rs
src/librustc/ich/impls_hir.rs
src/librustc/ich/impls_ty.rs
src/librustc/mir/interpret/error.rs
src/librustc/mir/interpret/mod.rs
src/librustc/traits/error_reporting.rs
src/librustc/traits/fulfill.rs
src/librustc/traits/mod.rs
src/librustc/traits/structural_impls.rs
src/librustc/ty/mod.rs
src/librustc/ty/query/config.rs
src/librustc/ty/query/mod.rs
src/librustc/ty/query/plumbing.rs
src/librustc/ty/structural_impls.rs
src/librustc_codegen_llvm/mir/constant.rs
src/librustc_codegen_llvm/mir/operand.rs
src/librustc_lint/builtin.rs
src/librustc_lint/lib.rs
src/librustc_mir/const_eval.rs
src/librustc_mir/hair/cx/expr.rs
src/librustc_mir/hair/pattern/mod.rs
src/librustc_mir/interpret/eval_context.rs
src/librustc_mir/interpret/memory.rs
src/librustc_mir/lib.rs
src/librustc_mir/monomorphize/collector.rs
src/librustc_mir/transform/const_prop.rs
src/librustc_save_analysis/lib.rs
src/librustc_typeck/check/mod.rs
src/test/compile-fail/const-fn-error.rs
src/test/compile-fail/issue-52443.rs
src/test/ui/array_const_index-0.rs
src/test/ui/array_const_index-0.stderr
src/test/ui/array_const_index-1.rs
src/test/ui/array_const_index-1.stderr
src/test/ui/consts/const-array-oob.rs
src/test/ui/consts/const-array-oob.stderr
src/test/ui/consts/const-call.stderr
src/test/ui/consts/const-err-early.rs
src/test/ui/consts/const-err-early.stderr
src/test/ui/consts/const-err-multi.rs
src/test/ui/consts/const-err-multi.stderr
src/test/ui/consts/const-err.rs
src/test/ui/consts/const-err.stderr
src/test/ui/consts/const-err4.rs
src/test/ui/consts/const-err4.stderr
src/test/ui/consts/const-eval/conditional_array_execution.nll.stderr [new file with mode: 0644]
src/test/ui/consts/const-eval/conditional_array_execution.rs
src/test/ui/consts/const-eval/conditional_array_execution.stderr
src/test/ui/consts/const-eval/const-eval-overflow-2.stderr
src/test/ui/consts/const-eval/const-eval-overflow-3.stderr
src/test/ui/consts/const-eval/const-eval-overflow-4.rs
src/test/ui/consts/const-eval/const-eval-overflow-4.stderr
src/test/ui/consts/const-eval/const-eval-overflow2.rs
src/test/ui/consts/const-eval/const-eval-overflow2.stderr
src/test/ui/consts/const-eval/const-eval-overflow2b.rs
src/test/ui/consts/const-eval/const-eval-overflow2b.stderr
src/test/ui/consts/const-eval/const-eval-overflow2c.rs
src/test/ui/consts/const-eval/const-eval-overflow2c.stderr
src/test/ui/consts/const-eval/const-pointer-values-in-various-types.rs
src/test/ui/consts/const-eval/const_panic.rs
src/test/ui/consts/const-eval/const_panic.stderr
src/test/ui/consts/const-eval/const_panic_libcore.rs
src/test/ui/consts/const-eval/const_panic_libcore.stderr
src/test/ui/consts/const-eval/const_panic_libcore_main.rs
src/test/ui/consts/const-eval/const_panic_libcore_main.stderr
src/test/ui/consts/const-eval/const_raw_ptr_ops.rs
src/test/ui/consts/const-eval/const_raw_ptr_ops.stderr
src/test/ui/consts/const-eval/double_check2.stderr
src/test/ui/consts/const-eval/infinite_loop.rs
src/test/ui/consts/const-eval/infinite_loop.stderr
src/test/ui/consts/const-eval/issue-43197.nll.stderr [new file with mode: 0644]
src/test/ui/consts/const-eval/issue-43197.rs
src/test/ui/consts/const-eval/issue-43197.stderr
src/test/ui/consts/const-eval/issue-44578.nll.stderr [new file with mode: 0644]
src/test/ui/consts/const-eval/issue-44578.rs
src/test/ui/consts/const-eval/issue-44578.stderr
src/test/ui/consts/const-eval/issue-50814-2.rs
src/test/ui/consts/const-eval/issue-50814-2.stderr
src/test/ui/consts/const-eval/issue-50814.rs
src/test/ui/consts/const-eval/issue-50814.stderr
src/test/ui/consts/const-eval/issue-52443.stderr [new file with mode: 0644]
src/test/ui/consts/const-eval/match-test-ptr-null.rs
src/test/ui/consts/const-eval/match-test-ptr-null.stderr
src/test/ui/consts/const-eval/promoted_const_fn_fail.rs
src/test/ui/consts/const-eval/promoted_const_fn_fail_deny_const_err.rs [new file with mode: 0644]
src/test/ui/consts/const-eval/promoted_const_fn_fail_deny_const_err.stderr [new file with mode: 0644]
src/test/ui/consts/const-eval/promoted_errors.stderr
src/test/ui/consts/const-eval/pub_const_err.rs
src/test/ui/consts/const-eval/pub_const_err.stderr
src/test/ui/consts/const-eval/pub_const_err_bin.rs
src/test/ui/consts/const-eval/pub_const_err_bin.stderr
src/test/ui/consts/const-eval/shift_overflow.stderr
src/test/ui/consts/const-eval/ub-enum.rs
src/test/ui/consts/const-eval/ub-enum.stderr
src/test/ui/consts/const-eval/union-const-eval-field.rs
src/test/ui/consts/const-eval/union-const-eval-field.stderr
src/test/ui/consts/const-eval/union-ice.rs
src/test/ui/consts/const-eval/union-ice.stderr
src/test/ui/consts/const-eval/union-ub-fat-ptr.rs
src/test/ui/consts/const-eval/union-ub-fat-ptr.stderr
src/test/ui/consts/const-eval/union-ub.rs
src/test/ui/consts/const-eval/union-ub.stderr
src/test/ui/consts/const-fn-error.stderr [new file with mode: 0644]
src/test/ui/consts/const-integer-bool-ops.rs
src/test/ui/consts/const-integer-bool-ops.stderr
src/test/ui/consts/const-len-underflow-separate-spans.rs
src/test/ui/consts/const-len-underflow-separate-spans.stderr
src/test/ui/consts/const-len-underflow-subspans.rs
src/test/ui/consts/const-len-underflow-subspans.stderr
src/test/ui/consts/const-size_of-cycle.stderr
src/test/ui/consts/const-slice-oob.rs
src/test/ui/consts/const-slice-oob.stderr
src/test/ui/consts/const-tup-index-span.rs
src/test/ui/consts/const-tup-index-span.stderr
src/test/ui/error-codes/E0080.rs
src/test/ui/error-codes/E0080.stderr
src/test/ui/error-codes/E0396-fixed.rs
src/test/ui/error-codes/E0396-fixed.stderr
src/test/ui/eval-enum.rs
src/test/ui/eval-enum.stderr
src/test/ui/infinite/infinite-recursion-const-fn.rs
src/test/ui/infinite/infinite-recursion-const-fn.stderr
src/test/ui/issues/issue-39559-2.stderr
src/test/ui/issues/issue-41394.rs
src/test/ui/issues/issue-41394.stderr
src/test/ui/issues/issue-43105.rs
src/test/ui/issues/issue-43105.stderr
src/test/ui/issues/issue-44415.stderr
src/test/ui/issues/issue-50599.rs
src/test/ui/issues/issue-50599.stderr
src/test/ui/recursion/recursive-static-definition.stderr
src/test/ui/type/type-dependent-def-issue-49241.rs
src/test/ui/type/type-dependent-def-issue-49241.stderr

index 4d6d3bd56f2d803292145685b45275f90c4cad0d..61996b5a8a75c46d7983472214bb4277ce5a4b36 100644 (file)
@@ -530,6 +530,7 @@ pub fn fingerprint_needed_for_crate_hash(self) -> bool {
     [] UsedTraitImports(DefId),
     [] HasTypeckTables(DefId),
     [] ConstEval { param_env: ParamEnvAnd<'tcx, GlobalId<'tcx>> },
+    [] ConstEvalRaw { param_env: ParamEnvAnd<'tcx, GlobalId<'tcx>> },
     [] CheckMatch(DefId),
     [] SymbolName(DefId),
     [] InstanceSymbolName { instance: Instance<'tcx> },
index 5d9d4deb0abc9e95793aa303ce1a621980cc0b1c..72a45ebd8e4c0e9d72a73b27caa3f4c81d8bcd0d 100644 (file)
@@ -74,6 +74,7 @@ pub enum Def {
     SelfCtor(DefId /* impl */),  // DefId refers to the impl
     Method(DefId),
     AssociatedConst(DefId),
+    Closure(hir::BodyId),
 
     Local(ast::NodeId),
     Upvar(ast::NodeId,  // node id of closed over local
@@ -281,6 +282,7 @@ pub fn def_id(&self) -> DefId {
                 id
             }
 
+            Def::Closure(_) |
             Def::Local(..) |
             Def::Upvar(..) |
             Def::Label(..)  |
@@ -319,6 +321,7 @@ pub fn kind_name(&self) -> &'static str {
             Def::Trait(..) => "trait",
             Def::ForeignTy(..) => "foreign type",
             Def::Method(..) => "method",
+            Def::Closure(_) => "closure",
             Def::Const(..) => "constant",
             Def::AssociatedConst(..) => "associated constant",
             Def::TyParam(..) => "type parameter",
index f5f9bcd3b5ea5125d32e70cd09a2028e57dd2266..d36268cfe3a4f89ea52a7058909f758d251646cc 100644 (file)
@@ -340,9 +340,14 @@ pub fn describe_def(&self, node_id: NodeId) -> Option<Def> {
                 let def_id = self.local_def_id(variant.node.data.id());
                 Some(Def::Variant(def_id))
             }
+            Node::Expr(expr) => {
+                match expr.node {
+                    ExprKind::Closure(_, _, body_id, _, _) => Some(Def::Closure(body_id)),
+                    _ => None,
+                }
+            }
             Node::Field(_) |
             Node::AnonConst(_) |
-            Node::Expr(_) |
             Node::Stmt(_) |
             Node::Ty(_) |
             Node::TraitRef(_) |
index a48bd4eeb09a32eb5b6726280581e087bf992898..4b64591029c3f930d780a95be2321f534d00d80f 100644 (file)
@@ -1044,6 +1044,7 @@ fn to_stable_hash_key(&self,
     SelfCtor(impl_def_id),
     VariantCtor(def_id, ctor_kind),
     Method(def_id),
+    Closure(body_id),
     AssociatedConst(def_id),
     Local(def_id),
     Upvar(def_id, index, expr_id),
index 642eb11006649f5e0b3e3cb63bbff5c60d6f9ac3..7e5d19850f48dd325a56e9a5b8df3a2cb35acdbb 100644 (file)
@@ -483,10 +483,9 @@ fn hash_stable<W: StableHasherResult>(
     val
 });
 
-impl_stable_hash_for!(struct ::mir::interpret::ConstEvalErr<'tcx> {
-    span,
-    stacktrace,
-    error
+impl_stable_hash_for!(enum mir::interpret::ErrorHandled {
+    Reported,
+    TooGeneric
 });
 
 impl_stable_hash_for!(struct ::mir::interpret::FrameInfo {
@@ -503,8 +502,6 @@ fn hash_stable<W: StableHasherResult>(
     predicates
 });
 
-impl_stable_hash_for!(struct ::mir::interpret::EvalError<'tcx> { kind });
-
 impl<'a, 'gcx, O: HashStable<StableHashingContext<'a>>> HashStable<StableHashingContext<'a>>
 for ::mir::interpret::EvalErrorKind<'gcx, O> {
     fn hash_stable<W: StableHasherResult>(&self,
@@ -543,7 +540,6 @@ fn hash_stable<W: StableHasherResult>(&self,
             UnimplementedTraitSelection |
             TypeckError |
             TooGeneric |
-            CheckMatchError |
             DerefFunctionPointer |
             ExecuteMemory |
             OverflowNeg |
@@ -551,6 +547,7 @@ fn hash_stable<W: StableHasherResult>(&self,
             DivisionByZero |
             GeneratorResumedAfterReturn |
             GeneratorResumedAfterPanic |
+            ReferencedConstant |
             InfiniteLoop => {}
             ReadUndefBytes(offset) => offset.hash_stable(hcx, hasher),
             InvalidDiscriminant(val) => val.hash_stable(hcx, hasher),
@@ -560,7 +557,6 @@ fn hash_stable<W: StableHasherResult>(&self,
                 line.hash_stable(hcx, hasher);
                 col.hash_stable(hcx, hasher);
             },
-            ReferencedConstant(ref err) => err.hash_stable(hcx, hasher),
             MachineError(ref err) => err.hash_stable(hcx, hasher),
             FunctionAbiMismatch(a, b) => {
                 a.hash_stable(hcx, hasher);
index fe466e247c91749b8f5a2f6dc1b5be7ead80b362..f7f4c50b96d40bf6acc9d75c777c11a5297e36a9 100644 (file)
@@ -13,7 +13,6 @@
 use mir;
 use ty::{Ty, layout};
 use ty::layout::{Size, Align};
-use rustc_data_structures::sync::Lrc;
 use rustc_target::spec::abi::Abi;
 
 use super::{
 use syntax::ast;
 use syntax::symbol::Symbol;
 
-pub type ConstEvalResult<'tcx> = Result<&'tcx ty::Const<'tcx>, Lrc<ConstEvalErr<'tcx>>>;
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub enum ErrorHandled {
+    /// Already reported a lint or an error for this evaluation
+    Reported,
+    /// Don't emit an error, the evaluation failed because the MIR was generic
+    /// and the substs didn't fully monomorphize it.
+    TooGeneric,
+}
+
+impl ErrorHandled {
+    pub fn assert_reported(self) {
+        match self {
+            ErrorHandled::Reported => {},
+            ErrorHandled::TooGeneric => bug!("MIR interpretation failed without reporting an error \
+                                              even though it was fully monomorphized"),
+        }
+    }
+}
+
+pub type ConstEvalResult<'tcx> = Result<&'tcx ty::Const<'tcx>, ErrorHandled>;
 
 #[derive(Clone, Debug, RustcEncodable, RustcDecodable)]
 pub struct ConstEvalErr<'tcx> {
@@ -50,7 +68,7 @@ impl<'a, 'gcx, 'tcx> ConstEvalErr<'tcx> {
     pub fn struct_error(&self,
         tcx: TyCtxtAt<'a, 'gcx, 'tcx>,
         message: &str)
-        -> Option<DiagnosticBuilder<'tcx>>
+        -> Result<DiagnosticBuilder<'tcx>, ErrorHandled>
     {
         self.struct_generic(tcx, message, None)
     }
@@ -58,10 +76,14 @@ pub fn struct_error(&self,
     pub fn report_as_error(&self,
         tcx: TyCtxtAt<'a, 'gcx, 'tcx>,
         message: &str
-    ) {
+    ) -> ErrorHandled {
         let err = self.struct_error(tcx, message);
-        if let Some(mut err) = err {
-            err.emit();
+        match err {
+            Ok(mut err) => {
+                err.emit();
+                ErrorHandled::Reported
+            },
+            Err(err) => err,
         }
     }
 
@@ -69,14 +91,18 @@ pub fn report_as_lint(&self,
         tcx: TyCtxtAt<'a, 'gcx, 'tcx>,
         message: &str,
         lint_root: ast::NodeId,
-    ) {
+    ) -> ErrorHandled {
         let lint = self.struct_generic(
             tcx,
             message,
             Some(lint_root),
         );
-        if let Some(mut lint) = lint {
-            lint.emit();
+        match lint {
+            Ok(mut lint) => {
+                lint.emit();
+                ErrorHandled::Reported
+            },
+            Err(err) => err,
         }
     }
 
@@ -85,15 +111,11 @@ fn struct_generic(
         tcx: TyCtxtAt<'a, 'gcx, 'tcx>,
         message: &str,
         lint_root: Option<ast::NodeId>,
-    ) -> Option<DiagnosticBuilder<'tcx>> {
+    ) -> Result<DiagnosticBuilder<'tcx>, ErrorHandled> {
         match self.error.kind {
-            ::mir::interpret::EvalErrorKind::TypeckError |
-            ::mir::interpret::EvalErrorKind::TooGeneric |
-            ::mir::interpret::EvalErrorKind::CheckMatchError |
-            ::mir::interpret::EvalErrorKind::Layout(_) => return None,
-            ::mir::interpret::EvalErrorKind::ReferencedConstant(ref inner) => {
-                inner.struct_generic(tcx, "referenced constant has errors", lint_root)?.emit();
-            },
+            EvalErrorKind::TooGeneric => return Err(ErrorHandled::TooGeneric),
+            EvalErrorKind::TypeckError |
+            EvalErrorKind::Layout(_) => return Err(ErrorHandled::Reported),
             _ => {},
         }
         trace!("reporting const eval failure at {:?}", self.span);
@@ -117,7 +139,7 @@ fn struct_generic(
         for FrameInfo { span, location, .. } in &self.stacktrace {
             err.span_label(*span, format!("inside call to `{}`", location));
         }
-        Some(err)
+        Ok(err)
     }
 }
 
@@ -279,10 +301,9 @@ pub enum EvalErrorKind<'tcx, O> {
     TypeckError,
     /// Resolution can fail if we are in a too generic context
     TooGeneric,
-    CheckMatchError,
     /// Cannot compute this constant because it depends on another one
     /// which already produced an error
-    ReferencedConstant(Lrc<ConstEvalErr<'tcx>>),
+    ReferencedConstant,
     GeneratorResumedAfterReturn,
     GeneratorResumedAfterPanic,
     InfiniteLoop,
@@ -407,9 +428,7 @@ pub fn description(&self) -> &str {
                 "encountered constants with type errors, stopping evaluation",
             TooGeneric =>
                 "encountered overly generic constant",
-            CheckMatchError =>
-                "match checking failed",
-            ReferencedConstant(_) =>
+            ReferencedConstant =>
                 "referenced constant has errors",
             Overflow(mir::BinOp::Add) => "attempt to add with overflow",
             Overflow(mir::BinOp::Sub) => "attempt to subtract with overflow",
index 4c2b2b2d41d1ba6f36f391c9497316fc76c7a14a..40a4b8b375a2027af768ba6d95ca6c9062802676 100644 (file)
@@ -20,7 +20,7 @@ macro_rules! err {
 
 pub use self::error::{
     EvalError, EvalResult, EvalErrorKind, AssertMessage, ConstEvalErr, struct_error,
-    FrameInfo, ConstEvalResult,
+    FrameInfo, ConstEvalResult, ErrorHandled,
 };
 
 pub use self::value::{Scalar, ConstValue};
index dc0039926448c48e6dac87d11bef4ad6a5d93c3b..a7513b325fe6dd8f0821c59876aed373f1420a3b 100644 (file)
@@ -880,18 +880,10 @@ pub fn report_selection_error(&self,
                 self.tcx.report_object_safety_error(span, did, violations)
             }
 
-            ConstEvalFailure(ref err) => {
-                match err.struct_error(
-                    self.tcx.at(span),
-                    "could not evaluate constant expression",
-                ) {
-                    Some(err) => err,
-                    None => {
-                        self.tcx.sess.delay_span_bug(span,
-                            &format!("constant in type had an ignored error: {:?}", err));
-                        return;
-                    }
-                }
+            // already reported in the query
+            ConstEvalFailure => {
+                self.tcx.sess.delay_span_bug(span, "constant in type had an ignored error");
+                return;
             }
 
             Overflow => {
index e6bf02cd73e0da09757bd7aea4c33c934ed7c14e..320902263af61a5ec32cc6c322f9d12aed49acc4 100644 (file)
@@ -16,8 +16,6 @@
 use rustc_data_structures::obligation_forest::{ObligationProcessor, ProcessResult};
 use std::marker::PhantomData;
 use hir::def_id::DefId;
-use mir::interpret::ConstEvalErr;
-use mir::interpret::EvalErrorKind;
 
 use super::CodeAmbiguity;
 use super::CodeProjectionError;
@@ -491,17 +489,11 @@ fn process_obligation(&mut self,
                                     match self.selcx.tcx().at(obligation.cause.span)
                                                           .const_eval(param_env.and(cid)) {
                                         Ok(_) => ProcessResult::Changed(vec![]),
-                                        Err(err) => ProcessResult::Error(
-                                            CodeSelectionError(ConstEvalFailure(err)))
+                                        Err(_) => ProcessResult::Error(
+                                            CodeSelectionError(ConstEvalFailure))
                                     }
                                 } else {
-                                    ProcessResult::Error(
-                                        CodeSelectionError(ConstEvalFailure(ConstEvalErr {
-                                            span: obligation.cause.span,
-                                            error: EvalErrorKind::TooGeneric.into(),
-                                            stacktrace: vec![],
-                                        }.into()))
-                                    )
+                                    ProcessResult::Error(CodeSelectionError(ConstEvalFailure))
                                 }
                             },
                             None => {
index 8bceebb23950c425797d347ca8607304417a74a7..c809c94f4449de949cb2992d57e5c8f867242685 100644 (file)
@@ -23,7 +23,6 @@
 use infer::SuppressRegionErrors;
 use infer::outlives::env::OutlivesEnvironment;
 use middle::region;
-use mir::interpret::ConstEvalErr;
 use ty::subst::Substs;
 use ty::{self, AdtKind, List, Ty, TyCtxt, GenericParamDefKind, ToPredicate};
 use ty::error::{ExpectedFound, TypeError};
@@ -438,7 +437,7 @@ pub enum SelectionError<'tcx> {
                                 ty::PolyTraitRef<'tcx>,
                                 ty::error::TypeError<'tcx>),
     TraitNotObjectSafe(DefId),
-    ConstEvalFailure(Lrc<ConstEvalErr<'tcx>>),
+    ConstEvalFailure,
     Overflow,
 }
 
index c50c9703eb5574e0280e5560e8aa1d6e92fb6a29..e7cb9ff06234f1fb0ee3e5a2059325ad760b0b11 100644 (file)
@@ -172,9 +172,7 @@ fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lif
                 )
             }
             super::TraitNotObjectSafe(def_id) => Some(super::TraitNotObjectSafe(def_id)),
-            super::ConstEvalFailure(ref err) => tcx.lift(&**err).map(|err| super::ConstEvalFailure(
-                err.into(),
-            )),
+            super::ConstEvalFailure(ref err) => Some(super::ConstEvalFailure),
             super::Overflow => Some(super::Overflow),
         }
     }
index 5a2f062f233cf17c67e9d5e565dcb773cb46d6c9..6a6d111fb3bff130cdce3efe9c31d4efe9da2cb9 100644 (file)
@@ -27,7 +27,7 @@
 use middle::privacy::AccessLevels;
 use middle::resolve_lifetime::ObjectLifetimeDefault;
 use mir::Mir;
-use mir::interpret::GlobalId;
+use mir::interpret::{GlobalId, ErrorHandled};
 use mir::GeneratorLayout;
 use session::CrateDisambiguator;
 use traits::{self, Reveal};
@@ -2191,11 +2191,7 @@ pub fn eval_explicit_discr(
                     None
                 }
             }
-            Err(err) => {
-                err.report_as_error(
-                    tcx.at(tcx.def_span(expr_did)),
-                    "could not evaluate enum discriminant",
-                );
+            Err(ErrorHandled::Reported) => {
                 if !expr_did.is_local() {
                     span_bug!(tcx.def_span(expr_did),
                         "variant discriminant evaluation succeeded \
@@ -2203,6 +2199,10 @@ pub fn eval_explicit_discr(
                 }
                 None
             }
+            Err(ErrorHandled::TooGeneric) => span_bug!(
+                tcx.def_span(expr_did),
+                "enum discriminant depends on generic arguments",
+            ),
         }
     }
 
index 0f6ff93c52336c859b3f240391b8c001c9b755a1..bb33def51cc3bd6fcbd6917066e49c2c2b729911 100644 (file)
@@ -296,6 +296,30 @@ fn describe(_: TyCtxt<'_, '_, '_>, _: CrateNum) -> Cow<'static, str> {
 }
 
 impl<'tcx> QueryDescription<'tcx> for queries::const_eval<'tcx> {
+    fn describe(
+        tcx: TyCtxt<'_, '_, '_>,
+        key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>,
+    ) -> Cow<'static, str> {
+        format!(
+            "const-evaluating + checking `{}`",
+            tcx.item_path_str(key.value.instance.def.def_id()),
+        ).into()
+    }
+
+    #[inline]
+    fn cache_on_disk(_key: Self::Key) -> bool {
+        true
+    }
+
+    #[inline]
+    fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
+                              id: SerializedDepNodeIndex)
+                              -> Option<Self::Value> {
+        tcx.queries.on_disk_cache.try_load_query_result(tcx, id).map(Ok)
+    }
+}
+
+impl<'tcx> QueryDescription<'tcx> for queries::const_eval_raw<'tcx> {
     fn describe(tcx: TyCtxt<'_, '_, '_>, key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>)
         -> Cow<'static, str>
     {
index a59a15da08d999842e28adb54f3711e764431bed..ed7b2cffc46f6b689f22c9954eb0314ea1c08e06 100644 (file)
     },
 
     Other {
+        /// Evaluate a constant without running sanity checks
+        ///
+        /// DO NOT USE THIS outside const eval. Const eval uses this to break query cycles during
+        /// validation. Please add a comment to every use site explaining why using `const_eval`
+        /// isn't sufficient
+        [] fn const_eval_raw: const_eval_raw_dep_node(ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>)
+            -> ConstEvalResult<'tcx>,
+
         /// Results of evaluating const items or constants embedded in
         /// other items (such as enum variant explicit discriminants).
         [] fn const_eval: const_eval_dep_node(ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>)
@@ -776,6 +784,10 @@ fn const_eval_dep_node<'tcx>(param_env: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>)
                              -> DepConstructor<'tcx> {
     DepConstructor::ConstEval { param_env }
 }
+fn const_eval_raw_dep_node<'tcx>(param_env: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>)
+                             -> DepConstructor<'tcx> {
+    DepConstructor::ConstEvalRaw { param_env }
+}
 
 fn mir_keys<'tcx>(_: CrateNum) -> DepConstructor<'tcx> {
     DepConstructor::MirKeys
index 789658dcf72dc25b45452464643ddd8393ebf66e..8bbfd92d688edd5581d6e2dfc3a0720c63de0259 100644 (file)
@@ -1063,6 +1063,7 @@ macro_rules! force {
         DepKind::NeedsDrop |
         DepKind::Layout |
         DepKind::ConstEval |
+        DepKind::ConstEvalRaw |
         DepKind::InstanceSymbolName |
         DepKind::MirShim |
         DepKind::BorrowCheckKrate |
index 273799bd4bd34b9d71b0d9c5c2b01e76d680158e..a93dca4af426ba812b9564b5566972ca5c060a62 100644 (file)
@@ -13,7 +13,7 @@
 //! hand, though we've recently added some macros (e.g.,
 //! `BraceStructLiftImpl!`) to help with the tedium.
 
-use mir::interpret::{ConstValue, ConstEvalErr};
+use mir::interpret::ConstValue;
 use ty::{self, Lift, Ty, TyCtxt};
 use ty::fold::{TypeFoldable, TypeFolder, TypeVisitor};
 use rustc_data_structures::indexed_vec::{IndexVec, Idx};
@@ -460,164 +460,6 @@ fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lif
     }
 }
 
-impl<'a, 'tcx> Lift<'tcx> for ConstEvalErr<'a> {
-    type Lifted = ConstEvalErr<'tcx>;
-    fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
-        tcx.lift(&self.error).map(|error| {
-            ConstEvalErr {
-                span: self.span,
-                stacktrace: self.stacktrace.clone(),
-                error,
-            }
-        })
-    }
-}
-
-impl<'a, 'tcx> Lift<'tcx> for interpret::EvalError<'a> {
-    type Lifted = interpret::EvalError<'tcx>;
-    fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
-        Some(interpret::EvalError {
-            kind: tcx.lift(&self.kind)?,
-        })
-    }
-}
-
-impl<'a, 'tcx, O: Lift<'tcx>> Lift<'tcx> for interpret::EvalErrorKind<'a, O> {
-    type Lifted = interpret::EvalErrorKind<'tcx, <O as Lift<'tcx>>::Lifted>;
-    fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
-        use ::mir::interpret::EvalErrorKind::*;
-        Some(match *self {
-            MachineError(ref err) => MachineError(err.clone()),
-            FunctionAbiMismatch(a, b) => FunctionAbiMismatch(a, b),
-            FunctionArgMismatch(a, b) => FunctionArgMismatch(
-                tcx.lift(&a)?,
-                tcx.lift(&b)?,
-            ),
-            FunctionRetMismatch(a, b) => FunctionRetMismatch(
-                tcx.lift(&a)?,
-                tcx.lift(&b)?,
-            ),
-            FunctionArgCountMismatch => FunctionArgCountMismatch,
-            NoMirFor(ref s) => NoMirFor(s.clone()),
-            UnterminatedCString(ptr) => UnterminatedCString(ptr),
-            DanglingPointerDeref => DanglingPointerDeref,
-            DoubleFree => DoubleFree,
-            InvalidMemoryAccess => InvalidMemoryAccess,
-            InvalidFunctionPointer => InvalidFunctionPointer,
-            InvalidBool => InvalidBool,
-            InvalidDiscriminant(val) => InvalidDiscriminant(val),
-            PointerOutOfBounds {
-                ptr,
-                access,
-                allocation_size,
-            } => PointerOutOfBounds { ptr, access, allocation_size },
-            InvalidNullPointerUsage => InvalidNullPointerUsage,
-            ReadPointerAsBytes => ReadPointerAsBytes,
-            ReadBytesAsPointer => ReadBytesAsPointer,
-            ReadForeignStatic => ReadForeignStatic,
-            InvalidPointerMath => InvalidPointerMath,
-            ReadUndefBytes(offset) => ReadUndefBytes(offset),
-            DeadLocal => DeadLocal,
-            InvalidBoolOp(bop) => InvalidBoolOp(bop),
-            Unimplemented(ref s) => Unimplemented(s.clone()),
-            DerefFunctionPointer => DerefFunctionPointer,
-            ExecuteMemory => ExecuteMemory,
-            BoundsCheck { ref len, ref index } => BoundsCheck {
-                len: tcx.lift(len)?,
-                index: tcx.lift(index)?,
-            },
-            Intrinsic(ref s) => Intrinsic(s.clone()),
-            InvalidChar(c) => InvalidChar(c),
-            StackFrameLimitReached => StackFrameLimitReached,
-            OutOfTls => OutOfTls,
-            TlsOutOfBounds => TlsOutOfBounds,
-            AbiViolation(ref s) => AbiViolation(s.clone()),
-            AlignmentCheckFailed {
-                required,
-                has,
-            } => AlignmentCheckFailed { required, has },
-            MemoryLockViolation {
-                ptr,
-                len,
-                frame,
-                access,
-                ref lock,
-            } => MemoryLockViolation { ptr, len, frame, access, lock: lock.clone() },
-            MemoryAcquireConflict {
-                ptr,
-                len,
-                kind,
-                ref lock,
-            } => MemoryAcquireConflict { ptr, len, kind, lock: lock.clone() },
-            InvalidMemoryLockRelease {
-                ptr,
-                len,
-                frame,
-                ref lock,
-            } => InvalidMemoryLockRelease { ptr, len, frame, lock: lock.clone() },
-            DeallocatedLockedMemory {
-                ptr,
-                ref lock,
-            } => DeallocatedLockedMemory { ptr, lock: lock.clone() },
-            ValidationFailure(ref s) => ValidationFailure(s.clone()),
-            CalledClosureAsFunction => CalledClosureAsFunction,
-            VtableForArgumentlessMethod => VtableForArgumentlessMethod,
-            ModifiedConstantMemory => ModifiedConstantMemory,
-            AssumptionNotHeld => AssumptionNotHeld,
-            InlineAsm => InlineAsm,
-            TypeNotPrimitive(ty) => TypeNotPrimitive(tcx.lift(&ty)?),
-            ReallocatedWrongMemoryKind(ref a, ref b) => {
-                ReallocatedWrongMemoryKind(a.clone(), b.clone())
-            },
-            DeallocatedWrongMemoryKind(ref a, ref b) => {
-                DeallocatedWrongMemoryKind(a.clone(), b.clone())
-            },
-            ReallocateNonBasePtr => ReallocateNonBasePtr,
-            DeallocateNonBasePtr => DeallocateNonBasePtr,
-            IncorrectAllocationInformation(a, b, c, d) => {
-                IncorrectAllocationInformation(a, b, c, d)
-            },
-            Layout(lay) => Layout(tcx.lift(&lay)?),
-            HeapAllocZeroBytes => HeapAllocZeroBytes,
-            HeapAllocNonPowerOfTwoAlignment(n) => HeapAllocNonPowerOfTwoAlignment(n),
-            Unreachable => Unreachable,
-            Panic { ref msg, ref file, line, col } => Panic {
-                msg: msg.clone(),
-                file: file.clone(),
-                line, col,
-            },
-            ReadFromReturnPointer => ReadFromReturnPointer,
-            PathNotFound(ref v) => PathNotFound(v.clone()),
-            UnimplementedTraitSelection => UnimplementedTraitSelection,
-            TypeckError => TypeckError,
-            TooGeneric => TooGeneric,
-            CheckMatchError => CheckMatchError,
-            ReferencedConstant(ref err) => ReferencedConstant(tcx.lift(&**err)?.into()),
-            OverflowNeg => OverflowNeg,
-            Overflow(op) => Overflow(op),
-            DivisionByZero => DivisionByZero,
-            RemainderByZero => RemainderByZero,
-            GeneratorResumedAfterReturn => GeneratorResumedAfterReturn,
-            GeneratorResumedAfterPanic => GeneratorResumedAfterPanic,
-            InfiniteLoop => InfiniteLoop,
-        })
-    }
-}
-
-impl<'a, 'tcx> Lift<'tcx> for ty::layout::LayoutError<'a> {
-    type Lifted = ty::layout::LayoutError<'tcx>;
-    fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
-        match *self {
-            ty::layout::LayoutError::Unknown(ref ty) => {
-                tcx.lift(ty).map(ty::layout::LayoutError::Unknown)
-            }
-            ty::layout::LayoutError::SizeOverflow(ref ty) => {
-                tcx.lift(ty).map(ty::layout::LayoutError::SizeOverflow)
-            }
-        }
-    }
-}
-
 impl<'a, 'tcx> Lift<'tcx> for ty::InstanceDef<'a> {
     type Lifted = ty::InstanceDef<'tcx>;
     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
index 9f0f744389089c56981a35d1a08a55be3dc4ec32..1f66ee36170dc510d119e536ba3fa0925930f107 100644 (file)
@@ -9,12 +9,11 @@
 // except according to those terms.
 
 use llvm;
-use rustc::mir::interpret::{ConstEvalErr, read_target_uint};
+use rustc::mir::interpret::{ErrorHandled, read_target_uint};
 use rustc_mir::const_eval::const_field;
 use rustc::hir::def_id::DefId;
 use rustc::mir;
 use rustc_data_structures::indexed_vec::Idx;
-use rustc_data_structures::sync::Lrc;
 use rustc::mir::interpret::{GlobalId, Pointer, Scalar, Allocation, ConstValue, AllocType};
 use rustc::ty::{self, Ty};
 use rustc::ty::layout::{self, HasDataLayout, LayoutOf, Size};
@@ -124,7 +123,7 @@ pub fn const_alloc_to_llvm(cx: &CodegenCx<'ll, '_>, alloc: &Allocation) -> &'ll
 pub fn codegen_static_initializer(
     cx: &CodegenCx<'ll, 'tcx>,
     def_id: DefId,
-) -> Result<(&'ll Value, &'tcx Allocation), Lrc<ConstEvalErr<'tcx>>> {
+) -> Result<(&'ll Value, &'tcx Allocation), ErrorHandled> {
     let instance = ty::Instance::mono(cx.tcx, def_id);
     let cid = GlobalId {
         instance,
@@ -145,7 +144,7 @@ fn fully_evaluate(
         &mut self,
         bx: &Builder<'a, 'll, 'tcx>,
         constant: &'tcx ty::Const<'tcx>,
-    ) -> Result<&'tcx ty::Const<'tcx>, Lrc<ConstEvalErr<'tcx>>> {
+    ) -> Result<&'tcx ty::Const<'tcx>, ErrorHandled> {
         match constant.val {
             ConstValue::Unevaluated(def_id, ref substs) => {
                 let tcx = bx.tcx();
@@ -165,7 +164,7 @@ pub fn eval_mir_constant(
         &mut self,
         bx: &Builder<'a, 'll, 'tcx>,
         constant: &mir::Constant<'tcx>,
-    ) -> Result<&'tcx ty::Const<'tcx>, Lrc<ConstEvalErr<'tcx>>> {
+    ) -> Result<&'tcx ty::Const<'tcx>, ErrorHandled> {
         let c = self.monomorphize(&constant.literal);
         self.fully_evaluate(bx, c)
     }
@@ -176,7 +175,7 @@ pub fn simd_shuffle_indices(
         bx: &Builder<'a, 'll, 'tcx>,
         span: Span,
         ty: Ty<'tcx>,
-        constant: Result<&'tcx ty::Const<'tcx>, Lrc<ConstEvalErr<'tcx>>>,
+        constant: Result<&'tcx ty::Const<'tcx>, ErrorHandled>,
     ) -> (&'ll Value, Ty<'tcx>) {
         constant
             .and_then(|c| {
@@ -185,7 +184,7 @@ pub fn simd_shuffle_indices(
                     ty::Array(_, n) => n.unwrap_usize(bx.tcx()),
                     ref other => bug!("invalid simd shuffle type: {}", other),
                 };
-                let values: Result<Vec<_>, Lrc<_>> = (0..fields).map(|field| {
+                let values: Result<Vec<_>, ErrorHandled> = (0..fields).map(|field| {
                     let field = const_field(
                         bx.tcx(),
                         ty::ParamEnv::reveal_all(),
@@ -211,9 +210,9 @@ pub fn simd_shuffle_indices(
                 let llval = C_struct(bx.cx, &values?, false);
                 Ok((llval, c.ty))
             })
-            .unwrap_or_else(|e| {
-                e.report_as_error(
-                    bx.tcx().at(span),
+            .unwrap_or_else(|_| {
+                bx.tcx().sess.span_err(
+                    span,
                     "could not evaluate shuffle_indices at compile time",
                 );
                 // We've errored, so we don't have to produce working code.
index ab43531240f3f5509637915e1fb7529be2dcfee6..25f03cbe97075e5e5d23b753621fc04e9f4b54f1 100644 (file)
@@ -8,11 +8,12 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-use rustc::mir::interpret::{ConstValue, ConstEvalErr};
+use rustc::mir::interpret::{ConstValue, ErrorHandled};
 use rustc::mir;
 use rustc::ty;
 use rustc::ty::layout::{self, Align, LayoutOf, TyLayout};
 use rustc_data_structures::sync::Lrc;
+use rustc_data_structures::indexed_vec::Idx;
 
 use base;
 use common::{CodegenCx, C_undef, C_usize};
@@ -79,7 +80,7 @@ pub fn new_zst(cx: &CodegenCx<'ll, 'tcx>,
 
     pub fn from_const(bx: &Builder<'a, 'll, 'tcx>,
                       val: &'tcx ty::Const<'tcx>)
-                      -> Result<OperandRef<'ll, 'tcx>, Lrc<ConstEvalErr<'tcx>>> {
+                      -> Result<OperandRef<'ll, 'tcx>, ErrorHandled> {
         let layout = bx.cx.layout_of(val.ty);
 
         if layout.is_zst() {
@@ -424,10 +425,13 @@ pub fn codegen_operand(&mut self,
                 self.eval_mir_constant(bx, constant)
                     .and_then(|c| OperandRef::from_const(bx, c))
                     .unwrap_or_else(|err| {
-                        err.report_as_error(
-                            bx.tcx().at(constant.span),
-                            "could not evaluate constant operand",
-                        );
+                        match err {
+                            // errored or at least linted
+                            ErrorHandled::Reported => {},
+                            ErrorHandled::TooGeneric => {
+                                bug!("codgen encountered polymorphic constant")
+                            },
+                        }
                         // Allow RalfJ to sleep soundly knowing that even refactorings that remove
                         // the above error (or silence it under some conditions) will not cause UB
                         let fnname = bx.cx.get_intrinsic(&("llvm.trap"));
index bc5f688729c368fa653bf2910f744246fe454261..597b6ae236676263a352f5e2858c90e788f65b61 100644 (file)
@@ -1590,7 +1590,7 @@ fn validate_const<'a, 'tcx>(
     }
 }
 
-fn check_const(cx: &LateContext, body_id: hir::BodyId, what: &str) {
+fn check_const(cx: &LateContext, body_id: hir::BodyId) {
     let def_id = cx.tcx.hir.body_owner_def_id(body_id);
     let is_static = cx.tcx.is_static(def_id).is_some();
     let param_env = if is_static {
@@ -1603,27 +1603,15 @@ fn check_const(cx: &LateContext, body_id: hir::BodyId, what: &str) {
         instance: ty::Instance::mono(cx.tcx, def_id),
         promoted: None
     };
-    match cx.tcx.const_eval(param_env.and(cid)) {
-        Ok(val) => validate_const(cx.tcx, val, param_env, cid, what),
-        Err(err) => {
-            // errors for statics are already reported directly in the query, avoid duplicates
-            if !is_static {
-                let span = cx.tcx.def_span(def_id);
-                err.report_as_lint(
-                    cx.tcx.at(span),
-                    &format!("this {} cannot be used", what),
-                    cx.current_lint_root(),
-                );
-            }
-        },
-    }
+    // trigger the query once for all constants since that will already report the errors
+    let _ = cx.tcx.const_eval(param_env.and(cid));
 }
 
 struct UnusedBrokenConstVisitor<'a, 'tcx: 'a>(&'a LateContext<'a, 'tcx>);
 
 impl<'a, 'tcx, 'v> hir::intravisit::Visitor<'v> for UnusedBrokenConstVisitor<'a, 'tcx> {
     fn visit_nested_body(&mut self, id: hir::BodyId) {
-        check_const(self.0, id, "array length");
+        check_const(self.0, id);
     }
     fn nested_visit_map<'this>(&'this mut self) -> hir::intravisit::NestedVisitorMap<'this, 'v> {
         hir::intravisit::NestedVisitorMap::None
@@ -1634,10 +1622,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedBrokenConst {
     fn check_item(&mut self, cx: &LateContext, it: &hir::Item) {
         match it.node {
             hir::ItemKind::Const(_, body_id) => {
-                check_const(cx, body_id, "constant");
+                check_const(cx, body_id);
             },
             hir::ItemKind::Static(_, _, body_id) => {
-                check_const(cx, body_id, "static");
+                check_const(cx, body_id);
             },
             hir::ItemKind::Ty(ref ty, _) => hir::intravisit::walk_ty(
                 &mut UnusedBrokenConstVisitor(cx),
index 5bf2b76e66849b6a5346a8d1a089b0cfd98a7199..211b8471115cc458ac976bc78a3da4cf805a66ce 100644 (file)
@@ -152,7 +152,6 @@ macro_rules! add_lint_group {
         UnreachablePub: UnreachablePub,
         UnnameableTestItems: UnnameableTestItems::new(),
         TypeAliasBounds: TypeAliasBounds,
-        UnusedBrokenConst: UnusedBrokenConst,
         TrivialConstraints: TrivialConstraints,
         TypeLimits: TypeLimits::new(),
         MissingDoc: MissingDoc::new(),
index bc917140bbd679a7907d8ffdc54b63ba21499bc7..6ad1536a63052412e5f1a87cb00c5ab5db6f7480 100644 (file)
 use std::collections::hash_map::Entry;
 
 use rustc::hir::{self, def_id::DefId};
-use rustc::mir::interpret::ConstEvalErr;
+use rustc::hir::def::Def;
+use rustc::mir::interpret::{ConstEvalErr, ErrorHandled};
 use rustc::mir;
 use rustc::ty::{self, Ty, TyCtxt, Instance, query::TyCtxtAt};
 use rustc::ty::layout::{self, Size, LayoutOf, TyLayout};
 use rustc::ty::subst::Subst;
+use rustc::util::nodemap::FxHashSet;
 use rustc_data_structures::indexed_vec::IndexVec;
 use rustc_data_structures::fx::FxHashMap;
+use rustc::util::common::ErrorReported;
 
 use syntax::ast::Mutability;
 use syntax::source_map::{Span, DUMMY_SP};
@@ -509,13 +512,11 @@ pub fn const_field<'a, 'tcx>(
         // this is not called for statics.
         op_to_const(&ecx, field, true)
     })();
-    result.map_err(|err| {
-        let (trace, span) = ecx.generate_stacktrace(None);
-        ConstEvalErr {
-            error: err,
-            stacktrace: trace,
-            span,
-        }.into()
+    result.map_err(|error| {
+        let stacktrace = ecx.generate_stacktrace(None);
+        let err = ::rustc::mir::interpret::ConstEvalErr { error, stacktrace, span: ecx.tcx.span };
+        err.report_as_error(ecx.tcx, "could not access field of constant");
+        ErrorHandled::Reported
     })
 }
 
@@ -531,25 +532,58 @@ pub fn const_variant_index<'a, 'tcx>(
     Ok(ecx.read_discriminant(op)?.1)
 }
 
-pub fn const_to_allocation_provider<'a, 'tcx>(
-    _tcx: TyCtxt<'a, 'tcx, 'tcx>,
-    val: &'tcx ty::Const<'tcx>,
-) -> &'tcx Allocation {
-    // FIXME: This really does not need to be a query.  Instead, we should have a query for statics
-    // that returns an allocation directly (or an `AllocId`?), after doing a sanity check of the
-    // value and centralizing error reporting.
-    match val.val {
-        ConstValue::ByRef(_, alloc, offset) => {
-            assert_eq!(offset.bytes(), 0);
-            return alloc;
-        },
-        _ => bug!("const_to_allocation called on non-static"),
-    }
+fn validate_const<'a, 'tcx>(
+    tcx: ty::TyCtxt<'a, 'tcx, 'tcx>,
+    constant: &'tcx ty::Const<'tcx>,
+    key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>,
+) -> ::rustc::mir::interpret::ConstEvalResult<'tcx> {
+    let cid = key.value;
+    let ecx = mk_eval_cx(tcx, cid.instance, key.param_env).unwrap();
+    let val = (|| {
+        let op = ecx.const_to_op(constant)?;
+        let mut todo = vec![(op, Vec::new())];
+        let mut seen = FxHashSet();
+        seen.insert(op);
+        while let Some((op, mut path)) = todo.pop() {
+            ecx.validate_operand(
+                op,
+                &mut path,
+                &mut seen,
+                &mut todo,
+            )?;
+        }
+        Ok(constant)
+    })();
+
+    val.map_err(|error| {
+        let stacktrace = ecx.generate_stacktrace(None);
+        let err = ::rustc::mir::interpret::ConstEvalErr { error, stacktrace, span: ecx.tcx.span };
+        match err.struct_error(ecx.tcx, "it is undefined behavior to use this value") {
+            Ok(mut diag) => {
+                diag.note("The rules on what exactly is undefined behavior aren't clear, \
+                    so this check might be overzealous. Please open an issue on the rust compiler \
+                    repository if you believe it should not be considered undefined behavior",
+                );
+                diag.emit();
+                ErrorHandled::Reported
+            }
+            Err(err) => err,
+        }
+    })
 }
 
 pub fn const_eval_provider<'a, 'tcx>(
     tcx: TyCtxt<'a, 'tcx, 'tcx>,
     key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>,
+) -> ::rustc::mir::interpret::ConstEvalResult<'tcx> {
+    tcx.const_eval_raw(key).and_then(|val| {
+        validate_const(tcx, val, key)
+    })
+}
+
+pub fn const_eval_raw_provider<'a, 'tcx>(
+    tcx: TyCtxt<'a, 'tcx, 'tcx>,
+    key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>,
 ) -> ::rustc::mir::interpret::ConstEvalResult<'tcx> {
     trace!("const eval: {:?}", key);
     let cid = key.value;
@@ -557,15 +591,10 @@ pub fn const_eval_provider<'a, 'tcx>(
 
     if let Some(id) = tcx.hir.as_local_node_id(def_id) {
         let tables = tcx.typeck_tables_of(def_id);
-        let span = tcx.def_span(def_id);
 
         // Do match-check before building MIR
-        if tcx.check_match(def_id).is_err() {
-            return Err(ConstEvalErr {
-                error: EvalErrorKind::CheckMatchError.into(),
-                stacktrace: vec![],
-                span,
-            }.into());
+        if let Err(ErrorReported) = tcx.check_match(def_id) {
+            return Err(ErrorHandled::Reported)
         }
 
         if let hir::BodyOwnerKind::Const = tcx.hir.body_owner_kind(id) {
@@ -574,11 +603,7 @@ pub fn const_eval_provider<'a, 'tcx>(
 
         // Do not continue into miri if typeck errors occurred; it will fail horribly
         if tables.tainted_by_errors {
-            return Err(ConstEvalErr {
-                error: EvalErrorKind::CheckMatchError.into(),
-                stacktrace: vec![],
-                span,
-            }.into());
+            return Err(ErrorHandled::Reported)
         }
     };
 
@@ -593,19 +618,50 @@ pub fn const_eval_provider<'a, 'tcx>(
             }
         }
         op_to_const(&ecx, op, normalize)
-    }).map_err(|err| {
-        let (trace, span) = ecx.generate_stacktrace(None);
-        let err = ConstEvalErr {
-            error: err,
-            stacktrace: trace,
-            span,
-        };
+    }).map_err(|error| {
+        let stacktrace = ecx.generate_stacktrace(None);
+        let err = ConstEvalErr { error, stacktrace, span: ecx.tcx.span };
         if tcx.is_static(def_id).is_some() {
-            err.report_as_error(ecx.tcx, "could not evaluate static initializer");
+            let err = err.report_as_error(ecx.tcx, "could not evaluate static initializer");
             if tcx.sess.err_count() == 0 {
-                span_bug!(span, "static eval failure didn't emit an error: {:#?}", err);
+                span_bug!(ecx.tcx.span, "static eval failure didn't emit an error: {:#?}", err);
+            }
+            err
+        } else if def_id.is_local() {
+            // constant defined in this crate, we can figure out a lint level!
+            match tcx.describe_def(def_id) {
+                Some(Def::Const(_)) | Some(Def::AssociatedConst(_)) => {
+                    let node_id = tcx.hir.as_local_node_id(def_id).unwrap();
+                    err.report_as_lint(
+                        tcx.at(tcx.def_span(def_id)),
+                        "any use of this value will cause an error",
+                        node_id,
+                    )
+                },
+                _ => if let Some(p) = cid.promoted {
+                    let span = tcx.optimized_mir(def_id).promoted[p].span;
+                    if let EvalErrorKind::ReferencedConstant = err.error.kind {
+                        err.report_as_error(
+                            tcx.at(span),
+                            "evaluation of constant expression failed",
+                        )
+                    } else {
+                        err.report_as_lint(
+                            tcx.at(span),
+                            "reaching this expression at runtime will panic or abort",
+                            tcx.hir.as_local_node_id(def_id).unwrap(),
+                        )
+                    }
+                } else {
+                    err.report_as_error(
+                        ecx.tcx,
+                        "evaluation of constant value failed",
+                    )
+                },
             }
+        } else {
+            // use of constant from other crate
+            err.report_as_error(ecx.tcx, "could not evaluate constant")
         }
-        err.into()
     })
 }
index 1df5f789751399dfeed2fef1b89b648e0db3c3cc..48fcdd42ff5e0b3ecf4419aa18c171d5d58045f2 100644 (file)
@@ -15,7 +15,7 @@
 use hair::cx::to_ref::ToRef;
 use hair::util::UserAnnotatedTyHelpers;
 use rustc::hir::def::{Def, CtorKind};
-use rustc::mir::interpret::GlobalId;
+use rustc::mir::interpret::{GlobalId, ErrorHandled};
 use rustc::ty::{self, AdtKind, Ty};
 use rustc::ty::adjustment::{Adjustment, Adjust, AutoBorrow, AutoBorrowMutability};
 use rustc::ty::cast::CastKind as TyCastKind;
@@ -571,8 +571,9 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
             let span = cx.tcx.def_span(def_id);
             let count = match cx.tcx.at(span).const_eval(cx.param_env.and(global_id)) {
                 Ok(cv) => cv.unwrap_usize(cx.tcx),
-                Err(e) => {
-                    e.report_as_error(cx.tcx.at(span), "could not evaluate array length");
+                Err(ErrorHandled::Reported) => 0,
+                Err(ErrorHandled::TooGeneric) => {
+                    cx.tcx.sess.span_err(span, "array lengths can't depend on generic parameters");
                     0
                 },
             };
index cb974366a3029b7560f86c72f0379f735e00db0c..4649c28aff518b0e29f1bd94fd946c86a891820d 100644 (file)
@@ -732,13 +732,13 @@ fn lower_path(&mut self,
                             Ok(value) => {
                                 return self.const_to_pat(instance, value, id, span)
                             },
-                            Err(err) => {
-                                err.report_as_error(
-                                    self.tcx.at(span),
+                            Err(_) => {
+                                self.tcx.sess.span_err(
+                                    span,
                                     "could not evaluate constant pattern",
                                 );
                                 PatternKind::Wild
-                            },
+                            }
                         }
                     },
                     None => {
index 189388921650cd4e6a7ef71daa696511a2a2945c..ce991c50330bb79ca64ad9adccb502fd85088dde 100644 (file)
@@ -611,8 +611,9 @@ pub fn const_eval(&self, gid: GlobalId<'tcx>) -> EvalResult<'tcx, &'tcx ty::Cons
         } else {
             self.param_env
         };
-        self.tcx.const_eval(param_env.and(gid))
-            .map_err(|err| EvalErrorKind::ReferencedConstant(err).into())
+        self.tcx.const_eval(param_env.and(gid)).map_err(|_| {
+            EvalErrorKind::ReferencedConstant.into()
+        })
     }
 
     pub fn dump_place(&self, place: Place<M::PointerTag>) {
@@ -679,7 +680,7 @@ pub fn dump_place(&self, place: Place<M::PointerTag>) {
         }
     }
 
-    pub fn generate_stacktrace(&self, explicit_span: Option<Span>) -> (Vec<FrameInfo>, Span) {
+    pub fn generate_stacktrace(&self, explicit_span: Option<Span>) -> Vec<FrameInfo> {
         let mut last_span = None;
         let mut frames = Vec::new();
         // skip 1 because the last frame is just the environment of the constant
@@ -716,7 +717,7 @@ pub fn generate_stacktrace(&self, explicit_span: Option<Span>) -> (Vec<FrameInfo
             frames.push(FrameInfo { span, location, lint_root });
         }
         trace!("generate stacktrace: {:#?}, {:?}", frames, explicit_span);
-        (frames, self.tcx.span)
+        frames
     }
 
     #[inline(always)]
index 9adca6c429798b75ebf8ef9a23a88548edca95be..b46e914133aad9089388069985127585eeaae673 100644 (file)
@@ -368,10 +368,12 @@ fn get_static_alloc(
             instance,
             promoted: None,
         };
-        tcx.const_eval(ty::ParamEnv::reveal_all().and(gid)).map_err(|err| {
+        // use the raw query here to break validation cycles. Later uses of the static will call the
+        // full query anyway
+        tcx.const_eval_raw(ty::ParamEnv::reveal_all().and(gid)).map_err(|_| {
             // no need to report anything, the const_eval call takes care of that for statics
             assert!(tcx.is_static(def_id).is_some());
-            EvalErrorKind::ReferencedConstant(err).into()
+            EvalErrorKind::ReferencedConstant.into()
         }).map(|const_val| {
             if let ConstValue::ByRef(_, allocation, _) = const_val.val {
                 // We got tcx memory. Let the machine figure out whether and how to
index 2f44dff2e22c3472cc18c58232f2ab585600fb57..d4495d3085d31425212240ed40604ee93fa24288 100644 (file)
@@ -94,6 +94,7 @@ pub fn provide(providers: &mut Providers) {
     shim::provide(providers);
     transform::provide(providers);
     providers.const_eval = const_eval::const_eval_provider;
+    providers.const_eval_raw = const_eval::const_eval_raw_provider;
     providers.check_match = hair::pattern::check_match;
 }
 
index 6b60b5340eee761f846786450b64c706c0fda3a5..e8c482e836ff4e04ea179b1e33682790c0d75b77 100644 (file)
 use rustc::mir::{self, Location, Promoted};
 use rustc::mir::visit::Visitor as MirVisitor;
 use rustc::mir::mono::MonoItem;
-use rustc::mir::interpret::{Scalar, GlobalId, AllocType};
+use rustc::mir::interpret::{Scalar, GlobalId, AllocType, ErrorHandled};
 
 use monomorphize::{self, Instance};
 use rustc::util::nodemap::{FxHashSet, FxHashMap, DefIdMap};
@@ -988,6 +988,20 @@ fn visit_item(&mut self, item: &'v hir::Item) {
             hir::ItemKind::Const(..) => {
                 // const items only generate mono items if they are
                 // actually used somewhere. Just declaring them is insufficient.
+
+                // but even just declaring them must collect the items they refer to
+                let def_id = self.tcx.hir.local_def_id(item.id);
+
+                let instance = Instance::mono(self.tcx, def_id);
+                let cid = GlobalId {
+                    instance,
+                    promoted: None,
+                };
+                let param_env = ty::ParamEnv::reveal_all();
+
+                if let Ok(val) = self.tcx.const_eval(param_env.and(cid)) {
+                    collect_const(self.tcx, val, instance.substs, &mut self.output);
+                }
             }
             hir::ItemKind::Fn(..) => {
                 let def_id = self.tcx.hir.local_def_id(item.id);
@@ -1198,15 +1212,10 @@ fn collect_neighbours<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
         };
         match tcx.const_eval(param_env.and(cid)) {
             Ok(val) => collect_const(tcx, val, instance.substs, output),
-            Err(err) => {
-                use rustc::mir::interpret::EvalErrorKind;
-                if let EvalErrorKind::ReferencedConstant(_) = err.error.kind {
-                    err.report_as_error(
-                        tcx.at(mir.promoted[i].span),
-                        "erroneous constant used",
-                    );
-                }
-            },
+            Err(ErrorHandled::Reported) => {},
+            Err(ErrorHandled::TooGeneric) => span_bug!(
+                mir.promoted[i].span, "collection encountered polymorphic constant",
+            ),
         }
     }
 }
@@ -1247,14 +1256,10 @@ fn collect_const<'a, 'tcx>(
             };
             match tcx.const_eval(param_env.and(cid)) {
                 Ok(val) => val.val,
-                Err(err) => {
-                    let span = tcx.def_span(def_id);
-                    err.report_as_error(
-                        tcx.at(span),
-                        "constant evaluation error",
-                    );
-                    return;
-                }
+                Err(ErrorHandled::Reported) => return,
+                Err(ErrorHandled::TooGeneric) => span_bug!(
+                    tcx.def_span(def_id), "collection encountered polymorphic constant",
+                ),
             }
         },
         _ => constant.val,
index 626baf207eebc0aa4871168e4a0a98fb0a6dbccc..6da40aa4a116bc7c5076904d0a50b6535a6a2da9 100644 (file)
@@ -18,7 +18,7 @@
 use rustc::mir::{TerminatorKind, ClearCrossCrate, SourceInfo, BinOp, ProjectionElem};
 use rustc::mir::visit::{Visitor, PlaceContext};
 use rustc::mir::interpret::{
-    ConstEvalErr, EvalErrorKind, Scalar, GlobalId, EvalResult
+    ConstEvalErr, EvalErrorKind, Scalar, GlobalId, EvalResult,
 };
 use rustc::ty::{TyCtxt, self, Instance};
 use interpret::{self, EvalContext, Value, OpTy, MemoryKind, ScalarMaybeUndef};
@@ -45,12 +45,17 @@ fn run_pass<'a, 'tcx>(&self,
             return;
         }
         match tcx.describe_def(source.def_id) {
-            // skip statics/consts because they'll be evaluated by miri anyway
-            Some(Def::Const(..)) |
-            Some(Def::Static(..)) => return,
-            // we still run on associated constants, because they might not get evaluated
-            // within the current crate
-            _ => {},
+            // Only run const prop on functions, methods, closures and associated constants
+            | Some(Def::Fn(_))
+            | Some(Def::Method(_))
+            | Some(Def::AssociatedConst(_))
+            | Some(Def::Closure(_))
+            => {}
+            // skip anon_const/statics/consts because they'll be evaluated by miri anyway
+            def => {
+                trace!("ConstProp skipped for {:?} ({:?})", source.def_id, def);
+                return
+            },
         }
         trace!("ConstProp starting for {:?}", source.def_id);
 
@@ -144,8 +149,8 @@ fn use_ecx<F, T>(
         let r = match f(self) {
             Ok(val) => Some(val),
             Err(error) => {
-                let (stacktrace, span) = self.ecx.generate_stacktrace(None);
-                let diagnostic = ConstEvalErr { span, error, stacktrace };
+                let stacktrace = self.ecx.generate_stacktrace(None);
+                let diagnostic = ConstEvalErr { span: source_info.span, error, stacktrace };
                 use rustc::mir::interpret::EvalErrorKind::*;
                 match diagnostic.error.kind {
                     // don't report these, they make no sense in a const prop context
@@ -208,7 +213,7 @@ fn use_ecx<F, T>(
                     | ReadFromReturnPointer
                     | GeneratorResumedAfterReturn
                     | GeneratorResumedAfterPanic
-                    | ReferencedConstant(_)
+                    | ReferencedConstant
                     | InfiniteLoop
                     => {
                         // FIXME: report UB here
@@ -223,7 +228,6 @@ fn use_ecx<F, T>(
                     | UnimplementedTraitSelection
                     | TypeckError
                     | TooGeneric
-                    | CheckMatchError
                     // these are just noise
                     => {},
 
@@ -264,16 +268,11 @@ fn eval_constant(
                 Some((op, c.span))
             },
             Err(error) => {
-                let (stacktrace, span) = self.ecx.generate_stacktrace(None);
-                let err = ConstEvalErr {
-                    span,
-                    error,
-                    stacktrace,
+                let stacktrace = self.ecx.generate_stacktrace(None);
+                let err = ::rustc::mir::interpret::ConstEvalErr {
+                    error, stacktrace, span: source_info.span,
                 };
-                err.report_as_error(
-                    self.tcx.at(source_info.span),
-                    "could not evaluate constant",
-                );
+                err.report_as_error(self.ecx.tcx, "erroneous constant used");
                 None
             },
         }
index 4b43a1a6270f86793b1f89ac1f71a935b4083dcc..cdd25b8aa7acc59c5f264a807f1678a20886974d 100644 (file)
@@ -827,6 +827,7 @@ fn fn_type(path: &ast::Path) -> bool {
                     ref_id: id_from_def_id(def_id),
                 })
             }
+            HirDef::Closure(_) |
             HirDef::PrimTy(..) |
             HirDef::SelfTy(..) |
             HirDef::Label(..) |
index 1c562859bb48d3edbca6b31bfbe3845271bf7225..55cfac20e9410771e5c1b99d52d37e001d2d5022 100644 (file)
@@ -4238,13 +4238,6 @@ fn check_expr_kind(
                 };
                 let count = tcx.const_eval(param_env.and(global_id));
 
-                if let Err(ref err) = count {
-                    err.report_as_error(
-                        tcx.at(tcx.def_span(count_def_id)),
-                        "could not evaluate repeat length",
-                    );
-                }
-
                 let uty = match expected {
                     ExpectHasType(uty) => {
                         match uty.sty {
index 6eda41730b3073e6052a6b39ff58959b8e175d7d..0eee0b4c7b89de609e3fb6e0fb2c910cc2bd129b 100644 (file)
@@ -16,7 +16,7 @@ const fn f(x: usize) -> usize {
     let mut sum = 0;
     //~^ let bindings in constant functions are unstable
     //~| statements in constant functions are unstable
-    for i in 0..x {
+    for i in 0..x { //~ ERROR E0080
         //~^ ERROR E0015
         //~| ERROR E0019
         sum += i;
@@ -26,5 +26,5 @@ const fn f(x: usize) -> usize {
 
 #[allow(unused_variables)]
 fn main() {
-    let a : [i32; f(X)]; //~ ERROR E0080
+    let a : [i32; f(X)];
 }
index 2ae94f6d6420a95564709045d149ba457f9bac93..1ed513033fd5d34f34644abd70d560d0fb750d02 100644 (file)
@@ -14,5 +14,5 @@ fn main() {
     [(); {while true {break}; 0}]; //~ ERROR constant contains unimplemented expression type
     [(); { for _ in 0usize.. {}; 0}]; //~ ERROR calls in constants are limited to constant functions
     //~^ ERROR constant contains unimplemented expression type
-    //~| ERROR could not evaluate repeat length
+    //~| ERROR evaluation of constant value failed
 }
index 91007fcd63a28b3d6c0cb0b1585215449bdd0287..2403d50db39536cae4225c1c22f61c91f774249e 100644 (file)
@@ -11,8 +11,9 @@
 const A: &'static [i32] = &[];
 const B: i32 = (&A)[1];
 //~^ index out of bounds: the len is 0 but the index is 1
-//~| ERROR this constant cannot be used
+//~| ERROR any use of this value will cause an error
+//~| ERROR any use of this value will cause an error
 
 fn main() {
-    let _ = B;
+    let _ = B; //~ ERROR erroneous constant used
 }
index b71d224f4f0ebaf9aabcf6f45d44626018228ed0..95ed88bde108c4dd9d3432aba3ae5d4376ca8cb7 100644 (file)
@@ -1,4 +1,4 @@
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/array_const_index-0.rs:12:1
    |
 LL | const B: i32 = (&A)[1];
@@ -8,5 +8,20 @@ LL | const B: i32 = (&A)[1];
    |
    = note: #[deny(const_err)] on by default
 
-error: aborting due to previous error
+error: any use of this value will cause an error
+  --> $DIR/array_const_index-0.rs:12:1
+   |
+LL | const B: i32 = (&A)[1];
+   | ^^^^^^^^^^^^^^^-------^
+   |                |
+   |                index out of bounds: the len is 0 but the index is 1
+
+error[E0080]: erroneous constant used
+  --> $DIR/array_const_index-0.rs:18:13
+   |
+LL |     let _ = B; //~ ERROR erroneous constant used
+   |             ^ referenced constant has errors
+
+error: aborting due to 3 previous errors
 
+For more information about this error, try `rustc --explain E0080`.
index 66739d308a70fd99b1c3bbb528f16d0ed9e3aff4..0a49348761c08bbd32d465e3fba47d84905e26c1 100644 (file)
@@ -11,8 +11,9 @@
 const A: [i32; 0] = [];
 const B: i32 = A[1];
 //~^ index out of bounds: the len is 0 but the index is 1
-//~| ERROR this constant cannot be used
+//~| ERROR any use of this value will cause an error
+//~| ERROR any use of this value will cause an error
 
 fn main() {
-    let _ = B;
+    let _ = B; //~ ERROR erroneous constant used
 }
index 02f86a693af0c286ffdc0479b0d9f1e22b515890..5fcfc14e2c0d005a1680d86900a38ac6ff9dcf24 100644 (file)
@@ -1,4 +1,4 @@
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/array_const_index-1.rs:12:1
    |
 LL | const B: i32 = A[1];
@@ -8,5 +8,20 @@ LL | const B: i32 = A[1];
    |
    = note: #[deny(const_err)] on by default
 
-error: aborting due to previous error
+error: any use of this value will cause an error
+  --> $DIR/array_const_index-1.rs:12:1
+   |
+LL | const B: i32 = A[1];
+   | ^^^^^^^^^^^^^^^----^
+   |                |
+   |                index out of bounds: the len is 0 but the index is 1
+
+error[E0080]: erroneous constant used
+  --> $DIR/array_const_index-1.rs:18:13
+   |
+LL |     let _ = B; //~ ERROR erroneous constant used
+   |             ^ referenced constant has errors
+
+error: aborting due to 3 previous errors
 
+For more information about this error, try `rustc --explain E0080`.
index 22a3c5ceeb7142893ddfd504cc06792767256b91..227364cffd1159ad0e0609f9a7c87ece8d1a6359 100644 (file)
@@ -16,7 +16,7 @@
 const BAR: usize = FOO[5]; // no error, because the error below occurs before regular const eval
 
 const BLUB: [u32; FOO[4]] = [5, 6];
-//~^ ERROR could not evaluate constant expression [E0080]
+//~^ ERROR evaluation of constant value failed [E0080]
 //~| index out of bounds: the len is 3 but the index is 4
 
 fn main() {
index 19ec9a4aa1745745edcb36ce6c38fb0e559f802d..5986376938b9094217a65d68ad4ab13cfe3c5c4f 100644 (file)
@@ -1,19 +1,9 @@
-error: index out of bounds: the len is 3 but the index is 4
+error[E0080]: evaluation of constant value failed
   --> $DIR/const-array-oob.rs:18:19
    |
 LL | const BLUB: [u32; FOO[4]] = [5, 6];
-   |                   ^^^^^^
-   |
-   = note: #[deny(const_err)] on by default
-
-error[E0080]: could not evaluate constant expression
-  --> $DIR/const-array-oob.rs:18:13
-   |
-LL | const BLUB: [u32; FOO[4]] = [5, 6];
-   |             ^^^^^^------^
-   |                   |
-   |                   index out of bounds: the len is 3 but the index is 4
+   |                   ^^^^^^ index out of bounds: the len is 3 but the index is 4
 
-error: aborting due to 2 previous errors
+error: aborting due to previous error
 
 For more information about this error, try `rustc --explain E0080`.
index 81be93e916e8bf0c1fbd3a68794f89bd736d4b74..e0427d0d04c9a9cc3bf6166997b4cbd0d5bbf7cd 100644 (file)
@@ -4,6 +4,12 @@ error[E0015]: calls in constants are limited to constant functions, tuple struct
 LL |     let _ = [0; f(2)];
    |                 ^^^^
 
-error: aborting due to previous error
+error[E0080]: evaluation of constant value failed
+  --> $DIR/const-call.rs:16:17
+   |
+LL |     let _ = [0; f(2)];
+   |                 ^^^^ calling non-const fn `f`
+
+error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0015`.
index 39b1b342eac3149752718d55ad5d48e24e3669c9..488e6f49e14bbb5cb1f578a22e13c75b5f370c51 100644 (file)
 #![deny(const_err)]
 
 pub const A: i8 = -std::i8::MIN; //~ ERROR const_err
+//~^ ERROR const_err
 pub const B: u8 = 200u8 + 200u8; //~ ERROR const_err
 pub const C: u8 = 200u8 * 4; //~ ERROR const_err
 pub const D: u8 = 42u8 - (42u8 + 1); //~ ERROR const_err
 pub const E: u8 = [5u8][1]; //~ ERROR const_err
 
 fn main() {
-    let _a = A;
-    let _b = B;
-    let _c = C;
-    let _d = D;
-    let _e = E;
-    let _e = [6u8][1];
+    let _a = A; //~ ERROR erroneous constant used
+    let _b = B; //~ ERROR erroneous constant used
+    let _c = C; //~ ERROR erroneous constant used
+    let _d = D; //~ ERROR erroneous constant used
+    let _e = E; //~ ERROR erroneous constant used
+    let _e = [6u8][1]; //~ ERROR index out of bounds
 }
index 36f3ac1a9bca233690062749a35c20d71d1dcc35..21c7bf0a70a498e324786c14264595a1f3b180eb 100644 (file)
@@ -1,4 +1,4 @@
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const-err-early.rs:13:1
    |
 LL | pub const A: i8 = -std::i8::MIN; //~ ERROR const_err
@@ -12,37 +12,82 @@ note: lint level defined here
 LL | #![deny(const_err)]
    |         ^^^^^^^^^
 
-error: this constant cannot be used
-  --> $DIR/const-err-early.rs:14:1
+error: any use of this value will cause an error
+  --> $DIR/const-err-early.rs:15:1
    |
 LL | pub const B: u8 = 200u8 + 200u8; //~ ERROR const_err
    | ^^^^^^^^^^^^^^^^^^-------------^
    |                   |
    |                   attempt to add with overflow
 
-error: this constant cannot be used
-  --> $DIR/const-err-early.rs:15:1
+error: any use of this value will cause an error
+  --> $DIR/const-err-early.rs:16:1
    |
 LL | pub const C: u8 = 200u8 * 4; //~ ERROR const_err
    | ^^^^^^^^^^^^^^^^^^---------^
    |                   |
    |                   attempt to multiply with overflow
 
-error: this constant cannot be used
-  --> $DIR/const-err-early.rs:16:1
+error: any use of this value will cause an error
+  --> $DIR/const-err-early.rs:17:1
    |
 LL | pub const D: u8 = 42u8 - (42u8 + 1); //~ ERROR const_err
    | ^^^^^^^^^^^^^^^^^^-----------------^
    |                   |
    |                   attempt to subtract with overflow
 
-error: this constant cannot be used
-  --> $DIR/const-err-early.rs:17:1
+error: any use of this value will cause an error
+  --> $DIR/const-err-early.rs:18:1
    |
 LL | pub const E: u8 = [5u8][1]; //~ ERROR const_err
    | ^^^^^^^^^^^^^^^^^^--------^
    |                   |
    |                   index out of bounds: the len is 1 but the index is 1
 
-error: aborting due to 5 previous errors
+error: any use of this value will cause an error
+  --> $DIR/const-err-early.rs:13:1
+   |
+LL | pub const A: i8 = -std::i8::MIN; //~ ERROR const_err
+   | ^^^^^^^^^^^^^^^^^^-------------^
+   |                   |
+   |                   attempt to negate with overflow
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-err-early.rs:21:14
+   |
+LL |     let _a = A; //~ ERROR erroneous constant used
+   |              ^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-err-early.rs:22:14
+   |
+LL |     let _b = B; //~ ERROR erroneous constant used
+   |              ^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-err-early.rs:23:14
+   |
+LL |     let _c = C; //~ ERROR erroneous constant used
+   |              ^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-err-early.rs:24:14
+   |
+LL |     let _d = D; //~ ERROR erroneous constant used
+   |              ^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-err-early.rs:25:14
+   |
+LL |     let _e = E; //~ ERROR erroneous constant used
+   |              ^ referenced constant has errors
+
+error: index out of bounds: the len is 1 but the index is 1
+  --> $DIR/const-err-early.rs:26:14
+   |
+LL |     let _e = [6u8][1]; //~ ERROR index out of bounds
+   |              ^^^^^^^^
+
+error: aborting due to 12 previous errors
 
+For more information about this error, try `rustc --explain E0080`.
index f2ee8a7078c7c0d9f94dbeb3a2c874be32da4055..c3960b839925f11171f53f3a60d109b40e4fb1c9 100644 (file)
 #![deny(const_err)]
 
 pub const A: i8 = -std::i8::MIN;
-//~^ ERROR this constant cannot be used
-pub const B: i8 = A;
 //~^ ERROR const_err
 //~| ERROR const_err
+pub const B: i8 = A;
+//~^ ERROR const_err
 pub const C: u8 = A as u8;
 //~^ ERROR const_err
-//~| ERROR const_err
 pub const D: i8 = 50 - A;
 //~^ ERROR const_err
-//~| ERROR const_err
 
 fn main() {
     let _ = (A, B, C, D);
+    //~^ ERROR erroneous constant used
 }
index dd3eaa4c47b9d3c41e722e6b22f8a2186f54c868..0717302dbf9aa4b3adc6a66741d1004a160b550c 100644 (file)
@@ -1,4 +1,4 @@
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const-err-multi.rs:13:1
    |
 LL | pub const A: i8 = -std::i8::MIN;
@@ -12,33 +12,15 @@ note: lint level defined here
 LL | #![deny(const_err)]
    |         ^^^^^^^^^
 
-error: referenced constant has errors
-  --> $DIR/const-err-multi.rs:15:1
-   |
-LL | pub const A: i8 = -std::i8::MIN;
-   |                   ------------- attempt to negate with overflow
-LL | //~^ ERROR this constant cannot be used
-LL | pub const B: i8 = A;
-   | ^^^^^^^^^^^^^^^^^^^^
-
-error: this constant cannot be used
-  --> $DIR/const-err-multi.rs:15:1
+error: any use of this value will cause an error
+  --> $DIR/const-err-multi.rs:16:1
    |
 LL | pub const B: i8 = A;
    | ^^^^^^^^^^^^^^^^^^-^
    |                   |
    |                   referenced constant has errors
 
-error: referenced constant has errors
-  --> $DIR/const-err-multi.rs:18:1
-   |
-LL | pub const A: i8 = -std::i8::MIN;
-   |                   ------------- attempt to negate with overflow
-...
-LL | pub const C: u8 = A as u8;
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const-err-multi.rs:18:1
    |
 LL | pub const C: u8 = A as u8;
@@ -46,22 +28,28 @@ LL | pub const C: u8 = A as u8;
    |                   |
    |                   referenced constant has errors
 
-error: referenced constant has errors
-  --> $DIR/const-err-multi.rs:21:1
-   |
-LL | pub const A: i8 = -std::i8::MIN;
-   |                   ------------- attempt to negate with overflow
-...
-LL | pub const D: i8 = 50 - A;
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: this constant cannot be used
-  --> $DIR/const-err-multi.rs:21:1
+error: any use of this value will cause an error
+  --> $DIR/const-err-multi.rs:20:1
    |
 LL | pub const D: i8 = 50 - A;
    | ^^^^^^^^^^^^^^^^^^------^
    |                   |
    |                   referenced constant has errors
 
-error: aborting due to 7 previous errors
+error: any use of this value will cause an error
+  --> $DIR/const-err-multi.rs:13:1
+   |
+LL | pub const A: i8 = -std::i8::MIN;
+   | ^^^^^^^^^^^^^^^^^^-------------^
+   |                   |
+   |                   attempt to negate with overflow
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-err-multi.rs:24:13
+   |
+LL |     let _ = (A, B, C, D);
+   |             ^^^^^^^^^^^^ referenced constant has errors
+
+error: aborting due to 6 previous errors
 
+For more information about this error, try `rustc --explain E0080`.
index 8683f6a0231921c0e89d84a9dc36fe68edfc6e58..7c59e8b953596d2d4b4683849532beb33ef17b90 100644 (file)
 
 // compile-flags: -Zforce-overflow-checks=on
 
-// these errors are not actually "const_err", they occur in codegen/consts
-// and are unconditional warnings that can't be denied or allowed
-
 #![allow(exceeding_bitshifts)]
-#![allow(const_err)]
+#![warn(const_err)]
 
 fn black_box<T>(_: T) {
     unimplemented!()
 }
 
-// Make sure that the two uses get two errors.
 const FOO: u8 = [5u8][1];
-//~^ ERROR constant evaluation error
-//~| index out of bounds: the len is 1 but the index is 1
+//~^ WARN any use of this value will cause an error
+//~| WARN any use of this value will cause an error
 
 fn main() {
     black_box((FOO, FOO));
-    //~^ ERROR referenced constant has errors
-    //~| ERROR could not evaluate constant
+    //~^ ERROR erroneous constant used
 }
index 1674f99b6823dbfc44935e63acc1978ee2c6b620..b46277f4b019fe99592a88f4745787d8fd431ac3 100644 (file)
@@ -1,26 +1,31 @@
-error[E0080]: referenced constant has errors
-  --> $DIR/const-err.rs:29:15
+warning: any use of this value will cause an error
+  --> $DIR/const-err.rs:20:1
    |
 LL | const FOO: u8 = [5u8][1];
-   |                 -------- index out of bounds: the len is 1 but the index is 1
-...
-LL |     black_box((FOO, FOO));
-   |               ^^^^^^^^^^
-
-error[E0080]: could not evaluate constant
-  --> $DIR/const-err.rs:29:15
+   | ^^^^^^^^^^^^^^^^--------^
+   |                 |
+   |                 index out of bounds: the len is 1 but the index is 1
    |
-LL |     black_box((FOO, FOO));
-   |               ^^^^^^^^^^ referenced constant has errors
+note: lint level defined here
+  --> $DIR/const-err.rs:14:9
+   |
+LL | #![warn(const_err)]
+   |         ^^^^^^^^^
 
-error[E0080]: constant evaluation error
-  --> $DIR/const-err.rs:24:1
+warning: any use of this value will cause an error
+  --> $DIR/const-err.rs:20:1
    |
 LL | const FOO: u8 = [5u8][1];
    | ^^^^^^^^^^^^^^^^--------^
    |                 |
    |                 index out of bounds: the len is 1 but the index is 1
 
-error: aborting due to 3 previous errors
+error[E0080]: erroneous constant used
+  --> $DIR/const-err.rs:25:15
+   |
+LL |     black_box((FOO, FOO));
+   |               ^^^^^^^^^^ referenced constant has errors
+
+error: aborting due to previous error
 
 For more information about this error, try `rustc --explain E0080`.
index 10376d5780908d6ed1f16050b09d2823450f10f8..0bbc254453cff6b20b91bc50e7be15ea7247c1f8 100644 (file)
@@ -16,7 +16,7 @@ union Foo {
 
 enum Bar {
     Boo = [unsafe { Foo { b: () }.a }; 4][3],
-    //~^ ERROR could not evaluate enum discriminant
+    //~^ ERROR evaluation of constant value failed
 }
 
 fn main() {
index dc64737b22f5e87ca7ae4ecdc6c68ff63420c235..bb50f38062ee995349ad340781c69f73f408eac3 100644 (file)
@@ -1,4 +1,4 @@
-error[E0080]: could not evaluate enum discriminant
+error[E0080]: evaluation of constant value failed
   --> $DIR/const-err4.rs:18:11
    |
 LL |     Boo = [unsafe { Foo { b: () }.a }; 4][3],
diff --git a/src/test/ui/consts/const-eval/conditional_array_execution.nll.stderr b/src/test/ui/consts/const-eval/conditional_array_execution.nll.stderr
new file mode 100644 (file)
index 0000000..b6c35b8
--- /dev/null
@@ -0,0 +1,29 @@
+warning: any use of this value will cause an error
+  --> $DIR/conditional_array_execution.rs:15:1
+   |
+LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize];
+   | ^^^^^^^^^^^^^^^^^^-----^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |                   |
+   |                   attempt to subtract with overflow
+   |
+note: lint level defined here
+  --> $DIR/conditional_array_execution.rs:11:9
+   |
+LL | #![warn(const_err)]
+   |         ^^^^^^^^^
+
+error[E0080]: evaluation of constant expression failed
+  --> $DIR/conditional_array_execution.rs:19:14
+   |
+LL |     println!("{}", FOO);
+   |              ^^^^  --- referenced constant has errors
+
+error[E0080]: evaluation of constant expression failed
+  --> $DIR/conditional_array_execution.rs:19:20
+   |
+LL |     println!("{}", FOO);
+   |                    ^^^ referenced constant has errors
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0080`.
index 8142ed0155aaebc581d2d990c98886c6f6821111..4e245c6b9e8cf665adc01fac20da87b085d992db 100644 (file)
 const X: u32 = 5;
 const Y: u32 = 6;
 const FOO: u32 = [X - Y, Y - X][(X < Y) as usize];
-//~^ WARN this constant cannot be used
+//~^ WARN any use of this value will cause an error
 
 fn main() {
     println!("{}", FOO);
     //~^ ERROR
-    //~| ERROR
 }
index 29f5f8e2ade59198d3eb2182f7942da7691f4f84..90131080ed16b55bbd4ff0f219e52c9d3bfa260a 100644 (file)
@@ -1,4 +1,4 @@
-warning: this constant cannot be used
+warning: any use of this value will cause an error
   --> $DIR/conditional_array_execution.rs:15:1
    |
 LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize];
@@ -12,21 +12,12 @@ note: lint level defined here
 LL | #![warn(const_err)]
    |         ^^^^^^^^^
 
-error[E0080]: referenced constant has errors
-  --> $DIR/conditional_array_execution.rs:19:20
-   |
-LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize];
-   |                   ----- attempt to subtract with overflow
-...
-LL |     println!("{}", FOO);
-   |                    ^^^
-
-error[E0080]: erroneous constant used
+error[E0080]: evaluation of constant expression failed
   --> $DIR/conditional_array_execution.rs:19:20
    |
 LL |     println!("{}", FOO);
    |                    ^^^ referenced constant has errors
 
-error: aborting due to 2 previous errors
+error: aborting due to previous error
 
 For more information about this error, try `rustc --explain E0080`.
index e99d409880e072fdd07ae6810c3070d3e8caaef0..70c98977301a93a32b8ffff5f9f43eb43b9ef15c 100644 (file)
@@ -1,12 +1,8 @@
-error[E0080]: could not evaluate constant pattern
+error: could not evaluate constant pattern
   --> $DIR/const-eval-overflow-2.rs:25:9
    |
-LL | const NEG_NEG_128: i8 = -NEG_128;
-   |                         -------- attempt to negate with overflow
-...
 LL |         NEG_NEG_128 => println!("A"),
    |         ^^^^^^^^^^^
 
 error: aborting due to previous error
 
-For more information about this error, try `rustc --explain E0080`.
index f2b4e6b3b567b223d2d56ac24b09bc77e258364e..bcef9eff2f899d9907a9e6b1be0943ba1e3cdb37 100644 (file)
@@ -1,19 +1,9 @@
-error: attempt to add with overflow
+error[E0080]: evaluation of constant value failed
   --> $DIR/const-eval-overflow-3.rs:30:11
    |
 LL |     = [0; (i8::MAX + 1) as usize];
-   |           ^^^^^^^^^^^^^
-   |
-   = note: #[deny(const_err)] on by default
-
-error[E0080]: could not evaluate repeat length
-  --> $DIR/const-eval-overflow-3.rs:30:11
-   |
-LL |     = [0; (i8::MAX + 1) as usize];
-   |           -------------^^^^^^^^^
-   |           |
-   |           attempt to add with overflow
+   |           ^^^^^^^^^^^^^ attempt to add with overflow
 
-error: aborting due to 2 previous errors
+error: aborting due to previous error
 
 For more information about this error, try `rustc --explain E0080`.
index e9fc8ec0c374e2f8be45a42954b9a2ca5c4421c3..5d692d9d7fc9e86bee58f5b8335dd8e135ef6c09 100644 (file)
@@ -21,8 +21,7 @@
 
 const A_I8_T
     : [u32; (i8::MAX as i8 + 1i8) as usize]
-    //~^ ERROR attempt to add with overflow
-    //~| ERROR could not evaluate constant expression
+    //~^ ERROR evaluation of constant value failed
     = [0; (i8::MAX as usize) + 1];
 
 fn main() {
index b12aa032b6070e7eac16f3721a3e7f8822b5c99b..fd186dc719cd5b20a2a174586ceaa60faf799a1a 100644 (file)
@@ -1,19 +1,9 @@
-error: attempt to add with overflow
+error[E0080]: evaluation of constant value failed
   --> $DIR/const-eval-overflow-4.rs:23:13
    |
 LL |     : [u32; (i8::MAX as i8 + 1i8) as usize]
-   |             ^^^^^^^^^^^^^^^^^^^^^
-   |
-   = note: #[deny(const_err)] on by default
-
-error[E0080]: could not evaluate constant expression
-  --> $DIR/const-eval-overflow-4.rs:23:7
-   |
-LL |     : [u32; (i8::MAX as i8 + 1i8) as usize]
-   |       ^^^^^^---------------------^^^^^^^^^^
-   |             |
-   |             attempt to add with overflow
+   |             ^^^^^^^^^^^^^^^^^^^^^ attempt to add with overflow
 
-error: aborting due to 2 previous errors
+error: aborting due to previous error
 
 For more information about this error, try `rustc --explain E0080`.
index 88fc51827753532d7107dc574df8d298f8b086fa..ee29423a90cde84070ee5e67ac805fb9d2568bff 100644 (file)
 use std::{i8, i16, i32, i64, isize};
 use std::{u8, u16, u32, u64, usize};
 
-const VALS_I8: (i8,) =
-     //~^ ERROR this constant cannot be used
+const VALS_I8: (i8,) = //~ ERROR any use of this value will cause an error
+     //~^ const_err
     (
      i8::MIN - 1,
      );
 
-const VALS_I16: (i16,) =
-     //~^ ERROR this constant cannot be used
+const VALS_I16: (i16,) = //~ ERROR any use of this value will cause an error
     (
      i16::MIN - 1,
      );
 
-const VALS_I32: (i32,) =
-     //~^ ERROR this constant cannot be used
+const VALS_I32: (i32,) = //~ ERROR any use of this value will cause an error
     (
      i32::MIN - 1,
      );
 
-const VALS_I64: (i64,) =
-     //~^ ERROR this constant cannot be used
+const VALS_I64: (i64,) = //~ ERROR any use of this value will cause an error
     (
      i64::MIN - 1,
      );
 
-const VALS_U8: (u8,) =
-     //~^ ERROR this constant cannot be used
+const VALS_U8: (u8,) = //~ ERROR any use of this value will cause an error
     (
      u8::MIN - 1,
      );
 
-const VALS_U16: (u16,) = (
-     //~^ ERROR this constant cannot be used
+const VALS_U16: (u16,) = ( //~ ERROR any use of this value will cause an error
      u16::MIN - 1,
      );
 
-const VALS_U32: (u32,) = (
-     //~^ ERROR this constant cannot be used
+const VALS_U32: (u32,) = ( //~ ERROR any use of this value will cause an error
      u32::MIN - 1,
      );
 
-const VALS_U64: (u64,) =
-     //~^ ERROR this constant cannot be used
+const VALS_U64: (u64,) = //~ ERROR any use of this value will cause an error
     (
      u64::MIN - 1,
      );
 
 fn main() {
-    foo(VALS_I8);
-    foo(VALS_I16);
-    foo(VALS_I32);
-    foo(VALS_I64);
+    foo(VALS_I8); //~ ERROR erroneous constant used
+    foo(VALS_I16); //~ ERROR erroneous constant used
+    foo(VALS_I32); //~ ERROR erroneous constant used
+    foo(VALS_I64); //~ ERROR erroneous constant used
 
-    foo(VALS_U8);
-    foo(VALS_U16);
-    foo(VALS_U32);
-    foo(VALS_U64);
+    foo(VALS_U8); //~ ERROR erroneous constant used
+    foo(VALS_U16); //~ ERROR erroneous constant used
+    foo(VALS_U32); //~ ERROR erroneous constant used
+    foo(VALS_U64); //~ ERROR erroneous constant used
 }
 
 fn foo<T>(_: T) {
index 5cf5ce367e253902c611e81f2bd95f882a674933..f10a6eee6de9c66cfc7452f9f9a05158db5405be 100644 (file)
@@ -1,8 +1,8 @@
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const-eval-overflow2.rs:24:1
    |
-LL | / const VALS_I8: (i8,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_I8: (i8,) = //~ ERROR any use of this value will cause an error
+LL | |      //~^ const_err
 LL | |     (
 LL | |      i8::MIN - 1,
    | |      ----------- attempt to subtract with overflow
@@ -15,80 +15,133 @@ note: lint level defined here
 LL | #![deny(const_err)]
    |         ^^^^^^^^^
 
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const-eval-overflow2.rs:30:1
    |
-LL | / const VALS_I16: (i16,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_I16: (i16,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      i16::MIN - 1,
    | |      ------------ attempt to subtract with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2.rs:36:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:35:1
    |
-LL | / const VALS_I32: (i32,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_I32: (i32,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      i32::MIN - 1,
    | |      ------------ attempt to subtract with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2.rs:42:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:40:1
    |
-LL | / const VALS_I64: (i64,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_I64: (i64,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      i64::MIN - 1,
    | |      ------------ attempt to subtract with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2.rs:48:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:45:1
    |
-LL | / const VALS_U8: (u8,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_U8: (u8,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      u8::MIN - 1,
    | |      ----------- attempt to subtract with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2.rs:54:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:50:1
    |
-LL | / const VALS_U16: (u16,) = (
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_U16: (u16,) = ( //~ ERROR any use of this value will cause an error
 LL | |      u16::MIN - 1,
    | |      ------------ attempt to subtract with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2.rs:59:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:54:1
    |
-LL | / const VALS_U32: (u32,) = (
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_U32: (u32,) = ( //~ ERROR any use of this value will cause an error
 LL | |      u32::MIN - 1,
    | |      ------------ attempt to subtract with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2.rs:64:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:58:1
    |
-LL | / const VALS_U64: (u64,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_U64: (u64,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      u64::MIN - 1,
    | |      ------------ attempt to subtract with overflow
 LL | |      );
    | |_______^
 
-error: aborting due to 8 previous errors
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:24:1
+   |
+LL | / const VALS_I8: (i8,) = //~ ERROR any use of this value will cause an error
+LL | |      //~^ const_err
+LL | |     (
+LL | |      i8::MIN - 1,
+   | |      ----------- attempt to subtract with overflow
+LL | |      );
+   | |_______^
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2.rs:64:5
+   |
+LL |     foo(VALS_I8); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2.rs:65:5
+   |
+LL |     foo(VALS_I16); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2.rs:66:5
+   |
+LL |     foo(VALS_I32); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2.rs:67:5
+   |
+LL |     foo(VALS_I64); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2.rs:69:5
+   |
+LL |     foo(VALS_U8); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2.rs:70:5
+   |
+LL |     foo(VALS_U16); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2.rs:71:5
+   |
+LL |     foo(VALS_U32); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2.rs:72:5
+   |
+LL |     foo(VALS_U64); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error: aborting due to 17 previous errors
 
+For more information about this error, try `rustc --explain E0080`.
index 1878daea93198a40cf169e407b43f3c33fd2cc2a..55dc2a894054a44025bbb69b41fcca854c279fd7 100644 (file)
 use std::{i8, i16, i32, i64, isize};
 use std::{u8, u16, u32, u64, usize};
 
-const VALS_I8: (i8,) =
-     //~^ ERROR this constant cannot be used
+const VALS_I8: (i8,) = //~ ERROR any use of this value will cause an error
+     //~^ const_err
     (
      i8::MAX + 1,
      );
 
-const VALS_I16: (i16,) =
-     //~^ ERROR this constant cannot be used
+const VALS_I16: (i16,) = //~ ERROR any use of this value will cause an error
     (
      i16::MAX + 1,
      );
 
-const VALS_I32: (i32,) =
-     //~^ ERROR this constant cannot be used
+const VALS_I32: (i32,) = //~ ERROR any use of this value will cause an error
     (
      i32::MAX + 1,
      );
 
-const VALS_I64: (i64,) =
-     //~^ ERROR this constant cannot be used
+const VALS_I64: (i64,) = //~ ERROR any use of this value will cause an error
     (
      i64::MAX + 1,
      );
 
-const VALS_U8: (u8,) =
-     //~^ ERROR this constant cannot be used
+const VALS_U8: (u8,) = //~ ERROR any use of this value will cause an error
     (
      u8::MAX + 1,
      );
 
-const VALS_U16: (u16,) = (
-     //~^ ERROR this constant cannot be used
+const VALS_U16: (u16,) = ( //~ ERROR any use of this value will cause an error
      u16::MAX + 1,
      );
 
-const VALS_U32: (u32,) = (
-     //~^ ERROR this constant cannot be used
+const VALS_U32: (u32,) = ( //~ ERROR any use of this value will cause an error
      u32::MAX + 1,
      );
 
-const VALS_U64: (u64,) =
-     //~^ ERROR this constant cannot be used
+const VALS_U64: (u64,) = //~ ERROR any use of this value will cause an error
     (
      u64::MAX + 1,
      );
 
 fn main() {
-    foo(VALS_I8);
-    foo(VALS_I16);
-    foo(VALS_I32);
-    foo(VALS_I64);
+    foo(VALS_I8); //~ ERROR erroneous constant used
+    foo(VALS_I16); //~ ERROR erroneous constant used
+    foo(VALS_I32); //~ ERROR erroneous constant used
+    foo(VALS_I64); //~ ERROR erroneous constant used
 
-    foo(VALS_U8);
-    foo(VALS_U16);
-    foo(VALS_U32);
-    foo(VALS_U64);
+    foo(VALS_U8); //~ ERROR erroneous constant used
+    foo(VALS_U16); //~ ERROR erroneous constant used
+    foo(VALS_U32); //~ ERROR erroneous constant used
+    foo(VALS_U64); //~ ERROR erroneous constant used
 }
 
 fn foo<T>(_: T) {
index 458a9e11e75739fe86ce0b6d773e535a7bd119f7..3b78fb51a623a1352b641572b3f08b97b60d0850 100644 (file)
@@ -1,8 +1,8 @@
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const-eval-overflow2b.rs:24:1
    |
-LL | / const VALS_I8: (i8,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_I8: (i8,) = //~ ERROR any use of this value will cause an error
+LL | |      //~^ const_err
 LL | |     (
 LL | |      i8::MAX + 1,
    | |      ----------- attempt to add with overflow
@@ -15,80 +15,133 @@ note: lint level defined here
 LL | #![deny(const_err)]
    |         ^^^^^^^^^
 
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const-eval-overflow2b.rs:30:1
    |
-LL | / const VALS_I16: (i16,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_I16: (i16,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      i16::MAX + 1,
    | |      ------------ attempt to add with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2b.rs:36:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:35:1
    |
-LL | / const VALS_I32: (i32,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_I32: (i32,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      i32::MAX + 1,
    | |      ------------ attempt to add with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2b.rs:42:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:40:1
    |
-LL | / const VALS_I64: (i64,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_I64: (i64,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      i64::MAX + 1,
    | |      ------------ attempt to add with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2b.rs:48:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:45:1
    |
-LL | / const VALS_U8: (u8,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_U8: (u8,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      u8::MAX + 1,
    | |      ----------- attempt to add with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2b.rs:54:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:50:1
    |
-LL | / const VALS_U16: (u16,) = (
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_U16: (u16,) = ( //~ ERROR any use of this value will cause an error
 LL | |      u16::MAX + 1,
    | |      ------------ attempt to add with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2b.rs:59:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:54:1
    |
-LL | / const VALS_U32: (u32,) = (
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_U32: (u32,) = ( //~ ERROR any use of this value will cause an error
 LL | |      u32::MAX + 1,
    | |      ------------ attempt to add with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2b.rs:64:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:58:1
    |
-LL | / const VALS_U64: (u64,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_U64: (u64,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      u64::MAX + 1,
    | |      ------------ attempt to add with overflow
 LL | |      );
    | |_______^
 
-error: aborting due to 8 previous errors
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:24:1
+   |
+LL | / const VALS_I8: (i8,) = //~ ERROR any use of this value will cause an error
+LL | |      //~^ const_err
+LL | |     (
+LL | |      i8::MAX + 1,
+   | |      ----------- attempt to add with overflow
+LL | |      );
+   | |_______^
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2b.rs:64:5
+   |
+LL |     foo(VALS_I8); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2b.rs:65:5
+   |
+LL |     foo(VALS_I16); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2b.rs:66:5
+   |
+LL |     foo(VALS_I32); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2b.rs:67:5
+   |
+LL |     foo(VALS_I64); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2b.rs:69:5
+   |
+LL |     foo(VALS_U8); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2b.rs:70:5
+   |
+LL |     foo(VALS_U16); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2b.rs:71:5
+   |
+LL |     foo(VALS_U32); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2b.rs:72:5
+   |
+LL |     foo(VALS_U64); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error: aborting due to 17 previous errors
 
+For more information about this error, try `rustc --explain E0080`.
index f3d28295bf81ce19a0116590d5d796c3884aad62..93ba11efc59987277bd3cf8fa8b3b6e210a97616 100644 (file)
 use std::{i8, i16, i32, i64, isize};
 use std::{u8, u16, u32, u64, usize};
 
-const VALS_I8: (i8,) =
-     //~^ ERROR this constant cannot be used
+const VALS_I8: (i8,) = //~ ERROR any use of this value will cause an error
+     //~^ const_err
     (
      i8::MIN * 2,
      );
 
-const VALS_I16: (i16,) =
-     //~^ ERROR this constant cannot be used
+const VALS_I16: (i16,) = //~ ERROR any use of this value will cause an error
     (
      i16::MIN * 2,
      );
 
-const VALS_I32: (i32,) =
-     //~^ ERROR this constant cannot be used
+const VALS_I32: (i32,) = //~ ERROR any use of this value will cause an error
     (
      i32::MIN * 2,
      );
 
-const VALS_I64: (i64,) =
-     //~^ ERROR this constant cannot be used
+const VALS_I64: (i64,) = //~ ERROR any use of this value will cause an error
     (
      i64::MIN * 2,
      );
 
-const VALS_U8: (u8,) =
-     //~^ ERROR this constant cannot be used
+const VALS_U8: (u8,) = //~ ERROR any use of this value will cause an error
     (
      u8::MAX * 2,
      );
 
-const VALS_U16: (u16,) = (
-     //~^ ERROR this constant cannot be used
+const VALS_U16: (u16,) = ( //~ ERROR any use of this value will cause an error
      u16::MAX * 2,
      );
 
-const VALS_U32: (u32,) = (
-     //~^ ERROR this constant cannot be used
+const VALS_U32: (u32,) = ( //~ ERROR any use of this value will cause an error
      u32::MAX * 2,
      );
 
-const VALS_U64: (u64,) =
-     //~^ ERROR this constant cannot be used
+const VALS_U64: (u64,) = //~ ERROR any use of this value will cause an error
     (
      u64::MAX * 2,
      );
 
 fn main() {
-    foo(VALS_I8);
-    foo(VALS_I16);
-    foo(VALS_I32);
-    foo(VALS_I64);
+    foo(VALS_I8); //~ ERROR erroneous constant used
+    foo(VALS_I16); //~ ERROR erroneous constant used
+    foo(VALS_I32); //~ ERROR erroneous constant used
+    foo(VALS_I64); //~ ERROR erroneous constant used
 
-    foo(VALS_U8);
-    foo(VALS_U16);
-    foo(VALS_U32);
-    foo(VALS_U64);
+    foo(VALS_U8); //~ ERROR erroneous constant used
+    foo(VALS_U16); //~ ERROR erroneous constant used
+    foo(VALS_U32); //~ ERROR erroneous constant used
+    foo(VALS_U64); //~ ERROR erroneous constant used
 }
 
 fn foo<T>(_: T) {
index 866860281cf66f36d7129d45bc9641c20db40468..abaae4bd54227c87f5e4f802be9045ecfddfeddd 100644 (file)
@@ -1,8 +1,8 @@
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const-eval-overflow2c.rs:24:1
    |
-LL | / const VALS_I8: (i8,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_I8: (i8,) = //~ ERROR any use of this value will cause an error
+LL | |      //~^ const_err
 LL | |     (
 LL | |      i8::MIN * 2,
    | |      ----------- attempt to multiply with overflow
@@ -15,80 +15,133 @@ note: lint level defined here
 LL | #![deny(const_err)]
    |         ^^^^^^^^^
 
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const-eval-overflow2c.rs:30:1
    |
-LL | / const VALS_I16: (i16,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_I16: (i16,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      i16::MIN * 2,
    | |      ------------ attempt to multiply with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2c.rs:36:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:35:1
    |
-LL | / const VALS_I32: (i32,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_I32: (i32,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      i32::MIN * 2,
    | |      ------------ attempt to multiply with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2c.rs:42:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:40:1
    |
-LL | / const VALS_I64: (i64,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_I64: (i64,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      i64::MIN * 2,
    | |      ------------ attempt to multiply with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2c.rs:48:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:45:1
    |
-LL | / const VALS_U8: (u8,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_U8: (u8,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      u8::MAX * 2,
    | |      ----------- attempt to multiply with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2c.rs:54:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:50:1
    |
-LL | / const VALS_U16: (u16,) = (
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_U16: (u16,) = ( //~ ERROR any use of this value will cause an error
 LL | |      u16::MAX * 2,
    | |      ------------ attempt to multiply with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2c.rs:59:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:54:1
    |
-LL | / const VALS_U32: (u32,) = (
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_U32: (u32,) = ( //~ ERROR any use of this value will cause an error
 LL | |      u32::MAX * 2,
    | |      ------------ attempt to multiply with overflow
 LL | |      );
    | |_______^
 
-error: this constant cannot be used
-  --> $DIR/const-eval-overflow2c.rs:64:1
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:58:1
    |
-LL | / const VALS_U64: (u64,) =
-LL | |      //~^ ERROR this constant cannot be used
+LL | / const VALS_U64: (u64,) = //~ ERROR any use of this value will cause an error
 LL | |     (
 LL | |      u64::MAX * 2,
    | |      ------------ attempt to multiply with overflow
 LL | |      );
    | |_______^
 
-error: aborting due to 8 previous errors
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:24:1
+   |
+LL | / const VALS_I8: (i8,) = //~ ERROR any use of this value will cause an error
+LL | |      //~^ const_err
+LL | |     (
+LL | |      i8::MIN * 2,
+   | |      ----------- attempt to multiply with overflow
+LL | |      );
+   | |_______^
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2c.rs:64:5
+   |
+LL |     foo(VALS_I8); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2c.rs:65:5
+   |
+LL |     foo(VALS_I16); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2c.rs:66:5
+   |
+LL |     foo(VALS_I32); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2c.rs:67:5
+   |
+LL |     foo(VALS_I64); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2c.rs:69:5
+   |
+LL |     foo(VALS_U8); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2c.rs:70:5
+   |
+LL |     foo(VALS_U16); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2c.rs:71:5
+   |
+LL |     foo(VALS_U32); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-eval-overflow2c.rs:72:5
+   |
+LL |     foo(VALS_U64); //~ ERROR erroneous constant used
+   |     ^^^^^^^^^^^^^ referenced constant has errors
+
+error: aborting due to 17 previous errors
 
+For more information about this error, try `rustc --explain E0080`.
index dc84e2a88d64aa85f084337ec138dc75e1d76458..05d79a7d63393f1a07d6e6ac0821f185bc95a01d 100644 (file)
@@ -25,86 +25,86 @@ fn main() {
     //~^ ERROR this constant likely exhibits undefined behavior
 
     const I32_REF_U8_UNION: u8 = unsafe { Nonsense { int_32_ref: &3 }.uint_8 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const I32_REF_U16_UNION: u16 = unsafe { Nonsense { int_32_ref: &3 }.uint_16 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const I32_REF_U32_UNION: u32 = unsafe { Nonsense { int_32_ref: &3 }.uint_32 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const I32_REF_U64_UNION: u64 = unsafe { Nonsense { int_32_ref: &3 }.uint_64 };
     //~^ ERROR this constant likely exhibits undefined behavior
 
     const I32_REF_U128_UNION: u128 = unsafe { Nonsense { int_32_ref: &3 }.uint_128 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const I32_REF_I8_UNION: i8 = unsafe { Nonsense { int_32_ref: &3 }.int_8 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const I32_REF_I16_UNION: i16 = unsafe { Nonsense { int_32_ref: &3 }.int_16 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const I32_REF_I32_UNION: i32 = unsafe { Nonsense { int_32_ref: &3 }.int_32 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const I32_REF_I64_UNION: i64 = unsafe { Nonsense { int_32_ref: &3 }.int_64 };
     //~^ ERROR this constant likely exhibits undefined behavior
 
     const I32_REF_I128_UNION: i128 = unsafe { Nonsense { int_32_ref: &3 }.int_128 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const I32_REF_F32_UNION: f32 = unsafe { Nonsense { int_32_ref: &3 }.float_32 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const I32_REF_F64_UNION: f64 = unsafe { Nonsense { int_32_ref: &3 }.float_64 };
     //~^ ERROR this constant likely exhibits undefined behavior
 
     const I32_REF_BOOL_UNION: bool = unsafe { Nonsense { int_32_ref: &3 }.truthy_falsey };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const I32_REF_CHAR_UNION: char = unsafe { Nonsense { int_32_ref: &3 }.character };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const STR_U8_UNION: u8 = unsafe { Nonsense { stringy: "3" }.uint_8 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const STR_U16_UNION: u16 = unsafe { Nonsense { stringy: "3" }.uint_16 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const STR_U32_UNION: u32 = unsafe { Nonsense { stringy: "3" }.uint_32 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const STR_U64_UNION: u64 = unsafe { Nonsense { stringy: "3" }.uint_64 };
     //~^ ERROR this constant likely exhibits undefined behavior
 
     const STR_U128_UNION: u128 = unsafe { Nonsense { stringy: "3" }.uint_128 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const STR_I8_UNION: i8 = unsafe { Nonsense { stringy: "3" }.int_8 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const STR_I16_UNION: i16 = unsafe { Nonsense { stringy: "3" }.int_16 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const STR_I32_UNION: i32 = unsafe { Nonsense { stringy: "3" }.int_32 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const STR_I64_UNION: i64 = unsafe { Nonsense { stringy: "3" }.int_64 };
     //~^ ERROR this constant likely exhibits undefined behavior
 
     const STR_I128_UNION: i128 = unsafe { Nonsense { stringy: "3" }.int_128 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const STR_F32_UNION: f32 = unsafe { Nonsense { stringy: "3" }.float_32 };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const STR_F64_UNION: f64 = unsafe { Nonsense { stringy: "3" }.float_64 };
     //~^ ERROR this constant likely exhibits undefined behavior
 
     const STR_BOOL_UNION: bool = unsafe { Nonsense { stringy: "3" }.truthy_falsey };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 
     const STR_CHAR_UNION: char = unsafe { Nonsense { stringy: "3" }.character };
-    //~^ ERROR this constant cannot be used
+    //~^ ERROR any use of this value will cause an error
 }
index f2170f509eb30a40c0c486ea2614050dd000aed9..9af631afed4ffd3c8591351362c845a54f8b0562 100644 (file)
@@ -9,14 +9,13 @@
 // except according to those terms.
 
 #![feature(const_panic)]
+#![crate_type = "lib"]
 
-fn main() {}
+pub const Z: () = panic!("cheese");
+//~^ ERROR any use of this value will cause an error
 
-const Z: () = panic!("cheese");
-//~^ ERROR this constant cannot be used
+pub const Y: () = unreachable!();
+//~^ ERROR any use of this value will cause an error
 
-const Y: () = unreachable!();
-//~^ ERROR this constant cannot be used
-
-const X: () = unimplemented!();
-//~^ ERROR this constant cannot be used
+pub const X: () = unimplemented!();
+//~^ ERROR any use of this value will cause an error
index c11146f4882c205847d75edbd411c6f71659c3b2..fcdbcbf5bfa69cc6933573dd9544406b64e105f5 100644 (file)
@@ -1,31 +1,31 @@
-error: this constant cannot be used
-  --> $DIR/const_panic.rs:15:1
+error: any use of this value will cause an error
+  --> $DIR/const_panic.rs:14:1
    |
-LL | const Z: () = panic!("cheese");
-   | ^^^^^^^^^^^^^^----------------^
-   |               |
-   |               the evaluated program panicked at 'cheese', $DIR/const_panic.rs:15:15
+LL | pub const Z: () = panic!("cheese");
+   | ^^^^^^^^^^^^^^^^^^----------------^
+   |                   |
+   |                   the evaluated program panicked at 'cheese', $DIR/const_panic.rs:14:19
    |
    = note: #[deny(const_err)] on by default
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
 
-error: this constant cannot be used
-  --> $DIR/const_panic.rs:18:1
+error: any use of this value will cause an error
+  --> $DIR/const_panic.rs:17:1
    |
-LL | const Y: () = unreachable!();
-   | ^^^^^^^^^^^^^^--------------^
-   |               |
-   |               the evaluated program panicked at 'internal error: entered unreachable code', $DIR/const_panic.rs:18:15
+LL | pub const Y: () = unreachable!();
+   | ^^^^^^^^^^^^^^^^^^--------------^
+   |                   |
+   |                   the evaluated program panicked at 'internal error: entered unreachable code', $DIR/const_panic.rs:17:19
    |
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
 
-error: this constant cannot be used
-  --> $DIR/const_panic.rs:21:1
+error: any use of this value will cause an error
+  --> $DIR/const_panic.rs:20:1
    |
-LL | const X: () = unimplemented!();
-   | ^^^^^^^^^^^^^^----------------^
-   |               |
-   |               the evaluated program panicked at 'not yet implemented', $DIR/const_panic.rs:21:15
+LL | pub const X: () = unimplemented!();
+   | ^^^^^^^^^^^^^^^^^^----------------^
+   |                   |
+   |                   the evaluated program panicked at 'not yet implemented', $DIR/const_panic.rs:20:19
    |
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
 
index 59aeca18129a8b86d8c7303c5af5846194a3eb5a..11da8742b10f6ad0c0b01a55a8ea2a4e262d4751 100644 (file)
 #![feature(const_panic)]
 
 const Z: () = panic!("cheese");
-//~^ ERROR this constant cannot be used
+//~^ ERROR any use of this value will cause an error
 
 const Y: () = unreachable!();
-//~^ ERROR this constant cannot be used
+//~^ ERROR any use of this value will cause an error
 
 const X: () = unimplemented!();
-//~^ ERROR this constant cannot be used
+//~^ ERROR any use of this value will cause an error
index 45f2ee7744e828068611f77c8e73dca1645897a8..a8f04b96a8b1fb9fd3844ccf065455271c7cc5d1 100644 (file)
@@ -1,4 +1,4 @@
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const_panic_libcore.rs:15:1
    |
 LL | const Z: () = panic!("cheese");
@@ -9,7 +9,7 @@ LL | const Z: () = panic!("cheese");
    = note: #[deny(const_err)] on by default
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
 
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const_panic_libcore.rs:18:1
    |
 LL | const Y: () = unreachable!();
@@ -19,7 +19,7 @@ LL | const Y: () = unreachable!();
    |
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
 
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const_panic_libcore.rs:21:1
    |
 LL | const X: () = unimplemented!();
index 0364123994dff31e57ada3ba723a1a1e4f013a6f..03365ae46abaf872c134b9b08a2e216fbf5a4d21 100644 (file)
 use core::panic::PanicInfo;
 
 const Z: () = panic!("cheese");
-//~^ ERROR this constant cannot be used
+//~^ ERROR any use of this value will cause an error
 
 const Y: () = unreachable!();
-//~^ ERROR this constant cannot be used
+//~^ ERROR any use of this value will cause an error
 
 const X: () = unimplemented!();
-//~^ ERROR this constant cannot be used
+//~^ ERROR any use of this value will cause an error
 
 #[lang = "eh_personality"]
 fn eh() {}
index 44b30c08cdea238517456acafdd0800eae94cc97..9a7c510029cbc7fc5c256908eb0dd117463a42dd 100644 (file)
@@ -1,5 +1,5 @@
-error: this constant cannot be used
-  --> $DIR/const_panic_libcore_main.rs:19:1
+error: any use of this value will cause an error
+  --> $DIR/const_panic_libcore_main.rs:20:1
    |
 LL | const Z: () = panic!("cheese");
    | ^^^^^^^^^^^^^^----------------^
@@ -9,8 +9,8 @@ LL | const Z: () = panic!("cheese");
    = note: #[deny(const_err)] on by default
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
 
-error: this constant cannot be used
-  --> $DIR/const_panic_libcore_main.rs:22:1
+error: any use of this value will cause an error
+  --> $DIR/const_panic_libcore_main.rs:23:1
    |
 LL | const Y: () = unreachable!();
    | ^^^^^^^^^^^^^^--------------^
@@ -19,8 +19,8 @@ LL | const Y: () = unreachable!();
    |
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
 
-error: this constant cannot be used
-  --> $DIR/const_panic_libcore_main.rs:25:1
+error: any use of this value will cause an error
+  --> $DIR/const_panic_libcore_main.rs:26:1
    |
 LL | const X: () = unimplemented!();
    | ^^^^^^^^^^^^^^----------------^
index 2aff6a7c55c20e080f68a536e3ba090051bff29e..3cd2c04c9f1f496d8f297bba4d484a8605fd51d9 100644 (file)
 fn main() {}
 
 // unconst and bad, will thus error in miri
-const X: bool = &1 as *const i32 == &2 as *const i32; //~ ERROR cannot be used
+const X: bool = &1 as *const i32 == &2 as *const i32; //~ ERROR any use of this value will cause
 // unconst and fine
 const X2: bool = 42 as *const i32 == 43 as *const i32;
 // unconst and fine
 const Y: usize = 42usize as *const i32 as usize + 1;
 // unconst and bad, will thus error in miri
-const Y2: usize = &1 as *const i32 as usize + 1; //~ ERROR cannot be used
+const Y2: usize = &1 as *const i32 as usize + 1; //~ ERROR any use of this value will cause
 // unconst and fine
 const Z: i32 = unsafe { *(&1 as *const i32) };
 // unconst and bad, will thus error in miri
-const Z2: i32 = unsafe { *(42 as *const i32) }; //~ ERROR cannot be used
-const Z3: i32 = unsafe { *(44 as *const i32) }; //~ ERROR cannot be used
+const Z2: i32 = unsafe { *(42 as *const i32) }; //~ ERROR any use of this value will cause
+const Z3: i32 = unsafe { *(44 as *const i32) }; //~ ERROR any use of this value will cause
index df1e6f8e4c4f0d7820dba78648a13ecefb7e1aad..72bbdeb0183d644e2c977c9d3449249a4bfcac89 100644 (file)
@@ -1,33 +1,33 @@
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const_raw_ptr_ops.rs:16:1
    |
-LL | const X: bool = &1 as *const i32 == &2 as *const i32; //~ ERROR cannot be used
+LL | const X: bool = &1 as *const i32 == &2 as *const i32; //~ ERROR any use of this value will cause
    | ^^^^^^^^^^^^^^^^------------------------------------^
    |                 |
    |                 "pointer arithmetic or comparison" needs an rfc before being allowed inside constants
    |
    = note: #[deny(const_err)] on by default
 
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const_raw_ptr_ops.rs:22:1
    |
-LL | const Y2: usize = &1 as *const i32 as usize + 1; //~ ERROR cannot be used
+LL | const Y2: usize = &1 as *const i32 as usize + 1; //~ ERROR any use of this value will cause
    | ^^^^^^^^^^^^^^^^^^-----------------------------^
    |                   |
    |                   "pointer arithmetic or comparison" needs an rfc before being allowed inside constants
 
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const_raw_ptr_ops.rs:26:1
    |
-LL | const Z2: i32 = unsafe { *(42 as *const i32) }; //~ ERROR cannot be used
+LL | const Z2: i32 = unsafe { *(42 as *const i32) }; //~ ERROR any use of this value will cause
    | ^^^^^^^^^^^^^^^^^^^^^^^^^-------------------^^^
    |                          |
    |                          a memory access tried to interpret some bytes as a pointer
 
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const_raw_ptr_ops.rs:27:1
    |
-LL | const Z3: i32 = unsafe { *(44 as *const i32) }; //~ ERROR cannot be used
+LL | const Z3: i32 = unsafe { *(44 as *const i32) }; //~ ERROR any use of this value will cause
    | ^^^^^^^^^^^^^^^^^^^^^^^^^-------------------^^^
    |                          |
    |                          a memory access tried to interpret some bytes as a pointer
index 21025877340eabd482f19268d2a2535b003577bf..9dd7570232d37f13102901c953bebd71fcd0bed7 100644 (file)
@@ -1,4 +1,4 @@
-error[E0080]: this static likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/double_check2.rs:25:1
    |
 LL | / static FOO: (&Foo, &Bar) = unsafe {( //~ undefined behavior
index a1f8ab7f878824f78e0cf1948a0412f7807c6b0e..d23b6250b4df2e8830042120b1498c8f4c29f2e7 100644 (file)
@@ -15,10 +15,10 @@ fn main() {
     // The value of `n` will loop indefinitely (4 - 2 - 1 - 4).
     let _ = [(); {
         //~^ WARNING Constant evaluating a complex constant, this might take some time
-        //~| ERROR could not evaluate repeat length
         let mut n = 113383; // #20 in https://oeis.org/A006884
         while n != 0 { //~ ERROR constant contains unimplemented expression type
             n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
+            //~^ ERROR evaluation of constant value failed
         }
         n
     }];
index f69aae29203600102a6e20e96a7b9c394ebd6766..2ff80e5efb57d49852b91cf4d0e71e924dc1f6b3 100644 (file)
@@ -1,8 +1,9 @@
 error[E0019]: constant contains unimplemented expression type
-  --> $DIR/infinite_loop.rs:20:9
+  --> $DIR/infinite_loop.rs:19:9
    |
 LL | /         while n != 0 { //~ ERROR constant contains unimplemented expression type
 LL | |             n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
+LL | |             //~^ ERROR evaluation of constant value failed
 LL | |         }
    | |_________^
 
@@ -12,28 +13,18 @@ warning: Constant evaluating a complex constant, this might take some time
 LL |       let _ = [(); {
    |  __________________^
 LL | |         //~^ WARNING Constant evaluating a complex constant, this might take some time
-LL | |         //~| ERROR could not evaluate repeat length
 LL | |         let mut n = 113383; // #20 in https://oeis.org/A006884
+LL | |         while n != 0 { //~ ERROR constant contains unimplemented expression type
 ...  |
 LL | |         n
 LL | |     }];
    | |_____^
 
-error[E0080]: could not evaluate repeat length
-  --> $DIR/infinite_loop.rs:16:18
+error[E0080]: evaluation of constant value failed
+  --> $DIR/infinite_loop.rs:20:20
    |
-LL |       let _ = [(); {
-   |  __________________^
-LL | |         //~^ WARNING Constant evaluating a complex constant, this might take some time
-LL | |         //~| ERROR could not evaluate repeat length
-LL | |         let mut n = 113383; // #20 in https://oeis.org/A006884
-LL | |         while n != 0 { //~ ERROR constant contains unimplemented expression type
-LL | |             n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
-   | |                    ---------- duplicate interpreter state observed here, const evaluation will never terminate
-LL | |         }
-LL | |         n
-LL | |     }];
-   | |_____^
+LL |             n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
+   |                    ^^^^^^^^^^ duplicate interpreter state observed here, const evaluation will never terminate
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/consts/const-eval/issue-43197.nll.stderr b/src/test/ui/consts/const-eval/issue-43197.nll.stderr
new file mode 100644 (file)
index 0000000..86a8692
--- /dev/null
@@ -0,0 +1,43 @@
+warning: any use of this value will cause an error
+  --> $DIR/issue-43197.rs:20:5
+   |
+LL |     const X: u32 = 0-1;
+   |     ^^^^^^^^^^^^^^^---^
+   |                    |
+   |                    attempt to subtract with overflow
+   |
+note: lint level defined here
+  --> $DIR/issue-43197.rs:11:9
+   |
+LL | #![warn(const_err)]
+   |         ^^^^^^^^^
+
+warning: any use of this value will cause an error
+  --> $DIR/issue-43197.rs:22:5
+   |
+LL |     const Y: u32 = foo(0-1);
+   |     ^^^^^^^^^^^^^^^^^^^---^^
+   |                        |
+   |                        attempt to subtract with overflow
+
+error[E0080]: evaluation of constant expression failed
+  --> $DIR/issue-43197.rs:24:14
+   |
+LL |     println!("{} {}", X, Y);
+   |              ^^^^^^^  - referenced constant has errors
+
+error[E0080]: evaluation of constant expression failed
+  --> $DIR/issue-43197.rs:24:26
+   |
+LL |     println!("{} {}", X, Y);
+   |                          ^ referenced constant has errors
+
+error[E0080]: evaluation of constant expression failed
+  --> $DIR/issue-43197.rs:24:23
+   |
+LL |     println!("{} {}", X, Y);
+   |                       ^ referenced constant has errors
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0080`.
index 6e60fd834d4c3fa0b557e571a23be6cdd68e4244..125b5e4d208ccc234f400f1d50fc02fd7fbbdab3 100644 (file)
@@ -16,12 +16,10 @@ const fn foo(x: u32) -> u32 {
 
 fn main() {
     const X: u32 = 0-1;
-    //~^ WARN this constant cannot be used
+    //~^ WARN any use of this value will cause
     const Y: u32 = foo(0-1);
-    //~^ WARN this constant cannot be used
+    //~^ WARN any use of this value will cause
     println!("{} {}", X, Y);
-    //~^ ERROR erroneous constant used
-    //~| ERROR erroneous constant used
-    //~| ERROR E0080
-    //~| ERROR E0080
+    //~^ ERROR evaluation of constant expression failed
+    //~| ERROR evaluation of constant expression failed
 }
index 6229790f8adc2519baec7797faf9a2bef8dd28ab..95d435818303b5fc0f4095ad4b927aa76c00f47b 100644 (file)
@@ -1,5 +1,5 @@
-warning: this constant cannot be used
-  --> $DIR/issue-43197.rs:18:5
+warning: any use of this value will cause an error
+  --> $DIR/issue-43197.rs:20:5
    |
 LL |     const X: u32 = 0-1;
    |     ^^^^^^^^^^^^^^^---^
@@ -12,44 +12,26 @@ note: lint level defined here
 LL | #![warn(const_err)]
    |         ^^^^^^^^^
 
-warning: this constant cannot be used
-  --> $DIR/issue-43197.rs:20:5
+warning: any use of this value will cause an error
+  --> $DIR/issue-43197.rs:22:5
    |
 LL |     const Y: u32 = foo(0-1);
    |     ^^^^^^^^^^^^^^^^^^^---^^
    |                        |
    |                        attempt to subtract with overflow
 
-error[E0080]: referenced constant has errors
-  --> $DIR/issue-43197.rs:22:26
-   |
-LL |     const Y: u32 = foo(0-1);
-   |                        --- attempt to subtract with overflow
-LL |     //~^ WARN this constant cannot be used
-LL |     println!("{} {}", X, Y);
-   |                          ^
-
-error[E0080]: erroneous constant used
-  --> $DIR/issue-43197.rs:22:26
+error[E0080]: evaluation of constant expression failed
+  --> $DIR/issue-43197.rs:24:26
    |
 LL |     println!("{} {}", X, Y);
    |                          ^ referenced constant has errors
 
-error[E0080]: referenced constant has errors
-  --> $DIR/issue-43197.rs:22:23
-   |
-LL |     const X: u32 = 0-1;
-   |                    --- attempt to subtract with overflow
-...
-LL |     println!("{} {}", X, Y);
-   |                       ^
-
-error[E0080]: erroneous constant used
-  --> $DIR/issue-43197.rs:22:23
+error[E0080]: evaluation of constant expression failed
+  --> $DIR/issue-43197.rs:24:23
    |
 LL |     println!("{} {}", X, Y);
    |                       ^ referenced constant has errors
 
-error: aborting due to 4 previous errors
+error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
diff --git a/src/test/ui/consts/const-eval/issue-44578.nll.stderr b/src/test/ui/consts/const-eval/issue-44578.nll.stderr
new file mode 100644 (file)
index 0000000..71e06e3
--- /dev/null
@@ -0,0 +1,15 @@
+error[E0080]: evaluation of constant expression failed
+  --> $DIR/issue-44578.rs:35:14
+   |
+LL |     println!("{}", <Bar<u16, u8> as Foo>::AMT);
+   |              ^^^^  -------------------------- referenced constant has errors
+
+error[E0080]: evaluation of constant expression failed
+  --> $DIR/issue-44578.rs:35:20
+   |
+LL |     println!("{}", <Bar<u16, u8> as Foo>::AMT);
+   |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0080`.
index 59ac4ab311c6cc19163ab10ae70a3b86d00b5517..9bd84b91d7f024771bb0d584a8dd637168abcad3 100644 (file)
@@ -33,6 +33,5 @@ impl Foo for u16 {
 
 fn main() {
     println!("{}", <Bar<u16, u8> as Foo>::AMT);
-    //~^ ERROR erroneous constant used
-    //~| ERROR E0080
+    //~^ ERROR E0080
 }
index 06174f37dcad1145896f92a9d2fa78e3e68a5c7f..570a8960164c02ac3475e007b418604bdcaea9cb 100644 (file)
@@ -1,18 +1,9 @@
-error[E0080]: referenced constant has errors
-  --> $DIR/issue-44578.rs:35:20
-   |
-LL |     const AMT: usize = [A::AMT][(A::AMT > B::AMT) as usize];
-   |                        ------------------------------------ index out of bounds: the len is 1 but the index is 1
-...
-LL |     println!("{}", <Bar<u16, u8> as Foo>::AMT);
-   |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0080]: erroneous constant used
+error[E0080]: evaluation of constant expression failed
   --> $DIR/issue-44578.rs:35:20
    |
 LL |     println!("{}", <Bar<u16, u8> as Foo>::AMT);
    |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors
 
-error: aborting due to 2 previous errors
+error: aborting due to previous error
 
 For more information about this error, try `rustc --explain E0080`.
index af627ee5fbe70f65af41e68dee91e0d2ce357ca2..9a59ffd65ac2139ee48c287e2ad224d81e895429 100644 (file)
@@ -19,12 +19,11 @@ trait Foo<T> {
 struct A<T>(T);
 
 impl<T: C> Foo<T> for A<T> {
-    const BAR: usize = [5, 6, 7][T::BOO];
+    const BAR: usize = [5, 6, 7][T::BOO]; //~ ERROR any use of this value will cause an error
 }
 
 fn foo<T: C>() -> &'static usize {
-    &<A<T> as Foo<T>>::BAR //~ ERROR erroneous constant used
-//~| ERROR E0080
+    &<A<T> as Foo<T>>::BAR //~ ERROR E0080
 }
 
 impl C for () {
index 1e37e9498120fb64da6ba57d8feb4f03c1381103..b36b3cf526c68ff930926a03eee810c9be5331db 100644 (file)
@@ -1,16 +1,17 @@
-error[E0080]: referenced constant has errors
-  --> $DIR/issue-50814-2.rs:26:5
+error: any use of this value will cause an error
+  --> $DIR/issue-50814-2.rs:22:5
+   |
+LL |     const BAR: usize = [5, 6, 7][T::BOO]; //~ ERROR any use of this value will cause an error
+   |     ^^^^^^^^^^^^^^^^^^^-----------------^
+   |                        |
+   |                        index out of bounds: the len is 3 but the index is 42
    |
-LL |     const BAR: usize = [5, 6, 7][T::BOO];
-   |                        ----------------- index out of bounds: the len is 3 but the index is 42
-...
-LL |     &<A<T> as Foo<T>>::BAR //~ ERROR erroneous constant used
-   |     ^^^^^^^^^^^^^^^^^^^^^^
+   = note: #[deny(const_err)] on by default
 
-error[E0080]: erroneous constant used
+error[E0080]: evaluation of constant expression failed
   --> $DIR/issue-50814-2.rs:26:5
    |
-LL |     &<A<T> as Foo<T>>::BAR //~ ERROR erroneous constant used
+LL |     &<A<T> as Foo<T>>::BAR //~ ERROR E0080
    |     ^---------------------
    |      |
    |      referenced constant has errors
index 8f2752453b52eb176980bc846f46240f17d4a558..3c7f182644942834ffb35310c62224c2549a5997 100644 (file)
@@ -20,12 +20,11 @@ impl Unsigned for U8 {
 struct Sum<A,B>(A,B);
 
 impl<A: Unsigned, B: Unsigned> Unsigned for Sum<A,B> {
-    const MAX: u8 = A::MAX + B::MAX;
+    const MAX: u8 = A::MAX + B::MAX; //~ ERROR any use of this value will cause an error
 }
 
 fn foo<T>(_: T) -> &'static u8 {
-    &Sum::<U8,U8>::MAX //~ ERROR erroneous constant used
-//~| ERROR E0080
+    &Sum::<U8,U8>::MAX //~ ERROR E0080
 }
 
 fn main() {
index 16160207c573ba20d39f923db33cf0d30d687d6d..ebd0e34ab7e5f015c37dce1db11e385f362ca58a 100644 (file)
@@ -1,16 +1,17 @@
-error[E0080]: referenced constant has errors
-  --> $DIR/issue-50814.rs:27:5
+error: any use of this value will cause an error
+  --> $DIR/issue-50814.rs:23:5
+   |
+LL |     const MAX: u8 = A::MAX + B::MAX; //~ ERROR any use of this value will cause an error
+   |     ^^^^^^^^^^^^^^^^---------------^
+   |                     |
+   |                     attempt to add with overflow
    |
-LL |     const MAX: u8 = A::MAX + B::MAX;
-   |                     --------------- attempt to add with overflow
-...
-LL |     &Sum::<U8,U8>::MAX //~ ERROR erroneous constant used
-   |     ^^^^^^^^^^^^^^^^^^
+   = note: #[deny(const_err)] on by default
 
-error[E0080]: erroneous constant used
+error[E0080]: evaluation of constant expression failed
   --> $DIR/issue-50814.rs:27:5
    |
-LL |     &Sum::<U8,U8>::MAX //~ ERROR erroneous constant used
+LL |     &Sum::<U8,U8>::MAX //~ ERROR E0080
    |     ^-----------------
    |      |
    |      referenced constant has errors
diff --git a/src/test/ui/consts/const-eval/issue-52443.stderr b/src/test/ui/consts/const-eval/issue-52443.stderr
new file mode 100644 (file)
index 0000000..807a70d
--- /dev/null
@@ -0,0 +1,49 @@
+error[E0308]: mismatched types
+  --> $DIR/issue-52443.rs:12:10
+   |
+LL |     [(); & { loop { continue } } ]; //~ ERROR mismatched types
+   |          ^^^^^^^^^^^^^^^^^^^^^^^
+   |          |
+   |          expected usize, found reference
+   |          help: consider removing the borrow: `{ loop { continue } }`
+   |
+   = note: expected type `usize`
+              found type `&_`
+
+error[E0308]: mismatched types
+  --> $DIR/issue-52443.rs:13:17
+   |
+LL |     [(); loop { break }]; //~ ERROR mismatched types
+   |                 ^^^^^ expected (), found usize
+   |
+   = note: expected type `()`
+              found type `usize`
+
+error[E0019]: constant contains unimplemented expression type
+  --> $DIR/issue-52443.rs:14:11
+   |
+LL |     [(); {while true {break}; 0}]; //~ ERROR constant contains unimplemented expression type
+   |           ^^^^^^^^^^^^^^^^^^
+
+error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants
+  --> $DIR/issue-52443.rs:15:21
+   |
+LL |     [(); { for _ in 0usize.. {}; 0}]; //~ ERROR calls in constants are limited to constant functions
+   |                     ^^^^^^^^
+
+error[E0019]: constant contains unimplemented expression type
+  --> $DIR/issue-52443.rs:15:21
+   |
+LL |     [(); { for _ in 0usize.. {}; 0}]; //~ ERROR calls in constants are limited to constant functions
+   |                     ^^^^^^^^
+
+error[E0080]: evaluation of constant value failed
+  --> $DIR/issue-52443.rs:15:21
+   |
+LL |     [(); { for _ in 0usize.. {}; 0}]; //~ ERROR calls in constants are limited to constant functions
+   |                     ^^^^^^^^ calling non-const fn `<I as std::iter::IntoIterator><std::ops::RangeFrom<usize>>::into_iter`
+
+error: aborting due to 6 previous errors
+
+Some errors occurred: E0015, E0019, E0080, E0308.
+For more information about an error, try `rustc --explain E0015`.
index 81fcd23fb786da02e579e1e3e30669941b98021b..1a3164b0b03f60c7175173d93e8cf1a8d0aeb37d 100644 (file)
@@ -12,10 +12,11 @@ fn main() {
     // Make sure match uses the usual pointer comparison code path -- i.e., it should complain
     // that pointer comparison is disallowed, not that parts of a pointer are accessed as raw
     // bytes.
-    let _: [u8; 0] = [4; { //~ ERROR could not evaluate repeat length
+    let _: [u8; 0] = [4; {
         match &1 as *const i32 as usize { //~ ERROR casting pointers to integers in constants
             0 => 42, //~ ERROR constant contains unimplemented expression type
             //~^ NOTE "pointer arithmetic or comparison" needs an rfc before being allowed
+            //~| ERROR evaluation of constant value failed
             n => n,
         }
     }];
index 26577948faefa90a881dc331bd2de49984b1870b..86812b6c493a1e5fec5c274aea48f5f29436d44a 100644 (file)
@@ -12,19 +12,11 @@ error[E0019]: constant contains unimplemented expression type
 LL |             0 => 42, //~ ERROR constant contains unimplemented expression type
    |             ^
 
-error[E0080]: could not evaluate repeat length
-  --> $DIR/match-test-ptr-null.rs:15:26
+error[E0080]: evaluation of constant value failed
+  --> $DIR/match-test-ptr-null.rs:17:13
    |
-LL |       let _: [u8; 0] = [4; { //~ ERROR could not evaluate repeat length
-   |  __________________________^
-LL | |         match &1 as *const i32 as usize { //~ ERROR casting pointers to integers in constants
-LL | |             0 => 42, //~ ERROR constant contains unimplemented expression type
-   | |             - "pointer arithmetic or comparison" needs an rfc before being allowed inside constants
-LL | |             //~^ NOTE "pointer arithmetic or comparison" needs an rfc before being allowed
-LL | |             n => n,
-LL | |         }
-LL | |     }];
-   | |_____^
+LL |             0 => 42, //~ ERROR constant contains unimplemented expression type
+   |             ^ "pointer arithmetic or comparison" needs an rfc before being allowed inside constants
 
 error: aborting due to 3 previous errors
 
index 9b03ddd189168bdc09fbd6899a6e8eeee2acd240..aa6cd888018f4d06874bddd86035e95c258f176f 100644 (file)
@@ -10,7 +10,7 @@
 
 #![feature(const_fn, const_fn_union)]
 
-#![deny(const_err)]
+#![allow(const_err)]
 
 union Bar {
     a: &'static u8,
diff --git a/src/test/ui/consts/const-eval/promoted_const_fn_fail_deny_const_err.rs b/src/test/ui/consts/const-eval/promoted_const_fn_fail_deny_const_err.rs
new file mode 100644 (file)
index 0000000..9f19e68
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![feature(const_fn, const_fn_union)]
+
+#![deny(const_err)]
+
+union Bar {
+    a: &'static u8,
+    b: usize,
+}
+
+const fn bar() -> u8 {
+    unsafe {
+        // this will error as long as this test
+        // is run on a system whose pointers need more
+        // than 8 bits
+        Bar { a: &42 }.b as u8
+    }
+}
+
+fn main() {
+    // FIXME(oli-obk): this should panic at runtime
+    // this will actually compile, but then
+    // abort at runtime (not panic, hard abort).
+    let x: &'static u8 = &(bar() + 1);
+    let y = *x;
+    unreachable!();
+}
diff --git a/src/test/ui/consts/const-eval/promoted_const_fn_fail_deny_const_err.stderr b/src/test/ui/consts/const-eval/promoted_const_fn_fail_deny_const_err.stderr
new file mode 100644 (file)
index 0000000..3eeacbf
--- /dev/null
@@ -0,0 +1,19 @@
+error: reaching this expression at runtime will panic or abort
+  --> $DIR/promoted_const_fn_fail_deny_const_err.rs:33:26
+   |
+LL |         Bar { a: &42 }.b as u8
+   |         ---------------------- a raw memory access tried to access part of a pointer value as raw bytes
+...
+LL |     let x: &'static u8 = &(bar() + 1);
+   |                          ^^-----^^^^^
+   |                            |
+   |                            inside call to `bar`
+   |
+note: lint level defined here
+  --> $DIR/promoted_const_fn_fail_deny_const_err.rs:13:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+
+error: aborting due to previous error
+
index 85b5696be947cf2097f546f22cc790387da1737f..26499fcb9b5551a83563b6e3d671be5fed869705 100644 (file)
@@ -46,3 +46,15 @@ warning: this expression will panic at runtime
 LL |     let _x = 1/(false as u32);
    |              ^^^^^^^^^^^^^^^^ attempt to divide by zero
 
+warning: reaching this expression at runtime will panic or abort
+  --> $DIR/promoted_errors.rs:24:20
+   |
+LL |     println!("{}", 1/(false as u32));
+   |                    ^^^^^^^^^^^^^^^^ attempt to divide by zero
+
+warning: reaching this expression at runtime will panic or abort
+  --> $DIR/promoted_errors.rs:19:20
+   |
+LL |     println!("{}", 1/(1-1));
+   |                    ^^^^^^^ attempt to divide by zero
+
index b7cfa949bac957f76432f4be129acd12838f1bad..48c172b5e31646ebc00fcc371714b3b3abc0acda 100644 (file)
@@ -14,7 +14,7 @@
 #![crate_type = "lib"]
 
 pub const Z: u32 = 0 - 1;
-//~^ WARN this constant cannot be used
+//~^ WARN any use of this value will cause an error
 
 pub type Foo = [i32; 0 - 1];
 //~^ WARN attempt to subtract with overflow
index fa3a79a5f1790b09de082fbcb3e3b21d5c8875dc..2194180c2efdf03ddb3f18a69921db7325d6b238 100644 (file)
@@ -1,4 +1,4 @@
-warning: this constant cannot be used
+warning: any use of this value will cause an error
   --> $DIR/pub_const_err.rs:16:1
    |
 LL | pub const Z: u32 = 0 - 1;
@@ -12,15 +12,3 @@ note: lint level defined here
 LL | #![warn(const_err)]
    |         ^^^^^^^^^
 
-warning: attempt to subtract with overflow
-  --> $DIR/pub_const_err.rs:19:22
-   |
-LL | pub type Foo = [i32; 0 - 1];
-   |                      ^^^^^
-
-warning: this array length cannot be used
-  --> $DIR/pub_const_err.rs:19:22
-   |
-LL | pub type Foo = [i32; 0 - 1];
-   |                      ^^^^^ attempt to subtract with overflow
-
index bafa5b2f4da12ffa0efd556ac84d7bff591170ef..849d40cf107b7a4a100a86f72527fab8e8e291b7 100644 (file)
@@ -12,7 +12,7 @@
 #![warn(const_err)]
 
 pub const Z: u32 = 0 - 1;
-//~^ WARN this constant cannot be used
+//~^ WARN any use of this value will cause an error
 
 pub type Foo = [i32; 0 - 1];
 //~^ WARN attempt to subtract with overflow
index 73229c60d14dbe45a07d7d2be07afc3b25ac6ed8..60834e006503c9f1a09f8f3336f15183acd1c0c2 100644 (file)
@@ -1,4 +1,4 @@
-warning: this constant cannot be used
+warning: any use of this value will cause an error
   --> $DIR/pub_const_err_bin.rs:14:1
    |
 LL | pub const Z: u32 = 0 - 1;
@@ -12,15 +12,3 @@ note: lint level defined here
 LL | #![warn(const_err)]
    |         ^^^^^^^^^
 
-warning: attempt to subtract with overflow
-  --> $DIR/pub_const_err_bin.rs:17:22
-   |
-LL | pub type Foo = [i32; 0 - 1];
-   |                      ^^^^^
-
-warning: this array length cannot be used
-  --> $DIR/pub_const_err_bin.rs:17:22
-   |
-LL | pub type Foo = [i32; 0 - 1];
-   |                      ^^^^^ attempt to subtract with overflow
-
index 00a748249ea0ad067a00782cabe3f5c20cd5e251..f1d30394d380ef87116f514aee668600b7a4b9dc 100644 (file)
@@ -1,4 +1,4 @@
-error[E0080]: could not evaluate enum discriminant
+error[E0080]: evaluation of constant value failed
   --> $DIR/shift_overflow.rs:13:9
    |
 LL |     X = 1 << ((u32::max_value() as u64) + 1), //~ ERROR E0080
index bcb71af54afdb4f03225b147f169f8303795c685..2f7a5dda9ffcbd4d52355a26e530a6e1ccc9a69b 100644 (file)
@@ -20,7 +20,7 @@ union TransmuteEnum {
 
 // A pointer is guaranteed non-null
 const BAD_ENUM: Enum = unsafe { TransmuteEnum { a: &1 }.b };
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR is undefined behavior
 
 // Invalid enum discriminant
 #[repr(usize)]
@@ -33,7 +33,7 @@ union TransmuteEnum2 {
     b: Enum2,
 }
 const BAD_ENUM2 : Enum2 = unsafe { TransmuteEnum2 { a: 0 }.b };
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR is undefined behavior
 
 // Invalid enum field content (mostly to test printing of apths for enum tuple
 // variants and tuples).
@@ -43,7 +43,7 @@ union TransmuteChar {
 }
 // Need to create something which does not clash with enum layout optimizations.
 const BAD_ENUM_CHAR : Option<(char, char)> = Some(('x', unsafe { TransmuteChar { a: !0 }.b }));
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR is undefined behavior
 
 fn main() {
 }
index 243343c94b065b0131dc4b30f4f9ff24916d2cca..4cbaa2f3a906fe9319fe0e72f00469b39db2a2d7 100644 (file)
@@ -1,4 +1,4 @@
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/ub-enum.rs:22:1
    |
 LL | const BAD_ENUM: Enum = unsafe { TransmuteEnum { a: &1 }.b };
@@ -6,7 +6,7 @@ LL | const BAD_ENUM: Enum = unsafe { TransmuteEnum { a: &1 }.b };
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/ub-enum.rs:35:1
    |
 LL | const BAD_ENUM2 : Enum2 = unsafe { TransmuteEnum2 { a: 0 }.b };
@@ -14,7 +14,7 @@ LL | const BAD_ENUM2 : Enum2 = unsafe { TransmuteEnum2 { a: 0 }.b };
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/ub-enum.rs:45:1
    |
 LL | const BAD_ENUM_CHAR : Option<(char, char)> = Some(('x', unsafe { TransmuteChar { a: !0 }.b }));
index 5723f4a4159aa5170a8020efe2404afd09398fd8..40d1f97a807579f5dca19b1528005ad38d50e052 100644 (file)
@@ -34,12 +34,15 @@ const fn read_field2() -> Field2 {
 }
 
 const fn read_field3() -> Field3 {
-    const FIELD3: Field3 = unsafe { UNION.field3 }; //~ ERROR cannot be used
+    const FIELD3: Field3 = unsafe { UNION.field3 }; //~ ERROR any use of this value
+    //~^ ERROR any use of this value
     FIELD3
+    //~^ erroneous constant used
 }
 
 fn main() {
     assert_eq!(read_field1(), FLOAT1_AS_I32);
     assert_eq!(read_field2(), 1.0);
     assert_eq!(read_field3(), unsafe { UNION.field3 });
+    //~^ ERROR evaluation of constant expression failed
 }
index 811450c8cba4757afc3b52765633e357a00aec7c..39320791a3fd0cc2c8655f825049990f5a5ecbc3 100644 (file)
@@ -1,10 +1,36 @@
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/union-const-eval-field.rs:37:5
    |
-LL |     const FIELD3: Field3 = unsafe { UNION.field3 }; //~ ERROR cannot be used
+LL |     const FIELD3: Field3 = unsafe { UNION.field3 }; //~ ERROR any use of this value
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempted to read undefined bytes
    |
    = note: #[deny(const_err)] on by default
 
-error: aborting due to previous error
+error: any use of this value will cause an error
+  --> $DIR/union-const-eval-field.rs:37:5
+   |
+LL |     const FIELD3: Field3 = unsafe { UNION.field3 }; //~ ERROR any use of this value
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempted to read undefined bytes
+
+error[E0080]: erroneous constant used
+  --> $DIR/union-const-eval-field.rs:39:5
+   |
+LL |     FIELD3
+   |     ^^^^^^ referenced constant has errors
+
+error[E0080]: evaluation of constant expression failed
+  --> $DIR/union-const-eval-field.rs:46:5
+   |
+LL |     FIELD3
+   |     ------ referenced constant has errors
+...
+LL |     assert_eq!(read_field3(), unsafe { UNION.field3 });
+   |     ^^^^^^^^^^^-------------^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |                |
+   |                inside call to `read_field3`
+   |
+   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
+
+error: aborting due to 4 previous errors
 
+For more information about this error, try `rustc --explain E0080`.
index 5d50004e5549d112925063af615bf2cb444cca51..5a8ea711d86bec114702038dfe99254819c862e9 100644 (file)
@@ -20,9 +20,9 @@ union DummyUnion {
 
 const UNION: DummyUnion = DummyUnion { field1: 1065353216 };
 
-const FIELD3: Field3 = unsafe { UNION.field3 }; //~ ERROR this constant cannot be used
+const FIELD3: Field3 = unsafe { UNION.field3 }; //~ ERROR will cause an error
 
-const FIELD_PATH: Struct = Struct { //~ ERROR this constant likely exhibits undefined behavior
+const FIELD_PATH: Struct = Struct { //~ ERROR any use of this value will cause an error
     a: 42,
     b: unsafe { UNION.field3 },
 };
@@ -32,7 +32,7 @@ struct Struct {
     b: Field3,
 }
 
-const FIELD_PATH2: Struct2 = Struct2 { //~ ERROR this constant likely exhibits undefined behavior
+const FIELD_PATH2: Struct2 = Struct2 { //~ ERROR it is undefined behavior to use this value
     b: [
         21,
         unsafe { UNION.field3 },
index 4484dd6a14740f12cf06feb11faa1b2361e96e3d..7f5cb731c8eee2a324fb33b33789a0ba05513a47 100644 (file)
@@ -1,15 +1,15 @@
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/union-ice.rs:23:1
    |
-LL | const FIELD3: Field3 = unsafe { UNION.field3 }; //~ ERROR this constant cannot be used
+LL | const FIELD3: Field3 = unsafe { UNION.field3 }; //~ ERROR will cause an error
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempted to read undefined bytes
    |
    = note: #[deny(const_err)] on by default
 
-error[E0080]: this constant likely exhibits undefined behavior
+error: any use of this value will cause an error
   --> $DIR/union-ice.rs:25:1
    |
-LL | / const FIELD_PATH: Struct = Struct { //~ ERROR this constant likely exhibits undefined behavior
+LL | / const FIELD_PATH: Struct = Struct { //~ ERROR any use of this value will cause an error
 LL | |     a: 42,
 LL | |     b: unsafe { UNION.field3 },
 LL | | };
@@ -17,10 +17,10 @@ LL | | };
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/union-ice.rs:35:1
    |
-LL | / const FIELD_PATH2: Struct2 = Struct2 { //~ ERROR this constant likely exhibits undefined behavior
+LL | / const FIELD_PATH2: Struct2 = Struct2 { //~ ERROR it is undefined behavior to use this value
 LL | |     b: [
 LL | |         21,
 LL | |         unsafe { UNION.field3 },
index 0c42d28eb00f49d148cd8fcb5929a932b2e06539..479cee92b94b375258f9060998dda38d97d79676 100644 (file)
@@ -85,55 +85,56 @@ impl Trait for bool {}
 const A: &str = unsafe { SliceTransmute { repr: SliceRepr { ptr: &42, len: 1 } }.str};
 // bad str
 const B: &str = unsafe { SliceTransmute { repr: SliceRepr { ptr: &42, len: 999 } }.str};
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 // bad str
 const C: &str = unsafe { SliceTransmute { bad: BadSliceRepr { ptr: &42, len: &3 } }.str};
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 // bad str in user-defined unsized type
 const C2: &MyStr = unsafe { SliceTransmute { bad: BadSliceRepr { ptr: &42, len: &3 } }.my_str};
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 
 // OK
 const A2: &[u8] = unsafe { SliceTransmute { repr: SliceRepr { ptr: &42, len: 1 } }.slice};
 // bad slice
 const B2: &[u8] = unsafe { SliceTransmute { repr: SliceRepr { ptr: &42, len: 999 } }.slice};
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 // bad slice
 const C3: &[u8] = unsafe { SliceTransmute { bad: BadSliceRepr { ptr: &42, len: &3 } }.slice};
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 
 // bad trait object
 const D: &Trait = unsafe { DynTransmute { repr: DynRepr { ptr: &92, vtable: &3 } }.rust};
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 // bad trait object
 const E: &Trait = unsafe { DynTransmute { repr2: DynRepr2 { ptr: &92, vtable: &3 } }.rust};
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 // bad trait object
 const F: &Trait = unsafe { DynTransmute { bad: BadDynRepr { ptr: &92, vtable: 3 } }.rust};
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 
 // bad data *inside* the trait object
 const G: &Trait = &unsafe { BoolTransmute { val: 3 }.bl };
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
+
 // bad data *inside* the slice
 const H: &[bool] = &[unsafe { BoolTransmute { val: 3 }.bl }];
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 
 // good MySliceBool
 const I1: &MySliceBool = &MySlice(true, [false]);
 // bad: sized field is not okay
 const I2: &MySliceBool = &MySlice(unsafe { BoolTransmute { val: 3 }.bl }, [false]);
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 // bad: unsized part is not okay
 const I3: &MySliceBool = &MySlice(true, [unsafe { BoolTransmute { val: 3 }.bl }]);
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 
 // invalid UTF-8
 const J1: &str = unsafe { SliceTransmute { slice: &[0xFF] }.str };
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 // invalid UTF-8 in user-defined str-like
 const J2: &MyStr = unsafe { SliceTransmute { slice: &[0xFF] }.my_str };
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 
 fn main() {
 }
index c4632ffe30974afccebc505d716d5bcbb5435db7..b61ea9ca6f95b3f482333c03c32da9ab3d2992f2 100644 (file)
@@ -1,4 +1,4 @@
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/union-ub-fat-ptr.rs:87:1
    |
 LL | const B: &str = unsafe { SliceTransmute { repr: SliceRepr { ptr: &42, len: 999 } }.str};
@@ -6,7 +6,7 @@ LL | const B: &str = unsafe { SliceTransmute { repr: SliceRepr { ptr: &42, len:
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/union-ub-fat-ptr.rs:90:1
    |
 LL | const C: &str = unsafe { SliceTransmute { bad: BadSliceRepr { ptr: &42, len: &3 } }.str};
@@ -14,7 +14,7 @@ LL | const C: &str = unsafe { SliceTransmute { bad: BadSliceRepr { ptr: &42, len
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/union-ub-fat-ptr.rs:93:1
    |
 LL | const C2: &MyStr = unsafe { SliceTransmute { bad: BadSliceRepr { ptr: &42, len: &3 } }.my_str};
@@ -22,7 +22,7 @@ LL | const C2: &MyStr = unsafe { SliceTransmute { bad: BadSliceRepr { ptr: &42,
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/union-ub-fat-ptr.rs:99:1
    |
 LL | const B2: &[u8] = unsafe { SliceTransmute { repr: SliceRepr { ptr: &42, len: 999 } }.slice};
@@ -30,7 +30,7 @@ LL | const B2: &[u8] = unsafe { SliceTransmute { repr: SliceRepr { ptr: &42, len
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/union-ub-fat-ptr.rs:102:1
    |
 LL | const C3: &[u8] = unsafe { SliceTransmute { bad: BadSliceRepr { ptr: &42, len: &3 } }.slice};
@@ -38,7 +38,7 @@ LL | const C3: &[u8] = unsafe { SliceTransmute { bad: BadSliceRepr { ptr: &42, l
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/union-ub-fat-ptr.rs:106:1
    |
 LL | const D: &Trait = unsafe { DynTransmute { repr: DynRepr { ptr: &92, vtable: &3 } }.rust};
@@ -46,7 +46,7 @@ LL | const D: &Trait = unsafe { DynTransmute { repr: DynRepr { ptr: &92, vtable:
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/union-ub-fat-ptr.rs:109:1
    |
 LL | const E: &Trait = unsafe { DynTransmute { repr2: DynRepr2 { ptr: &92, vtable: &3 } }.rust};
@@ -54,7 +54,7 @@ LL | const E: &Trait = unsafe { DynTransmute { repr2: DynRepr2 { ptr: &92, vtabl
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/union-ub-fat-ptr.rs:112:1
    |
 LL | const F: &Trait = unsafe { DynTransmute { bad: BadDynRepr { ptr: &92, vtable: 3 } }.rust};
@@ -62,7 +62,7 @@ LL | const F: &Trait = unsafe { DynTransmute { bad: BadDynRepr { ptr: &92, vtabl
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/union-ub-fat-ptr.rs:116:1
    |
 LL | const G: &Trait = &unsafe { BoolTransmute { val: 3 }.bl };
@@ -70,40 +70,40 @@ LL | const G: &Trait = &unsafe { BoolTransmute { val: 3 }.bl };
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
-  --> $DIR/union-ub-fat-ptr.rs:119:1
+error[E0080]: it is undefined behavior to use this value
+  --> $DIR/union-ub-fat-ptr.rs:120:1
    |
 LL | const H: &[bool] = &[unsafe { BoolTransmute { val: 3 }.bl }];
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at .<deref>[0], but expected something in the range 0..=1
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
-  --> $DIR/union-ub-fat-ptr.rs:125:1
+error[E0080]: it is undefined behavior to use this value
+  --> $DIR/union-ub-fat-ptr.rs:126:1
    |
 LL | const I2: &MySliceBool = &MySlice(unsafe { BoolTransmute { val: 3 }.bl }, [false]);
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at .<deref>.0, but expected something in the range 0..=1
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
-  --> $DIR/union-ub-fat-ptr.rs:128:1
+error[E0080]: it is undefined behavior to use this value
+  --> $DIR/union-ub-fat-ptr.rs:129:1
    |
 LL | const I3: &MySliceBool = &MySlice(true, [unsafe { BoolTransmute { val: 3 }.bl }]);
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at .<deref>.1[0], but expected something in the range 0..=1
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
-  --> $DIR/union-ub-fat-ptr.rs:132:1
+error[E0080]: it is undefined behavior to use this value
+  --> $DIR/union-ub-fat-ptr.rs:133:1
    |
 LL | const J1: &str = unsafe { SliceTransmute { slice: &[0xFF] }.str };
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered uninitialized or non-UTF-8 data in str at .<deref>
    |
    = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior
 
-error[E0080]: this constant likely exhibits undefined behavior
-  --> $DIR/union-ub-fat-ptr.rs:135:1
+error[E0080]: it is undefined behavior to use this value
+  --> $DIR/union-ub-fat-ptr.rs:136:1
    |
 LL | const J2: &MyStr = unsafe { SliceTransmute { slice: &[0xFF] }.my_str };
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered uninitialized or non-UTF-8 data in str at .<deref>.0
index 86b3bdaa6b79ec82d41cb0e9a8b9208501dd6b5b..008f1f2364866b7d2bbca736190c0fad24c9a17d 100644 (file)
@@ -34,7 +34,7 @@ union Bar {
 
 // the value is not valid for bools
 const BAD_BOOL: bool = unsafe { DummyUnion { u8: 42 }.bool};
-//~^ ERROR this constant likely exhibits undefined behavior
+//~^ ERROR it is undefined behavior to use this value
 
 // The value is not valid for any union variant, but that's fine
 // unions are just a convenient way to transmute bits around
index 2a04dae337b271616a5662179ee57f1d4aa39cda..bb916ddbbcfd797eda1e48984b7786172949fd19 100644 (file)
@@ -1,4 +1,4 @@
-error[E0080]: this constant likely exhibits undefined behavior
+error[E0080]: it is undefined behavior to use this value
   --> $DIR/union-ub.rs:36:1
    |
 LL | const BAD_BOOL: bool = unsafe { DummyUnion { u8: 42 }.bool};
diff --git a/src/test/ui/consts/const-fn-error.stderr b/src/test/ui/consts/const-fn-error.stderr
new file mode 100644 (file)
index 0000000..a7b757f
--- /dev/null
@@ -0,0 +1,41 @@
+error[E0658]: let bindings in constant functions are unstable (see issue #48821)
+  --> $DIR/const-fn-error.rs:16:19
+   |
+LL |     let mut sum = 0;
+   |                   ^
+   |
+   = help: add #![feature(const_let)] to the crate attributes to enable
+
+error[E0658]: statements in constant functions are unstable (see issue #48821)
+  --> $DIR/const-fn-error.rs:16:19
+   |
+LL |     let mut sum = 0;
+   |                   ^
+   |
+   = help: add #![feature(const_let)] to the crate attributes to enable
+
+error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
+  --> $DIR/const-fn-error.rs:19:14
+   |
+LL |     for i in 0..x { //~ ERROR E0080
+   |              ^^^^
+
+error[E0019]: constant function contains unimplemented expression type
+  --> $DIR/const-fn-error.rs:19:14
+   |
+LL |     for i in 0..x { //~ ERROR E0080
+   |              ^^^^
+
+error[E0080]: evaluation of constant value failed
+  --> $DIR/const-fn-error.rs:19:14
+   |
+LL |     for i in 0..x { //~ ERROR E0080
+   |              ^^^^ calling non-const fn `<I as std::iter::IntoIterator><std::ops::Range<usize>>::into_iter`
+...
+LL |     let a : [i32; f(X)];
+   |                   ---- inside call to `f`
+
+error: aborting due to 5 previous errors
+
+Some errors occurred: E0015, E0019, E0080, E0658.
+For more information about an error, try `rustc --explain E0015`.
index 29bc665a22e7bbe5ed3c4b071ae847d2a3719f5e..5f0829eb35874c27143d530c5a2b8bd9df84d193 100644 (file)
@@ -16,6 +16,7 @@
 //~| ERROR mismatched types
 //~| expected usize, found bool
 const ARR: [i32; X] = [99; 34];
+//~^ ERROR evaluation of constant value failed
 
 const X1: usize = 42 || 39;
 //~^ ERROR mismatched types
@@ -25,6 +26,7 @@
 //~| ERROR mismatched types
 //~| expected usize, found bool
 const ARR1: [i32; X1] = [99; 47];
+//~^ ERROR evaluation of constant value failed
 
 const X2: usize = -42 || -39;
 //~^ ERROR mismatched types
@@ -34,6 +36,7 @@
 //~| ERROR mismatched types
 //~| expected usize, found bool
 const ARR2: [i32; X2] = [99; 18446744073709551607];
+//~^ ERROR evaluation of constant value failed
 
 const X3: usize = -42 && -39;
 //~^ ERROR mismatched types
 //~| ERROR mismatched types
 //~| expected usize, found bool
 const ARR3: [i32; X3] = [99; 6];
+//~^ ERROR evaluation of constant value failed
 
 const Y: usize = 42.0 == 42.0;
 //~^ ERROR mismatched types
 //~| expected usize, found bool
 const ARRR: [i32; Y] = [99; 1];
+//~^ ERROR evaluation of constant value failed
 
 const Y1: usize = 42.0 >= 42.0;
 //~^ ERROR mismatched types
 //~| expected usize, found bool
 const ARRR1: [i32; Y1] = [99; 1];
+//~^ ERROR evaluation of constant value failed
 
 const Y2: usize = 42.0 <= 42.0;
 //~^ ERROR mismatched types
 //~| expected usize, found bool
 const ARRR2: [i32; Y2] = [99; 1];
+//~^ ERROR evaluation of constant value failed
 
 const Y3: usize = 42.0 > 42.0;
 //~^ ERROR mismatched types
 //~| expected usize, found bool
 const ARRR3: [i32; Y3] = [99; 0];
+//~^ ERROR evaluation of constant value failed
 
 const Y4: usize = 42.0 < 42.0;
 //~^ ERROR mismatched types
 //~| expected usize, found bool
 const ARRR4: [i32; Y4] = [99; 0];
+//~^ ERROR evaluation of constant value failed
 
 const Y5: usize = 42.0 != 42.0;
 //~^ ERROR mismatched types
 //~| expected usize, found bool
 const ARRR5: [i32; Y5] = [99; 0];
+//~^ ERROR evaluation of constant value failed
 
 fn main() {
     let _ = ARR;
index 8075a3f0863b681f4d48dbcbfd239d5cbed8c059..1bcb3ea719d1aa6068bbcb6f8e8714efe94874c5 100644 (file)
@@ -22,8 +22,14 @@ error[E0308]: mismatched types
 LL | const X: usize = 42 && 39;
    |                  ^^^^^^^^ expected usize, found bool
 
+error[E0080]: evaluation of constant value failed
+  --> $DIR/const-integer-bool-ops.rs:18:18
+   |
+LL | const ARR: [i32; X] = [99; 34];
+   |                  ^ referenced constant has errors
+
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:20:19
+  --> $DIR/const-integer-bool-ops.rs:21:19
    |
 LL | const X1: usize = 42 || 39;
    |                   ^^ expected bool, found integral variable
@@ -32,7 +38,7 @@ LL | const X1: usize = 42 || 39;
               found type `{integer}`
 
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:20:25
+  --> $DIR/const-integer-bool-ops.rs:21:25
    |
 LL | const X1: usize = 42 || 39;
    |                         ^^ expected bool, found integral variable
@@ -41,13 +47,19 @@ LL | const X1: usize = 42 || 39;
               found type `{integer}`
 
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:20:19
+  --> $DIR/const-integer-bool-ops.rs:21:19
    |
 LL | const X1: usize = 42 || 39;
    |                   ^^^^^^^^ expected usize, found bool
 
+error[E0080]: evaluation of constant value failed
+  --> $DIR/const-integer-bool-ops.rs:28:19
+   |
+LL | const ARR1: [i32; X1] = [99; 47];
+   |                   ^^ referenced constant has errors
+
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:29:19
+  --> $DIR/const-integer-bool-ops.rs:31:19
    |
 LL | const X2: usize = -42 || -39;
    |                   ^^^ expected bool, found integral variable
@@ -56,7 +68,7 @@ LL | const X2: usize = -42 || -39;
               found type `{integer}`
 
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:29:26
+  --> $DIR/const-integer-bool-ops.rs:31:26
    |
 LL | const X2: usize = -42 || -39;
    |                          ^^^ expected bool, found integral variable
@@ -65,14 +77,20 @@ LL | const X2: usize = -42 || -39;
               found type `{integer}`
 
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:29:19
+  --> $DIR/const-integer-bool-ops.rs:31:19
    |
 LL | const X2: usize = -42 || -39;
    |                   ^^^^^^^^^^ expected usize, found bool
 
-error[E0308]: mismatched types
+error[E0080]: evaluation of constant value failed
   --> $DIR/const-integer-bool-ops.rs:38:19
    |
+LL | const ARR2: [i32; X2] = [99; 18446744073709551607];
+   |                   ^^ referenced constant has errors
+
+error[E0308]: mismatched types
+  --> $DIR/const-integer-bool-ops.rs:41:19
+   |
 LL | const X3: usize = -42 && -39;
    |                   ^^^ expected bool, found integral variable
    |
@@ -80,7 +98,7 @@ LL | const X3: usize = -42 && -39;
               found type `{integer}`
 
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:38:26
+  --> $DIR/const-integer-bool-ops.rs:41:26
    |
 LL | const X3: usize = -42 && -39;
    |                          ^^^ expected bool, found integral variable
@@ -89,47 +107,90 @@ LL | const X3: usize = -42 && -39;
               found type `{integer}`
 
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:38:19
+  --> $DIR/const-integer-bool-ops.rs:41:19
    |
 LL | const X3: usize = -42 && -39;
    |                   ^^^^^^^^^^ expected usize, found bool
 
+error[E0080]: evaluation of constant value failed
+  --> $DIR/const-integer-bool-ops.rs:48:19
+   |
+LL | const ARR3: [i32; X3] = [99; 6];
+   |                   ^^ referenced constant has errors
+
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:47:18
+  --> $DIR/const-integer-bool-ops.rs:51:18
    |
 LL | const Y: usize = 42.0 == 42.0;
    |                  ^^^^^^^^^^^^ expected usize, found bool
 
+error[E0080]: evaluation of constant value failed
+  --> $DIR/const-integer-bool-ops.rs:54:19
+   |
+LL | const ARRR: [i32; Y] = [99; 1];
+   |                   ^ referenced constant has errors
+
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:52:19
+  --> $DIR/const-integer-bool-ops.rs:57:19
    |
 LL | const Y1: usize = 42.0 >= 42.0;
    |                   ^^^^^^^^^^^^ expected usize, found bool
 
+error[E0080]: evaluation of constant value failed
+  --> $DIR/const-integer-bool-ops.rs:60:20
+   |
+LL | const ARRR1: [i32; Y1] = [99; 1];
+   |                    ^^ referenced constant has errors
+
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:57:19
+  --> $DIR/const-integer-bool-ops.rs:63:19
    |
 LL | const Y2: usize = 42.0 <= 42.0;
    |                   ^^^^^^^^^^^^ expected usize, found bool
 
+error[E0080]: evaluation of constant value failed
+  --> $DIR/const-integer-bool-ops.rs:66:20
+   |
+LL | const ARRR2: [i32; Y2] = [99; 1];
+   |                    ^^ referenced constant has errors
+
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:62:19
+  --> $DIR/const-integer-bool-ops.rs:69:19
    |
 LL | const Y3: usize = 42.0 > 42.0;
    |                   ^^^^^^^^^^^ expected usize, found bool
 
+error[E0080]: evaluation of constant value failed
+  --> $DIR/const-integer-bool-ops.rs:72:20
+   |
+LL | const ARRR3: [i32; Y3] = [99; 0];
+   |                    ^^ referenced constant has errors
+
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:67:19
+  --> $DIR/const-integer-bool-ops.rs:75:19
    |
 LL | const Y4: usize = 42.0 < 42.0;
    |                   ^^^^^^^^^^^ expected usize, found bool
 
+error[E0080]: evaluation of constant value failed
+  --> $DIR/const-integer-bool-ops.rs:78:20
+   |
+LL | const ARRR4: [i32; Y4] = [99; 0];
+   |                    ^^ referenced constant has errors
+
 error[E0308]: mismatched types
-  --> $DIR/const-integer-bool-ops.rs:72:19
+  --> $DIR/const-integer-bool-ops.rs:81:19
    |
 LL | const Y5: usize = 42.0 != 42.0;
    |                   ^^^^^^^^^^^^ expected usize, found bool
 
-error: aborting due to 18 previous errors
+error[E0080]: evaluation of constant value failed
+  --> $DIR/const-integer-bool-ops.rs:84:20
+   |
+LL | const ARRR5: [i32; Y5] = [99; 0];
+   |                    ^^ referenced constant has errors
+
+error: aborting due to 28 previous errors
 
-For more information about this error, try `rustc --explain E0308`.
+Some errors occurred: E0080, E0308.
+For more information about an error, try `rustc --explain E0080`.
index 8db1411005e5772daa8548a395adc18fd16205f2..68452082ef333b01e499baaed78e4d8dc89ada03 100644 (file)
 const ONE: usize = 1;
 const TWO: usize = 2;
 const LEN: usize = ONE - TWO;
+//~^ ERROR any use of this value will cause an error
 
 fn main() {
     let a: [i8; LEN] = unimplemented!();
 //~^ ERROR E0080
-//~| ERROR E0080
-//~| ERROR E0080
-//~| ERROR E0080
 }
index cf97a0dc5557866a674705f84fffc56b41ce1dac..da39fa2e6f22c8525d03091c321ad51f2fd7c3e0 100644 (file)
@@ -1,35 +1,19 @@
-error[E0080]: referenced constant has errors
-  --> $DIR/const-len-underflow-separate-spans.rs:20:17
+error: any use of this value will cause an error
+  --> $DIR/const-len-underflow-separate-spans.rs:17:1
    |
 LL | const LEN: usize = ONE - TWO;
-   |                    --------- attempt to subtract with overflow
-...
-LL |     let a: [i8; LEN] = unimplemented!();
-   |                 ^^^
-
-error[E0080]: could not evaluate constant
-  --> $DIR/const-len-underflow-separate-spans.rs:20:17
+   | ^^^^^^^^^^^^^^^^^^^---------^
+   |                    |
+   |                    attempt to subtract with overflow
    |
-LL |     let a: [i8; LEN] = unimplemented!();
-   |                 ^^^ referenced constant has errors
+   = note: #[deny(const_err)] on by default
 
-error[E0080]: referenced constant has errors
-  --> $DIR/const-len-underflow-separate-spans.rs:20:12
+error[E0080]: evaluation of constant value failed
+  --> $DIR/const-len-underflow-separate-spans.rs:21:17
    |
-LL | const LEN: usize = ONE - TWO;
-   |                    --------- attempt to subtract with overflow
-...
 LL |     let a: [i8; LEN] = unimplemented!();
-   |            ^^^^^^^^^
-
-error[E0080]: could not evaluate constant expression
-  --> $DIR/const-len-underflow-separate-spans.rs:20:12
-   |
-LL |     let a: [i8; LEN] = unimplemented!();
-   |            ^^^^^---^
-   |                 |
-   |                 referenced constant has errors
+   |                 ^^^ referenced constant has errors
 
-error: aborting due to 4 previous errors
+error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
index 054c272a3d321f6f5e740d8baf06711c1e063a37..10180f3648998efccb007823b031a7f65bbe21ea 100644 (file)
@@ -16,6 +16,6 @@
 
 fn main() {
     let a: [i8; ONE - TWO] = unimplemented!();
-    //~^ ERROR could not evaluate constant expression
+    //~^ ERROR evaluation of constant value failed
     //~| attempt to subtract with overflow
 }
index 860716c1f3855167af2bcc392a430eab69669d4a..3fca7ecb19a52c10a52244a034eeebbfe641b68b 100644 (file)
@@ -1,19 +1,9 @@
-error: attempt to subtract with overflow
+error[E0080]: evaluation of constant value failed
   --> $DIR/const-len-underflow-subspans.rs:18:17
    |
 LL |     let a: [i8; ONE - TWO] = unimplemented!();
-   |                 ^^^^^^^^^
-   |
-   = note: #[deny(const_err)] on by default
-
-error[E0080]: could not evaluate constant expression
-  --> $DIR/const-len-underflow-subspans.rs:18:12
-   |
-LL |     let a: [i8; ONE - TWO] = unimplemented!();
-   |            ^^^^^---------^
-   |                 |
-   |                 attempt to subtract with overflow
+   |                 ^^^^^^^^^ attempt to subtract with overflow
 
-error: aborting due to 2 previous errors
+error: aborting due to previous error
 
 For more information about this error, try `rustc --explain E0080`.
index ab8b5792e681d58bb7e6c9af3193f77664c00252..ea5d7c176ffb9dbe06e2af3391a524acf78bbd47 100644 (file)
@@ -1,6 +1,11 @@
 error[E0391]: cycle detected when computing layout of `Foo`
    |
 note: ...which requires normalizing `ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: All }, value: [u8; _] }`...
+note: ...which requires const-evaluating + checking `Foo::bytes::{{constant}}`...
+  --> $DIR/const-size_of-cycle.rs:16:17
+   |
+LL |     bytes: [u8; std::mem::size_of::<Foo>()]
+   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
 note: ...which requires const-evaluating `Foo::bytes::{{constant}}`...
   --> $SRC_DIR/libcore/mem.rs:LL:COL
    |
index 6d51ff30998096abdc88cbee8f975af62ec8000d..b71556735d9f60c7994451ce3b97decde4cfcb40 100644 (file)
 const FOO: &'static[u32] = &[1, 2, 3];
 const BAR: u32 = FOO[5];
 //~^ index out of bounds: the len is 3 but the index is 5
-//~| ERROR this constant cannot be used
+//~| ERROR any use of this value will cause an error
+//~| ERROR any use of this value will cause an error
 
 fn main() {
     let _ = BAR;
+    //~^ ERROR erroneous constant used
 }
index 30260c36ffd3514212a8f100572501012d33c69f..8fd298a18d22cefb827a13ebc359fe65130cabc2 100644 (file)
@@ -1,4 +1,4 @@
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/const-slice-oob.rs:14:1
    |
 LL | const BAR: u32 = FOO[5];
@@ -8,5 +8,20 @@ LL | const BAR: u32 = FOO[5];
    |
    = note: #[deny(const_err)] on by default
 
-error: aborting due to previous error
+error: any use of this value will cause an error
+  --> $DIR/const-slice-oob.rs:14:1
+   |
+LL | const BAR: u32 = FOO[5];
+   | ^^^^^^^^^^^^^^^^^------^
+   |                  |
+   |                  index out of bounds: the len is 3 but the index is 5
+
+error[E0080]: erroneous constant used
+  --> $DIR/const-slice-oob.rs:20:13
+   |
+LL |     let _ = BAR;
+   |             ^^^ referenced constant has errors
+
+error: aborting due to 3 previous errors
 
+For more information about this error, try `rustc --explain E0080`.
index b42c440f87d74e3678dfc6bf79c8d32a5e5ee7d8..e1d5811648185e14a4ba55dc06aa96d34a10cdc7 100644 (file)
@@ -14,6 +14,7 @@
 //~^ ERROR mismatched types
 //~| expected tuple, found usize
 const ARR: [i32; TUP.0] = [];
+//~^ ERROR evaluation of constant value failed
 
 fn main() {
 }
index e92486296561172023a79d923563cea90ce62b14..3018baac5a586ccba805abd951c6ed361d05d2b9 100644 (file)
@@ -7,6 +7,13 @@ LL | const TUP: (usize,) = 5usize << 64;
    = note: expected type `(usize,)`
               found type `usize`
 
-error: aborting due to previous error
+error[E0080]: evaluation of constant value failed
+  --> $DIR/const-tup-index-span.rs:16:18
+   |
+LL | const ARR: [i32; TUP.0] = [];
+   |                  ^^^ referenced constant has errors
+
+error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0308`.
+Some errors occurred: E0080, E0308.
+For more information about an error, try `rustc --explain E0080`.
index 7f3e6eaad9b17963d825d532d470d2a0be4c85bb..2ab15dfedcaaae4ea6147e6afdf26658380e5677 100644 (file)
@@ -12,9 +12,6 @@ enum Enum {
     X = (1 << 500), //~ ERROR E0080
     //~| shift left with overflow
     Y = (1 / 0) //~ ERROR E0080
-    //~| const_err
-    //~| const_err
-    //~| const_err
 }
 
 fn main() {
index a213c2b1b208e5294612026c31b0adcec654f39d..e60c905587de81113e1e17380705e9a165628a06 100644 (file)
@@ -1,37 +1,15 @@
-error: attempt to shift left with overflow
-  --> $DIR/E0080.rs:12:9
-   |
-LL |     X = (1 << 500), //~ ERROR E0080
-   |         ^^^^^^^^^^
-   |
-   = note: #[deny(exceeding_bitshifts)] on by default
-
-error[E0080]: could not evaluate enum discriminant
+error[E0080]: evaluation of constant value failed
   --> $DIR/E0080.rs:12:9
    |
 LL |     X = (1 << 500), //~ ERROR E0080
    |         ^^^^^^^^^^ attempt to shift left with overflow
 
-error: attempt to divide by zero
-  --> $DIR/E0080.rs:14:9
-   |
-LL |     Y = (1 / 0) //~ ERROR E0080
-   |         ^^^^^^^
-   |
-   = note: #[deny(const_err)] on by default
-
-error: this expression will panic at runtime
-  --> $DIR/E0080.rs:14:9
-   |
-LL |     Y = (1 / 0) //~ ERROR E0080
-   |         ^^^^^^^ attempt to divide by zero
-
-error[E0080]: could not evaluate enum discriminant
+error[E0080]: evaluation of constant value failed
   --> $DIR/E0080.rs:14:9
    |
 LL |     Y = (1 / 0) //~ ERROR E0080
    |         ^^^^^^^ attempt to divide by zero
 
-error: aborting due to 5 previous errors
+error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
index 08d20e7850d9440c6f5bd1cb2c266799072c92a9..005f2c366889284ebe84a78a8cb5b9b34146c993 100644 (file)
@@ -13,7 +13,7 @@
 const REG_ADDR: *const u8 = 0x5f3759df as *const u8;
 
 const VALUE: u8 = unsafe { *REG_ADDR };
-//~^ ERROR this constant cannot be used
+//~^ ERROR any use of this value will cause an error
 
 fn main() {
 }
index 7d3c98c8ea80893e76746aa2831b82f136e0cf3a..e868d5a33fa4567b256372eae39fd5251a354d97 100644 (file)
@@ -1,4 +1,4 @@
-error: this constant cannot be used
+error: any use of this value will cause an error
   --> $DIR/E0396-fixed.rs:15:1
    |
 LL | const VALUE: u8 = unsafe { *REG_ADDR };
index ada038114d8d095d0d7e2deb5c3091581be51a0b..f8a87db88b13cca1386f0ac31adf457aa9b80373 100644 (file)
 enum Test {
     DivZero = 1/0,
     //~^ attempt to divide by zero
-    //~| ERROR could not evaluate enum discriminant
-    //~| ERROR this expression will panic at runtime
+    //~| ERROR evaluation of constant value failed
     RemZero = 1%0,
     //~^ attempt to calculate the remainder with a divisor of zero
-    //~| ERROR could not evaluate enum discriminant
-    //~| ERROR this expression will panic at runtime
+    //~| ERROR evaluation of constant value failed
 }
 
 fn main() {}
index f26c48f1a72ae112daac2217e30402fa6624c05e..59c5ec10f6a866e12f6d21b246c61c3c64cc52d8 100644 (file)
@@ -1,41 +1,15 @@
-error: attempt to divide by zero
-  --> $DIR/eval-enum.rs:12:15
-   |
-LL |     DivZero = 1/0,
-   |               ^^^
-   |
-   = note: #[deny(const_err)] on by default
-
-error: this expression will panic at runtime
+error[E0080]: evaluation of constant value failed
   --> $DIR/eval-enum.rs:12:15
    |
 LL |     DivZero = 1/0,
    |               ^^^ attempt to divide by zero
 
-error[E0080]: could not evaluate enum discriminant
-  --> $DIR/eval-enum.rs:12:15
-   |
-LL |     DivZero = 1/0,
-   |               ^^^ attempt to divide by zero
-
-error: attempt to calculate the remainder with a divisor of zero
-  --> $DIR/eval-enum.rs:16:15
-   |
-LL |     RemZero = 1%0,
-   |               ^^^
-
-error: this expression will panic at runtime
-  --> $DIR/eval-enum.rs:16:15
-   |
-LL |     RemZero = 1%0,
-   |               ^^^ attempt to calculate the remainder with a divisor of zero
-
-error[E0080]: could not evaluate enum discriminant
-  --> $DIR/eval-enum.rs:16:15
+error[E0080]: evaluation of constant value failed
+  --> $DIR/eval-enum.rs:15:15
    |
 LL |     RemZero = 1%0,
    |               ^^^ attempt to calculate the remainder with a divisor of zero
 
-error: aborting due to 6 previous errors
+error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
index f99a080a9f07d6079de3c180852bd253da0ea885..ccf67ca3138ffcf3d6f8f3530f837c51d060e199 100644 (file)
@@ -10,8 +10,8 @@
 
 //https://github.com/rust-lang/rust/issues/31364
 
-const fn a() -> usize { b() }
+const fn a() -> usize { b() } //~ ERROR evaluation of constant value failed
 const fn b() -> usize { a() }
-const ARR: [i32; a()] = [5; 6]; //~ ERROR could not evaluate constant expression
+const ARR: [i32; a()] = [5; 6];
 
 fn main(){}
index c77452d9abe20ad0c5c71d47003621287c4d3ebf..82da89f1aa702b7fe808b2a87916005f0b044fcb 100644 (file)
@@ -1,8 +1,8 @@
-error[E0080]: could not evaluate constant expression
-  --> $DIR/infinite-recursion-const-fn.rs:15:12
+error[E0080]: evaluation of constant value failed
+  --> $DIR/infinite-recursion-const-fn.rs:14:25
    |
-LL | const fn a() -> usize { b() }
-   |                         ---
+LL | const fn a() -> usize { b() } //~ ERROR evaluation of constant value failed
+   |                         ^^^
    |                         |
    |                         reached the configured maximum number of stack frames
    |                         inside call to `b`
@@ -58,10 +58,8 @@ LL | const fn b() -> usize { a() }
    |                         inside call to `a`
    |                         inside call to `a`
    |                         inside call to `a`
-LL | const ARR: [i32; a()] = [5; 6]; //~ ERROR could not evaluate constant expression
-   |            ^^^^^^---^
-   |                  |
-   |                  inside call to `a`
+LL | const ARR: [i32; a()] = [5; 6];
+   |                  --- inside call to `a`
 
 error: aborting due to previous error
 
index ca9da096b6c16e2139ccd353b1fdfd4a3fb777c9..d7efcc524948696656fba8f2bc2d01d6dfc79297 100644 (file)
@@ -4,12 +4,24 @@ error[E0015]: calls in constants are limited to constant functions, tuple struct
 LL |     let array: [usize; Dim3::dim()]
    |                        ^^^^^^^^^^^
 
+error[E0080]: evaluation of constant value failed
+  --> $DIR/issue-39559-2.rs:24:24
+   |
+LL |     let array: [usize; Dim3::dim()]
+   |                        ^^^^^^^^^^^ calling non-const fn `<Dim3 as Dim>::dim`
+
 error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants
   --> $DIR/issue-39559-2.rs:26:15
    |
 LL |         = [0; Dim3::dim()];
    |               ^^^^^^^^^^^
 
-error: aborting due to 2 previous errors
+error[E0080]: evaluation of constant value failed
+  --> $DIR/issue-39559-2.rs:27:15
+   |
+LL |         = [0; Dim3::dim()];
+   |               ^^^^^^^^^^^ calling non-const fn `<Dim3 as Dim>::dim`
+
+error: aborting due to 4 previous errors
 
 For more information about this error, try `rustc --explain E0015`.
index 89f11edaec8622d5c6a6212f677c3823bbce6c55..539b8d2aab3da26d2c9689eb071e67543ea1da14 100644 (file)
@@ -15,6 +15,7 @@ enum Foo {
 
 enum Bar {
     A = Foo::A as isize
+    //~^ ERROR evaluation of constant value failed
 }
 
 fn main() {}
index 9e4afb3b28ac195a8856d274ef0cc6362418a148..4f170f0ce3d45c5ae095630d538edcd82666af6b 100644 (file)
@@ -6,6 +6,13 @@ LL |     A = "" + 1
    |
    = note: an implementation of `std::ops::Add` might be missing for `&str`
 
-error: aborting due to previous error
+error[E0080]: evaluation of constant value failed
+  --> $DIR/issue-41394.rs:17:9
+   |
+LL |     A = Foo::A as isize
+   |         ^^^^^^^^^^^^^^^ referenced constant has errors
+
+error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0369`.
+Some errors occurred: E0080, E0369.
+For more information about an error, try `rustc --explain E0080`.
index 2bddc443d5baf8a564f20b6a6879b4184879dc18..2b0eb68549795f529a01f4ded5844285f6801a95 100644 (file)
@@ -12,10 +12,11 @@ fn xyz() -> u8 { 42 }
 
 const NUM: u8 = xyz();
 //~^ ERROR calls in constants are limited to constant functions, tuple structs and tuple variants
+//~| ERROR any use of this value will cause an error
 
 fn main() {
     match 1 {
-        NUM => unimplemented!(),
+        NUM => unimplemented!(), //~ ERROR could not evaluate constant pattern
         _ => unimplemented!(),
     }
 }
index 67a6008cd8ebc9dc80e4a7ae4ef8be48914935cf..aba8351186bd97f07c96220db14a07aaeffef131 100644 (file)
@@ -4,6 +4,22 @@ error[E0015]: calls in constants are limited to constant functions, tuple struct
 LL | const NUM: u8 = xyz();
    |                 ^^^^^
 
-error: aborting due to previous error
+error: any use of this value will cause an error
+  --> $DIR/issue-43105.rs:13:1
+   |
+LL | const NUM: u8 = xyz();
+   | ^^^^^^^^^^^^^^^^-----^
+   |                 |
+   |                 calling non-const fn `xyz`
+   |
+   = note: #[deny(const_err)] on by default
+
+error: could not evaluate constant pattern
+  --> $DIR/issue-43105.rs:19:9
+   |
+LL |         NUM => unimplemented!(), //~ ERROR could not evaluate constant pattern
+   |         ^^^
+
+error: aborting due to 3 previous errors
 
 For more information about this error, try `rustc --explain E0015`.
index ac2072c513ea099e6bcfd29319508bdbbd0e8a64..f20c2c733591bb3c916f277d24b353599fafbde1 100644 (file)
@@ -1,6 +1,11 @@
 error[E0391]: cycle detected when computing layout of `Foo`
    |
 note: ...which requires normalizing `ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: All }, value: [u8; _] }`...
+note: ...which requires const-evaluating + checking `Foo::bytes::{{constant}}`...
+  --> $DIR/issue-44415.rs:19:17
+   |
+LL |     bytes: [u8; unsafe { intrinsics::size_of::<Foo>() }],
+   |                 ^^^^^^
 note: ...which requires const-evaluating `Foo::bytes::{{constant}}`...
   --> $DIR/issue-44415.rs:19:26
    |
index f46a562ce7a182dcedd4ad157a1e4c2c5b017b34..417f8c8848ea3c8d31a76b2a1472e733b98f000a 100644 (file)
@@ -12,4 +12,5 @@ fn main() {
     const N: u32 = 1_000;
     const M: usize = (f64::from(N) * std::f64::LOG10_2) as usize; //~ ERROR cannot find value
     let mut digits = [0u32; M];
+    //~^ ERROR evaluation of constant value failed
 }
index 8337a31ec140b1ddb15cb98e321e6e07cdb01eea..5338f333d21fa55d5ff1ac1e09e0ba31b3736a93 100644 (file)
@@ -10,6 +10,13 @@ LL | use std::f32::consts::LOG10_2;
 LL | use std::f64::consts::LOG10_2;
    |
 
-error: aborting due to previous error
+error[E0080]: evaluation of constant value failed
+  --> $DIR/issue-50599.rs:14:29
+   |
+LL |     let mut digits = [0u32; M];
+   |                             ^ referenced constant has errors
+
+error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0425`.
+Some errors occurred: E0080, E0425.
+For more information about an error, try `rustc --explain E0080`.
index 2ab93bfd685c852aeec45f92700db084eb157a7f..5bd0f90afbcae6e0f3030b39ab9f798c37dbca9d 100644 (file)
@@ -5,6 +5,11 @@ LL | pub static FOO: u32 = FOO;
    |                       ^^^
    |
    = note: ...which again requires const-evaluating `FOO`, completing the cycle
+note: cycle used when const-evaluating + checking `FOO`
+  --> $DIR/recursive-static-definition.rs:11:1
+   |
+LL | pub static FOO: u32 = FOO;
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: aborting due to previous error
 
index db27ae89e69fdbef0f101fad6c4444b1fc09ebee..e479701492657e1f15529efd5d2caf39052cecb2 100644 (file)
@@ -12,4 +12,5 @@ fn main() {
     let v = vec![0];
     const l: usize = v.count(); //~ ERROR can't capture dynamic environment in a fn item
     let s: [u32; l] = v.into_iter().collect();
+    //~^ ERROR evaluation of constant value failed
 }
index 361d28f274fa30f8faa1481fa59ffa28ad5e90f5..361c3c0c3d5d9758089d5c30d94d13bf032cccbb 100644 (file)
@@ -6,6 +6,13 @@ LL |     const l: usize = v.count(); //~ ERROR can't capture dynamic environment
    |
    = help: use the `|| { ... }` closure form instead
 
-error: aborting due to previous error
+error[E0080]: evaluation of constant value failed
+  --> $DIR/type-dependent-def-issue-49241.rs:14:18
+   |
+LL |     let s: [u32; l] = v.into_iter().collect();
+   |                  ^ referenced constant has errors
+
+error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0434`.
+Some errors occurred: E0080, E0434.
+For more information about an error, try `rustc --explain E0080`.