Blame SOURCES/rust-pr61085-fix-ICE-with-incorrect-turbofish.patch

db49a4
From 476732995c2f5dc08e20eb8f9f03c628a48f5f41 Mon Sep 17 00:00:00 2001
db49a4
From: Oliver Scherer <github35764891676564198441@oli-obk.de>
db49a4
Date: Thu, 23 May 2019 17:05:48 +0200
db49a4
Subject: [PATCH 1/3] WIP
db49a4
db49a4
---
db49a4
 src/librustc_typeck/check/mod.rs | 22 +++++++++++-----------
db49a4
 src/test/run-pass/issue-60989.rs |  4 ++++
db49a4
 2 files changed, 15 insertions(+), 11 deletions(-)
db49a4
 create mode 100644 src/test/run-pass/issue-60989.rs
db49a4
db49a4
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs
db49a4
index 313ed19b945d..088729f12b1e 100644
db49a4
--- a/src/librustc_typeck/check/mod.rs
db49a4
+++ b/src/librustc_typeck/check/mod.rs
db49a4
@@ -5396,17 +5396,6 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
db49a4
 
db49a4
         let tcx = self.tcx;
db49a4
 
db49a4
-        match def {
db49a4
-            Def::Local(nid) | Def::Upvar(nid, ..) => {
db49a4
-                let hid = self.tcx.hir().node_to_hir_id(nid);
db49a4
-                let ty = self.local_ty(span, hid).decl_ty;
db49a4
-                let ty = self.normalize_associated_types_in(span, &ty;;
db49a4
-                self.write_ty(hir_id, ty);
db49a4
-                return (ty, def);
db49a4
-            }
db49a4
-            _ => {}
db49a4
-        }
db49a4
-
db49a4
         let (def, def_id, ty) = self.rewrite_self_ctor(def, span);
db49a4
         let path_segs = AstConv::def_ids_for_path_segments(self, segments, self_ty, def);
db49a4
 
db49a4
@@ -5469,6 +5458,17 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
db49a4
             user_self_ty = None;
db49a4
         }
db49a4
 
db49a4
+        match def {
db49a4
+            Def::Local(nid) | Def::Upvar(nid, ..) => {
db49a4
+                let hid = self.tcx.hir().node_to_hir_id(nid);
db49a4
+                let ty = self.local_ty(span, hid).decl_ty;
db49a4
+                let ty = self.normalize_associated_types_in(span, &ty;;
db49a4
+                self.write_ty(hir_id, ty);
db49a4
+                return (ty, def);
db49a4
+            }
db49a4
+            _ => {}
db49a4
+        }
db49a4
+
db49a4
         // Now we have to compare the types that the user *actually*
db49a4
         // provided against the types that were *expected*. If the user
db49a4
         // did not provide any types, then we want to substitute inference
db49a4
diff --git a/src/test/run-pass/issue-60989.rs b/src/test/run-pass/issue-60989.rs
db49a4
new file mode 100644
db49a4
index 000000000000..efaa74da3baa
db49a4
--- /dev/null
db49a4
+++ b/src/test/run-pass/issue-60989.rs
db49a4
@@ -0,0 +1,4 @@
db49a4
+fn main() {
db49a4
+    let c1 = ();
db49a4
+    c1::<()>;
db49a4
+}
db49a4
-- 
db49a4
2.21.0
db49a4
db49a4
db49a4
From 97f204e6ae43bfe0fed64221d709a194bef728a4 Mon Sep 17 00:00:00 2001
db49a4
From: Oliver Scherer <github35764891676564198441@oli-obk.de>
db49a4
Date: Thu, 23 May 2019 17:21:32 +0200
db49a4
Subject: [PATCH 2/3] Make regression test a compile-fail test
db49a4
db49a4
---
db49a4
 src/test/{run-pass => compile-fail}/issue-60989.rs | 0
db49a4
 1 file changed, 0 insertions(+), 0 deletions(-)
db49a4
 rename src/test/{run-pass => compile-fail}/issue-60989.rs (100%)
db49a4
db49a4
diff --git a/src/test/run-pass/issue-60989.rs b/src/test/compile-fail/issue-60989.rs
db49a4
similarity index 100%
db49a4
rename from src/test/run-pass/issue-60989.rs
db49a4
rename to src/test/compile-fail/issue-60989.rs
db49a4
-- 
db49a4
2.21.0
db49a4
db49a4
db49a4
From 6e81f8205a6d47648d086d26e96bf05e962e3715 Mon Sep 17 00:00:00 2001
db49a4
From: Eduard-Mihai Burtescu <edy.burt@gmail.com>
db49a4
Date: Thu, 23 May 2019 19:23:00 +0300
db49a4
Subject: [PATCH 3/3] rustc_typeck: don't produce a `DefId` or `Ty` from
db49a4
 `rewrite_self_ctor`, only a `Def`.
db49a4
db49a4
---
db49a4
 src/librustc_typeck/check/mod.rs     | 30 ++++++++++++++++++----------
db49a4
 src/test/compile-fail/issue-60989.rs |  4 ----
db49a4
 src/test/ui/issue-60989.rs           | 18 +++++++++++++++++
db49a4
 src/test/ui/issue-60989.stderr       | 15 ++++++++++++++
db49a4
 4 files changed, 52 insertions(+), 15 deletions(-)
db49a4
 delete mode 100644 src/test/compile-fail/issue-60989.rs
db49a4
 create mode 100644 src/test/ui/issue-60989.rs
db49a4
 create mode 100644 src/test/ui/issue-60989.stderr
db49a4
db49a4
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs
db49a4
index 088729f12b1e..b6adcdbf35e9 100644
db49a4
--- a/src/librustc_typeck/check/mod.rs
db49a4
+++ b/src/librustc_typeck/check/mod.rs
db49a4
@@ -5330,7 +5330,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
db49a4
     }
