]> git.lizzy.rs Git - rust.git/commitdiff
Change commit_if_ok to probe
authorkadmin <julianknodt@gmail.com>
Sun, 4 Dec 2022 19:58:03 +0000 (19:58 +0000)
committerkadmin <julianknodt@gmail.com>
Mon, 9 Jan 2023 08:41:21 +0000 (08:41 +0000)
compiler/rustc_trait_selection/src/traits/const_evaluatable.rs
src/test/ui/const-generics/generic_const_exprs/const_kind_expr/wf_obligation.rs
src/test/ui/const-generics/generic_const_exprs/const_kind_expr/wf_obligation.stderr
src/test/ui/const-generics/issues/issue-105037.rs [new file with mode: 0644]

index f8efe9bfa9f827b3d98c2544ebb544d73849e339..f449d360c16869426b6ae5dd1e8be74d0fa07e4f 100644 (file)
@@ -173,16 +173,11 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for Visitor<'a, 'tcx> {
         type BreakTy = ();
         fn visit_const(&mut self, c: ty::Const<'tcx>) -> ControlFlow<Self::BreakTy> {
             debug!("is_const_evaluatable: candidate={:?}", c);
-            if let Ok(()) = self.infcx.commit_if_ok(|_| {
+            if self.infcx.probe(|_| {
                 let ocx = ObligationCtxt::new_in_snapshot(self.infcx);
-                if let Ok(()) = ocx.eq(&ObligationCause::dummy(), self.param_env, c.ty(), self.ct.ty())
-                    && let Ok(()) = ocx.eq(&ObligationCause::dummy(), self.param_env, c, self.ct)
+                ocx.eq(&ObligationCause::dummy(), self.param_env, c.ty(), self.ct.ty()).is_ok()
+                    && ocx.eq(&ObligationCause::dummy(), self.param_env, c, self.ct).is_ok()
                     && ocx.select_all_or_error().is_empty()
-                {
-                    Ok(())
-                } else {
-                    Err(())
-                }
             }) {
                 ControlFlow::BREAK
             } else if let ty::ConstKind::Expr(e) = c.kind() {
index 6093fc70b16965c6153db11740f9e3a0efd02386..b96e210808b97f1fb525187ee93b1a1eb5525eac 100644 (file)
@@ -15,8 +15,7 @@ fn ice<const L: usize>()
     [(); (L - 1) + 1 + L]:,
 {
     foo::<_, L>([(); L + 1 + L]);
-    //~^ ERROR: mismatched types
-    //~^^ ERROR: unconstrained generic constant
+    //~^ ERROR: unconstrained generic constant
 }
 
 fn main() {}
index da5194696e657bb032741d6d31fd29cf02847321..09e5e3f862a2092bb3904b6ba3fb40f316621d6a 100644 (file)
@@ -1,12 +1,3 @@
-error[E0308]: mismatched types
-  --> $DIR/wf_obligation.rs:17:17
-   |
-LL |     foo::<_, L>([(); L + 1 + L]);
-   |                 ^^^^^^^^^^^^^^^ expected `N + 1 + M`, found `L + 1 + L`
-   |
-   = note: expected constant `N + 1 + M`
-              found constant `L + 1 + L`
-
 error: unconstrained generic constant
   --> $DIR/wf_obligation.rs:17:22
    |
@@ -15,6 +6,5 @@ LL |     foo::<_, L>([(); L + 1 + L]);
    |
    = help: try adding a `where` bound using this expression: `where [(); L + 1 + L]:`
 
-error: aborting due to 2 previous errors
+error: aborting due to previous error
 
-For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/const-generics/issues/issue-105037.rs b/src/test/ui/const-generics/issues/issue-105037.rs
new file mode 100644 (file)
index 0000000..f7d2394
--- /dev/null
@@ -0,0 +1,35 @@
+// run-pass
+#![feature(generic_const_exprs)]
+#![allow(incomplete_features)]
+#![allow(dead_code)]
+
+trait Table<const D: usize>: Sync {
+    const COLUMNS: usize;
+}
+
+struct Table1<const D: usize>;
+impl<const D: usize> Table<D> for Table1<D> {
+    const COLUMNS: usize = 123;
+}
+
+struct Table2<const D: usize>;
+impl<const D: usize> Table<D> for Table2<D> {
+    const COLUMNS: usize = 456;
+}
+
+fn process_table<T: Table<D>, const D: usize>(_table: T)
+where
+    [(); T::COLUMNS]:,
+{
+}
+
+fn process_all_tables<const D: usize>()
+where
+    [(); Table2::<D>::COLUMNS]:,
+    [(); Table1::<D>::COLUMNS]:,
+{
+    process_table(Table1::<D>);
+    process_table(Table2::<D>);
+}
+
+fn main() {}