{"action":"created","comment":{"url":"https://api.github.com/repos/rust-lang/rust/pulls/comments/76969726","id":76969726,"diff_hunk":"@@ -162,284 +161,208 @@ pub fn represent_type<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,\n     repr\n }\n \n-fn represent_type_uncached<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,\n-                                     t: Ty<'tcx>) -> Repr<'tcx> {\n-    match t.sty {\n-        ty::TyTuple(ref elems) => {\n-            Univariant(mk_struct(cx, &elems[..], false, t))\n-        }\n-        ty::TyStruct(def, substs) => {\n-            let ftys = def.struct_variant().fields.iter().map(|field| {\n-                monomorphize::field_ty(cx.tcx(), substs, field)\n-            }).collect::<Vec<_>>();\n-            let packed = cx.tcx().lookup_packed(def.did);\n-\n-            Univariant(mk_struct(cx, &ftys[..], packed, t))\n-        }\n-        ty::TyClosure(_, ref substs) => {\n-            Univariant(mk_struct(cx, &substs.upvar_tys, false, t))\n-        }\n-        ty::TyEnum(def, substs) => {\n-            let cases = get_cases(cx.tcx(), def, substs);\n-            let hint = *cx.tcx().lookup_repr_hints(def.did).get(0)\n-                .unwrap_or(&attr::ReprAny);\n-\n-            if cases.is_empty() {\n-                // Uninhabitable; represent as unit\n-                // (Typechecking will reject discriminant-sizing attrs.)\n-                assert_eq!(hint, attr::ReprAny);\n-                return Univariant(mk_struct(cx, &[], false, t));\n-            }\n+fn integer_to_int_type(from: layout::Integer, signed: bool)->IntType {\n+    use rustc::ty::layout::Integer::*;\n+    use syntax::attr::IntType::*;\n+    use syntax::ast::{UintTy, IntTy};\n+    match (from, signed) {\n+        (I1, false) => UnsignedInt(UintTy::U8),\n+        (I8, false) => UnsignedInt(UintTy::U8),\n+        (I16, false) => UnsignedInt(UintTy::U16),\n+        (I32, false) => UnsignedInt(UintTy::U32),\n+        (I64, false) => UnsignedInt(UintTy::U64),\n+        (I1, true) => SignedInt(IntTy::I8),\n+        (I8, true) => SignedInt(IntTy::I8),\n+        (I16, true) => SignedInt(IntTy::I16),\n+        (I32, true) => SignedInt(IntTy::I32),\n+        (I64, true) => SignedInt(IntTy::I64),\n+    }\n+}\n \n-            if cases.iter().all(|c| c.tys.is_empty()) {\n-                // All bodies empty -> intlike\n-                let discrs: Vec<_> = cases.iter().map(|c| Disr::from(c.discr)).collect();\n-                let bounds = IntBounds {\n-                    ulo: discrs.iter().min().unwrap().0,\n-                    uhi: discrs.iter().max().unwrap().0,\n-                    slo: discrs.iter().map(|n| n.0 as i64).min().unwrap(),\n-                    shi: discrs.iter().map(|n| n.0 as i64).max().unwrap()\n-                };\n-                return mk_cenum(cx, hint, &bounds);\n-            }\n+fn mk_mach_int_from_layout<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, tm: layout::Integer, signed: bool)->Ty<'tcx> {\n+    use rustc::ty::layout::Integer::*;\n+    match (tm, signed) {\n+        (I1, false) => tcx.types.u8,\n+        (I8, false) => tcx.types.u8,\n+        (I16, false) => tcx.types.u16,\n+        (I32, false) => tcx.types.u32,\n+        (I64, false) => tcx.types.u64,\n+        (I1, true) => tcx.types.i8,\n+        (I8, true) => tcx.types.i8,\n+        (I16, true) => tcx.types.i16,\n+        (I32, true) => tcx.types.i32,\n+        (I64, true) => tcx.types.i64,\n+    }\n+}\n \n-            // Since there's at least one\n-            // non-empty body, explicit discriminants should have\n-            // been rejected by a checker before this point.\n-            if !cases.iter().enumerate().all(|(i,c)| c.discr == Disr::from(i)) {\n-                bug!(\"non-C-like enum {} with specified discriminants\",\n-                     cx.tcx().item_path_str(def.did));\n+fn convert_layout_struct<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,\n+                               from: &layout::Struct,\n+                               size: layout::Size,\n+                               variant: Option<ty::VariantDef<'tcx>>,\n+                               substs: &Substs<'tcx>)->Struct<'tcx> {\n+            let size_bytes = size.bytes();\n+            let sized = from.sized;\n+            let align = from.align.abi() as u32;\n+            let packed = from.packed;\n+            let fields;\n+            if let Some(v) = variant {\n+                fields = v.fields.iter().map(|field| {\n+                    monomorphize::field_ty(tcx, substs, field)\n+                }).collect::<Vec<_>>();\n             }\n-\n-            if cases.len() == 1 && hint == attr::ReprAny {\n-                // Equivalent to a struct/tuple/newtype.\n-                return Univariant(mk_struct(cx, &cases[0].tys, false, t));\n+            else {\n+                fields = Vec::default();\n             }\n+            Struct{size: size_bytes, sized: sized, align: align, packed: packed, fields: fields}\n+}\n \n-            if cases.len() == 2 && hint == attr::ReprAny {\n-                // Nullable pointer optimization\n-                let mut discr = 0;\n-                while discr < 2 {\n-                    if cases[1 - discr].is_zerolen(cx, t) {\n-                        let st = mk_struct(cx, &cases[discr].tys,\n-                                           false, t);\n-                        match cases[discr].find_ptr(cx) {\n-                            Some(ref df) if df.len() == 1 && st.fields.len() == 1 => {\n-                                return RawNullablePointer {\n-                                    nndiscr: Disr::from(discr),\n-                                    nnty: st.fields[0],\n-                                    nullfields: cases[1 - discr].tys.clone()\n-                                };\n-                            }\n-                            Some(mut discrfield) => {\n-                                discrfield.push(0);\n-                                discrfield.reverse();\n-                                return StructWrappedNullablePointer {\n-                                    nndiscr: Disr::from(discr),\n-                                    nonnull: st,\n-                                    discrfield: discrfield,\n-                                    nullfields: cases[1 - discr].tys.clone()\n-                                };\n-                            }\n-                            None => {}\n-                        }\n-                    }\n-                    discr += 1;\n-                }\n-            }\n+//This is used to determine the fields of the unsized variant of an enum.\n+fn compute_null_fields<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,\n+                       adt: ty::AdtDef<'tcx>,\n+                       substs: &Substs<'tcx>)->Vec<Ty<'tcx>> {\n+    let cases = get_cases(cx.tcx(), adt, substs);\n+    assert_eq!(cases.len(), 2); //More than two variants is not the null pointer optimization.\n+    //We use unwrap heere because it is a bug if this function is called on something wherein the following fails.\n+    let case = cases.iter().filter(|x| x.is_zerolen(cx)).next().unwrap();\n+    case.tys.clone()\n+}\n \n-            // The general case.\n-            assert!((cases.len() - 1) as i64 >= 0);\n-            let bounds = IntBounds { ulo: 0, uhi: (cases.len() - 1) as u64,\n-                                     slo: 0, shi: (cases.len() - 1) as i64 };\n-            let min_ity = range_to_inttype(cx, hint, &bounds);\n-\n-            // Create the set of structs that represent each variant\n-            // Use the minimum integer type we figured out above\n-            let fields : Vec<_> = cases.iter().map(|c| {\n-                let mut ftys = vec!(ty_of_inttype(cx.tcx(), min_ity));\n-                ftys.extend_from_slice(&c.tys);\n-                mk_struct(cx, &ftys, false, t)\n-            }).collect();\n-\n-\n-            // Check to see if we should use a different type for the\n-            // discriminant. If the overall alignment of the type is\n-            // the same as the first field in each variant, we can safely use\n-            // an alignment-sized type.\n-            // We increase the size of the discriminant to avoid LLVM copying\n-            // padding when it doesn't need to. This normally causes unaligned\n-            // load/stores and excessive memcpy/memset operations. By using a\n-            // bigger integer size, LLVM can be sure about it's contents and\n-            // won't be so conservative.\n-            // This check is needed to avoid increasing the size of types when\n-            // the alignment of the first field is smaller than the overall\n-            // alignment of the type.\n-            let (_, align) = union_size_and_align(&fields);\n-            let mut use_align = true;\n-            for st in &fields {\n-                // Get the first non-zero-sized field\n-                let field = st.fields.iter().skip(1).filter(|ty| {\n-                    let t = type_of::sizing_type_of(cx, **ty);\n-                    machine::llsize_of_real(cx, t) != 0 ||\n-                    // This case is only relevant for zero-sized types with large alignment\n-                    machine::llalign_of_min(cx, t) != 1\n-                }).next();\n-\n-                if let Some(field) = field {\n-                    let field_align = type_of::align_of(cx, *field);\n-                    if field_align != align {\n-                        use_align = false;\n-                        break;\n-                    }\n-                }\n-            }\n+fn represent_type_uncached<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,\n+                                     t: Ty<'tcx>) -> Repr<'tcx> {\n+    //We forward onto layout to make it authoritative without (yet) killhing this function.\n+    let layout = cx.layout_of(t);\n \n-            // If the alignment is smaller than the chosen discriminant size, don't use the\n-            // alignment as the final size.\n-            let min_ty = ll_inttype(&cx, min_ity);\n-            let min_size = machine::llsize_of_real(cx, min_ty);\n-            if (align as u64) < min_size {\n-                use_align = false;\n-            }\n+    use rustc::ty::layout::Layout;\n \n-            let ity = if use_align {\n-                // Use the overall alignment\n-                match align {\n-                    1 => attr::UnsignedInt(ast::UintTy::U8),\n-                    2 => attr::UnsignedInt(ast::UintTy::U16),\n-                    4 => attr::UnsignedInt(ast::UintTy::U32),\n-                    8 if machine::llalign_of_min(cx, Type::i64(cx)) == 8 =>\n-                        attr::UnsignedInt(ast::UintTy::U64),\n-                    _ => min_ity // use min_ity as a fallback\n-                }\n-            } else {\n-                min_ity\n+    match(&t.sty, layout) {\n+        (_, &Layout::CEnum{discr, signed, min, max}) => {\n+            return Repr::CEnum(integer_to_int_type(discr, signed), Disr(min), Disr(max));","path":"src/librustc_trans/adt.rs","position":237,"original_position":237,"commit_id":"67d05f59422a7463ec03837be7ad052c3e08b7df","original_commit_id":"67d05f59422a7463ec03837be7ad052c3e08b7df","user":{"login":"eddyb","id":77424,"avatar_url":"https://avatars.githubusercontent.com/u/77424?v=3","gravatar_id":"","url":"https://api.github.com/users/eddyb","html_url":"https://github.com/eddyb","followers_url":"https://api.github.com/users/eddyb/followers","following_url":"https://api.github.com/users/eddyb/following{/other_user}","gists_url":"https://api.github.com/users/eddyb/gists{/gist_id}","starred_url":"https://api.github.com/users/eddyb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eddyb/subscriptions","organizations_url":"https://api.github.com/users/eddyb/orgs","repos_url":"https://api.github.com/users/eddyb/repos","events_url":"https://api.github.com/users/eddyb/events{/privacy}","received_events_url":"https://api.github.com/users/eddyb/received_events","type":"User","site_admin":false},"body":"None of the `match` arms here need `return`, you can just remove `return` and the semicolon and it will work.","created_at":"2016-08-31T11:22:07Z","updated_at":"2016-08-31T11:22:07Z","html_url":"https://github.com/rust-lang/rust/pull/36151#discussion_r76969726","pull_request_url":"https://api.github.com/repos/rust-lang/rust/pulls/36151","_links":{"self":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/comments/76969726"},"html":{"href":"https://github.com/rust-lang/rust/pull/36151#discussion_r76969726"},"pull_request":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/36151"}}},"pull_request":{"url":"https://api.github.com/repos/rust-lang/rust/pulls/36151","id":83361814,"html_url":"https://github.com/rust-lang/rust/pull/36151","diff_url":"https://github.com/rust-lang/rust/pull/36151.diff","patch_url":"https://github.com/rust-lang/rust/pull/36151.patch","issue_url":"https://api.github.com/repos/rust-lang/rust/issues/36151","number":36151,"state":"open","locked":false,"title":"refactor to remove trans::adt and make rustc::ty::layout authoritative","user":{"login":"camlorn","id":6968705,"avatar_url":"https://avatars.githubusercontent.com/u/6968705?v=3","gravatar_id":"","url":"https://api.github.com/users/camlorn","html_url":"https://github.com/camlorn","followers_url":"https://api.github.com/users/camlorn/followers","following_url":"https://api.github.com/users/camlorn/following{/other_user}","gists_url":"https://api.github.com/users/camlorn/gists{/gist_id}","starred_url":"https://api.github.com/users/camlorn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/camlorn/subscriptions","organizations_url":"https://api.github.com/users/camlorn/orgs","repos_url":"https://api.github.com/users/camlorn/repos","events_url":"https://api.github.com/users/camlorn/events{/privacy}","received_events_url":"https://api.github.com/users/camlorn/received_events","type":"User","site_admin":false},"body":"I asked on IRC about optimizing struct layout by reordering fields from most-aligned to least-aligned and somehow ended up getting talked into doing this.  The goal here is to make `layout` authoritative and to remove `adt`.  The former has been accomplished by reimplementing `represent_type_uncached` and the latter is in progress.  @eddyb thought I should make the PR now.\r\n\r\nMy plan is to reserve the actual optimization for a second PR, as this work is useful by itself.","created_at":"2016-08-30T22:54:51Z","updated_at":"2016-08-31T11:22:07Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4937e65c85f1c902128368de19a83a65dab66c84","assignee":{"login":"eddyb","id":77424,"avatar_url":"https://avatars.githubusercontent.com/u/77424?v=3","gravatar_id":"","url":"https://api.github.com/users/eddyb","html_url":"https://github.com/eddyb","followers_url":"https://api.github.com/users/eddyb/followers","following_url":"https://api.github.com/users/eddyb/following{/other_user}","gists_url":"https://api.github.com/users/eddyb/gists{/gist_id}","starred_url":"https://api.github.com/users/eddyb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eddyb/subscriptions","organizations_url":"https://api.github.com/users/eddyb/orgs","repos_url":"https://api.github.com/users/eddyb/repos","events_url":"https://api.github.com/users/eddyb/events{/privacy}","received_events_url":"https://api.github.com/users/eddyb/received_events","type":"User","site_admin":false},"assignees":[{"login":"eddyb","id":77424,"avatar_url":"https://avatars.githubusercontent.com/u/77424?v=3","gravatar_id":"","url":"https://api.github.com/users/eddyb","html_url":"https://github.com/eddyb","followers_url":"https://api.github.com/users/eddyb/followers","following_url":"https://api.github.com/users/eddyb/following{/other_user}","gists_url":"https://api.github.com/users/eddyb/gists{/gist_id}","starred_url":"https://api.github.com/users/eddyb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eddyb/subscriptions","organizations_url":"https://api.github.com/users/eddyb/orgs","repos_url":"https://api.github.com/users/eddyb/repos","events_url":"https://api.github.com/users/eddyb/events{/privacy}","received_events_url":"https://api.github.com/users/eddyb/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/rust-lang/rust/pulls/36151/commits","review_comments_url":"https://api.github.com/repos/rust-lang/rust/pulls/36151/comments","review_comment_url":"https://api.github.com/repos/rust-lang/rust/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rust-lang/rust/issues/36151/comments","statuses_url":"https://api.github.com/repos/rust-lang/rust/statuses/67d05f59422a7463ec03837be7ad052c3e08b7df","head":{"label":"camlorn:struct_layout_optimization","ref":"struct_layout_optimization","sha":"67d05f59422a7463ec03837be7ad052c3e08b7df","user":{"login":"camlorn","id":6968705,"avatar_url":"https://avatars.githubusercontent.com/u/6968705?v=3","gravatar_id":"","url":"https://api.github.com/users/camlorn","html_url":"https://github.com/camlorn","followers_url":"https://api.github.com/users/camlorn/followers","following_url":"https://api.github.com/users/camlorn/following{/other_user}","gists_url":"https://api.github.com/users/camlorn/gists{/gist_id}","starred_url":"https://api.github.com/users/camlorn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/camlorn/subscriptions","organizations_url":"https://api.github.com/users/camlorn/orgs","repos_url":"https://api.github.com/users/camlorn/repos","events_url":"https://api.github.com/users/camlorn/events{/privacy}","received_events_url":"https://api.github.com/users/camlorn/received_events","type":"User","site_admin":false},"repo":{"id":66574752,"name":"rust","full_name":"camlorn/rust","owner":{"login":"camlorn","id":6968705,"avatar_url":"https://avatars.githubusercontent.com/u/6968705?v=3","gravatar_id":"","url":"https://api.github.com/users/camlorn","html_url":"https://github.com/camlorn","followers_url":"https://api.github.com/users/camlorn/followers","following_url":"https://api.github.com/users/camlorn/following{/other_user}","gists_url":"https://api.github.com/users/camlorn/gists{/gist_id}","starred_url":"https://api.github.com/users/camlorn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/camlorn/subscriptions","organizations_url":"https://api.github.com/users/camlorn/orgs","repos_url":"https://api.github.com/users/camlorn/repos","events_url":"https://api.github.com/users/camlorn/events{/privacy}","received_events_url":"https://api.github.com/users/camlorn/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/camlorn/rust","description":"A safe, concurrent, practical language.","fork":true,"url":"https://api.github.com/repos/camlorn/rust","forks_url":"https://api.github.com/repos/camlorn/rust/forks","keys_url":"https://api.github.com/repos/camlorn/rust/keys{/key_id}","collaborators_url":"https://api.github.com/repos/camlorn/rust/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/camlorn/rust/teams","hooks_url":"https://api.github.com/repos/camlorn/rust/hooks","issue_events_url":"https://api.github.com/repos/camlorn/rust/issues/events{/number}","events_url":"https://api.github.com/repos/camlorn/rust/events","assignees_url":"https://api.github.com/repos/camlorn/rust/assignees{/user}","branches_url":"https://api.github.com/repos/camlorn/rust/branches{/branch}","tags_url":"https://api.github.com/repos/camlorn/rust/tags","blobs_url":"https://api.github.com/repos/camlorn/rust/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/camlorn/rust/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/camlorn/rust/git/refs{/sha}","trees_url":"https://api.github.com/repos/camlorn/rust/git/trees{/sha}","statuses_url":"https://api.github.com/repos/camlorn/rust/statuses/{sha}","languages_url":"https://api.github.com/repos/camlorn/rust/languages","stargazers_url":"https://api.github.com/repos/camlorn/rust/stargazers","contributors_url":"https://api.github.com/repos/camlorn/rust/contributors","subscribers_url":"https://api.github.com/repos/camlorn/rust/subscribers","subscription_url":"https://api.github.com/repos/camlorn/rust/subscription","commits_url":"https://api.github.com/repos/camlorn/rust/commits{/sha}","git_commits_url":"https://api.github.com/repos/camlorn/rust/git/commits{/sha}","comments_url":"https://api.github.com/repos/camlorn/rust/comments{/number}","issue_comment_url":"https://api.github.com/repos/camlorn/rust/issues/comments{/number}","contents_url":"https://api.github.com/repos/camlorn/rust/contents/{+path}","compare_url":"https://api.github.com/repos/camlorn/rust/compare/{base}...{head}","merges_url":"https://api.github.com/repos/camlorn/rust/merges","archive_url":"https://api.github.com/repos/camlorn/rust/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/camlorn/rust/downloads","issues_url":"https://api.github.com/repos/camlorn/rust/issues{/number}","pulls_url":"https://api.github.com/repos/camlorn/rust/pulls{/number}","milestones_url":"https://api.github.com/repos/camlorn/rust/milestones{/number}","notifications_url":"https://api.github.com/repos/camlorn/rust/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/camlorn/rust/labels{/name}","releases_url":"https://api.github.com/repos/camlorn/rust/releases{/id}","deployments_url":"https://api.github.com/repos/camlorn/rust/deployments","created_at":"2016-08-25T16:25:46Z","updated_at":"2016-08-25T16:26:06Z","pushed_at":"2016-08-30T18:41:28Z","git_url":"git://github.com/camlorn/rust.git","ssh_url":"git@github.com:camlorn/rust.git","clone_url":"https://github.com/camlorn/rust.git","svn_url":"https://github.com/camlorn/rust","homepage":"https://www.rust-lang.org","size":297429,"stargazers_count":0,"watchers_count":0,"language":"Rust","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"rust-lang:master","ref":"master","sha":"4473130f4e0a20278225251ea6a0400258b03180","user":{"login":"rust-lang","id":5430905,"avatar_url":"https://avatars.githubusercontent.com/u/5430905?v=3","gravatar_id":"","url":"https://api.github.com/users/rust-lang","html_url":"https://github.com/rust-lang","followers_url":"https://api.github.com/users/rust-lang/followers","following_url":"https://api.github.com/users/rust-lang/following{/other_user}","gists_url":"https://api.github.com/users/rust-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/rust-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rust-lang/subscriptions","organizations_url":"https://api.github.com/users/rust-lang/orgs","repos_url":"https://api.github.com/users/rust-lang/repos","events_url":"https://api.github.com/users/rust-lang/events{/privacy}","received_events_url":"https://api.github.com/users/rust-lang/received_events","type":"Organization","site_admin":false},"repo":{"id":724712,"name":"rust","full_name":"rust-lang/rust","owner":{"login":"rust-lang","id":5430905,"avatar_url":"https://avatars.githubusercontent.com/u/5430905?v=3","gravatar_id":"","url":"https://api.github.com/users/rust-lang","html_url":"https://github.com/rust-lang","followers_url":"https://api.github.com/users/rust-lang/followers","following_url":"https://api.github.com/users/rust-lang/following{/other_user}","gists_url":"https://api.github.com/users/rust-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/rust-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rust-lang/subscriptions","organizations_url":"https://api.github.com/users/rust-lang/orgs","repos_url":"https://api.github.com/users/rust-lang/repos","events_url":"https://api.github.com/users/rust-lang/events{/privacy}","received_events_url":"https://api.github.com/users/rust-lang/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rust-lang/rust","description":"A safe, concurrent, practical language.","fork":false,"url":"https://api.github.com/repos/rust-lang/rust","forks_url":"https://api.github.com/repos/rust-lang/rust/forks","keys_url":"https://api.github.com/repos/rust-lang/rust/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rust-lang/rust/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rust-lang/rust/teams","hooks_url":"https://api.github.com/repos/rust-lang/rust/hooks","issue_events_url":"https://api.github.com/repos/rust-lang/rust/issues/events{/number}","events_url":"https://api.github.com/repos/rust-lang/rust/events","assignees_url":"https://api.github.com/repos/rust-lang/rust/assignees{/user}","branches_url":"https://api.github.com/repos/rust-lang/rust/branches{/branch}","tags_url":"https://api.github.com/repos/rust-lang/rust/tags","blobs_url":"https://api.github.com/repos/rust-lang/rust/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rust-lang/rust/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rust-lang/rust/git/refs{/sha}","trees_url":"https://api.github.com/repos/rust-lang/rust/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rust-lang/rust/statuses/{sha}","languages_url":"https://api.github.com/repos/rust-lang/rust/languages","stargazers_url":"https://api.github.com/repos/rust-lang/rust/stargazers","contributors_url":"https://api.github.com/repos/rust-lang/rust/contributors","subscribers_url":"https://api.github.com/repos/rust-lang/rust/subscribers","subscription_url":"https://api.github.com/repos/rust-lang/rust/subscription","commits_url":"https://api.github.com/repos/rust-lang/rust/commits{/sha}","git_commits_url":"https://api.github.com/repos/rust-lang/rust/git/commits{/sha}","comments_url":"https://api.github.com/repos/rust-lang/rust/comments{/number}","issue_comment_url":"https://api.github.com/repos/rust-lang/rust/issues/comments{/number}","contents_url":"https://api.github.com/repos/rust-lang/rust/contents/{+path}","compare_url":"https://api.github.com/repos/rust-lang/rust/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rust-lang/rust/merges","archive_url":"https://api.github.com/repos/rust-lang/rust/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rust-lang/rust/downloads","issues_url":"https://api.github.com/repos/rust-lang/rust/issues{/number}","pulls_url":"https://api.github.com/repos/rust-lang/rust/pulls{/number}","milestones_url":"https://api.github.com/repos/rust-lang/rust/milestones{/number}","notifications_url":"https://api.github.com/repos/rust-lang/rust/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rust-lang/rust/labels{/name}","releases_url":"https://api.github.com/repos/rust-lang/rust/releases{/id}","deployments_url":"https://api.github.com/repos/rust-lang/rust/deployments","created_at":"2010-06-16T20:39:03Z","updated_at":"2016-08-31T10:00:59Z","pushed_at":"2016-08-31T07:55:12Z","git_url":"git://github.com/rust-lang/rust.git","ssh_url":"git@github.com:rust-lang/rust.git","clone_url":"https://github.com/rust-lang/rust.git","svn_url":"https://github.com/rust-lang/rust","homepage":"https://www.rust-lang.org","size":507794,"stargazers_count":18131,"watchers_count":18131,"language":"Rust","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":3500,"mirror_url":null,"open_issues_count":2794,"forks":3500,"open_issues":2794,"watchers":18131,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/36151"},"html":{"href":"https://github.com/rust-lang/rust/pull/36151"},"issue":{"href":"https://api.github.com/repos/rust-lang/rust/issues/36151"},"comments":{"href":"https://api.github.com/repos/rust-lang/rust/issues/36151/comments"},"review_comments":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/36151/comments"},"review_comment":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/36151/commits"},"statuses":{"href":"https://api.github.com/repos/rust-lang/rust/statuses/67d05f59422a7463ec03837be7ad052c3e08b7df"}}}}
{"actor":{"display_login":"eddyb"}}