db49a4
 
db49a4
     // Rewrite `SelfCtor` to `Ctor`
db49a4
-    pub fn rewrite_self_ctor(&self, def: Def, span: Span) -> (Def, DefId, Ty<'tcx>) {
db49a4
+    pub fn rewrite_self_ctor(&self, def: Def, span: Span) -> Def {
db49a4
         let tcx = self.tcx;
db49a4
         if let Def::SelfCtor(impl_def_id) = def {
db49a4
             let ty = self.impl_self_ty(span, impl_def_id).ty;
db49a4
@@ -5340,8 +5340,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
db49a4
                 Some(adt_def) if adt_def.has_ctor() => {
db49a4
                     let variant = adt_def.non_enum_variant();
db49a4
                     let ctor_def_id = variant.ctor_def_id.unwrap();
db49a4
-                    let def = Def::Ctor(ctor_def_id, CtorOf::Struct, variant.ctor_kind);
db49a4
-                    (def, ctor_def_id, tcx.type_of(ctor_def_id))
db49a4
+                    Def::Ctor(ctor_def_id, CtorOf::Struct, variant.ctor_kind)
db49a4
                 }
db49a4
                 _ => {
db49a4
                     let mut err = tcx.sess.struct_span_err(span,
db49a4
@@ -5364,16 +5363,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
db49a4
                     }
db49a4
                     err.emit();
db49a4
 
db49a4
-                    (def, impl_def_id, tcx.types.err)
db49a4
+                    def
db49a4
                 }
db49a4
             }
db49a4
         } else {
db49a4
-            let def_id = def.def_id();
db49a4
-
db49a4
-            // The things we are substituting into the type should not contain
db49a4
-            // escaping late-bound regions, and nor should the base type scheme.
db49a4
-            let ty = tcx.type_of(def_id);
db49a4
-            (def, def_id, ty)
db49a4
+            def
db49a4
         }
db49a4
     }
db49a4
 
db49a4
@@ -5396,7 +5390,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
db49a4
 
db49a4
         let tcx = self.tcx;
db49a4
 
db49a4
-        let (def, def_id, ty) = self.rewrite_self_ctor(def, span);
db49a4
+        let def = self.rewrite_self_ctor(def, span);
db49a4
         let path_segs = AstConv::def_ids_for_path_segments(self, segments, self_ty, def);
db49a4
 
db49a4
         let mut user_self_ty = None;
db49a4
@@ -5501,6 +5495,20 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
db49a4
             tcx.generics_of(*def_id).has_self
db49a4
         }).unwrap_or(false);
db49a4
 
db49a4
+        let (def_id, ty) = if let Def::SelfCtor(impl_def_id) = def {
db49a4
+            // NOTE(eddyb) an error has already been emitted by `rewrite_self_ctor`,
db49a4
+            // avoid using the wrong type here. This isn't in `rewrite_self_ctor`
db49a4
+            // itself because that runs too early (see #60989).
db49a4
+            (impl_def_id, tcx.types.err)
db49a4
+        } else {
db49a4
+            let def_id = def.def_id();
db49a4
+
db49a4
+            // The things we are substituting into the type should not contain
db49a4
+            // escaping late-bound regions, and nor should the base type scheme.
db49a4
+            let ty = tcx.type_of(def_id);
db49a4
+            (def_id, ty)
db49a4
+        };
db49a4
+
db49a4
         let substs = AstConv::create_substs_for_generic_args(
db49a4
             tcx,
db49a4
             def_id,
db49a4
diff --git a/src/test/compile-fail/issue-60989.rs b/src/test/compile-fail/issue-60989.rs
db49a4
deleted file mode 100644
db49a4
index efaa74da3baa..000000000000
db49a4
--- a/src/test/compile-fail/issue-60989.rs
db49a4
+++ /dev/null
db49a4
@@ -1,4 +0,0 @@
db49a4
-fn main() {
db49a4
-    let c1 = ();
db49a4
-    c1::<()>;
db49a4
-}
db49a4
diff --git a/src/test/ui/issue-60989.rs b/src/test/ui/issue-60989.rs
db49a4
new file mode 100644
db49a4
index 000000000000..930e98bedce8
db49a4
--- /dev/null
db49a4
+++ b/src/test/ui/issue-60989.rs
db49a4
@@ -0,0 +1,18 @@
db49a4
+struct A {}
db49a4
+struct B {}
db49a4
+
db49a4
+impl From for B {
db49a4
+    fn from(a: A) -> B {
db49a4
+        B{}
db49a4
+    }
db49a4
+}
db49a4
+
db49a4
+fn main() {
db49a4
+    let c1 = ();
db49a4
+    c1::<()>;
db49a4
+    //~^ ERROR type arguments are not allowed for this type
db49a4
+
db49a4
+    let c1 = A {};
db49a4
+    c1::<Into<B>>;
db49a4
+    //~^ ERROR type arguments are not allowed for this type
db49a4
+}
db49a4
diff --git a/src/test/ui/issue-60989.stderr b/src/test/ui/issue-60989.stderr
db49a4
new file mode 100644
db49a4
index 000000000000..55a0b9626df7
db49a4
--- /dev/null
db49a4
+++ b/src/test/ui/issue-60989.stderr
db49a4
@@ -0,0 +1,15 @@
db49a4
+error[E0109]: type arguments are not allowed for this type
db49a4
+  --> $DIR/issue-60989.rs:12:10
db49a4
+   |
db49a4
+LL |     c1::<()>;
db49a4
+   |          ^^ type argument not allowed
db49a4
+
db49a4
+error[E0109]: type arguments are not allowed for this type
db49a4
+  --> $DIR/issue-60989.rs:16:10
db49a4
+   |
db49a4
+LL |     c1::<Into<B>>;
db49a4
+   |          ^^^^^^^ type argument not allowed
db49a4
+
db49a4
+error: aborting due to 2 previous errors
db49a4
+
db49a4
+For more information about this error, try `rustc --explain E0109`.
db49a4
-- 
db49a4
2.21.0
db49a4