about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEduard-Mihai Burtescu <edy.burt@gmail.com>2019-01-09 13:05:05 +0200
committerEduard-Mihai Burtescu <edy.burt@gmail.com>2019-03-15 13:25:10 +0200
commit972af5e808eb76b449e7af6ee087bb611c722326 (patch)
treeb3e9dc6866502203f0d3881e10acc21b49a4efae
parent387ea61ec146722daa9fcf5f2658ea5ee2211f0c (diff)
downloadrust-972af5e808eb76b449e7af6ee087bb611c722326.tar.gz
rust-972af5e808eb76b449e7af6ee087bb611c722326.zip
rustc: rename ppaux' print macro to just p and make its cx input implicit.
-rw-r--r--src/librustc/util/ppaux.rs366
1 files changed, 193 insertions, 173 deletions
diff --git a/src/librustc/util/ppaux.rs b/src/librustc/util/ppaux.rs
index a381f8f4e8a..fa0acd1a301 100644
--- a/src/librustc/util/ppaux.rs
+++ b/src/librustc/util/ppaux.rs
@@ -195,6 +195,7 @@ macro_rules! gen_print_impl {
         impl<$($x)+, P: PrettyPrinter> Print<'tcx, P> for $target {
             type Output = fmt::Result;
             fn print(&$self, $cx: &mut PrintCx<'_, '_, 'tcx, P>) -> fmt::Result {
+                define_scoped_cx!($cx);
                 if $cx.is_debug $dbg
                 else $disp
             }
@@ -204,6 +205,7 @@ macro_rules! gen_print_impl {
         impl<P: PrettyPrinter> Print<'tcx, P> for $target {
             type Output = fmt::Result;
             fn print(&$self, $cx: &mut PrintCx<'_, '_, 'tcx, P>) -> fmt::Result {
+                define_scoped_cx!($cx);
                 if $cx.is_debug $dbg
                 else $disp
             }
@@ -244,21 +246,29 @@ macro_rules! define_print_multi {
     };
 }
 macro_rules! print_inner {
-    ( $cx:expr, write ($($data:expr),+) ) => {
-        write!($cx.printer, $($data),+)
+    (write ($($data:expr),+)) => {
+        write!(scoped_cx!().printer, $($data),+)
     };
-    ( $cx:expr, $kind:ident ($data:expr) ) => {
-        $data.$kind($cx)
+    ($kind:ident ($data:expr)) => {
+        $data.$kind(scoped_cx!())
     };
 }
-macro_rules! print {
-    ( $cx:expr, $($kind:ident $data:tt),+ ) => {
+macro_rules! p {
+    ($($kind:ident $data:tt),+) => {
         (|| -> fmt::Result {
-            $(print_inner!($cx, $kind $data)?;)+
+            $(print_inner!($kind $data)?;)+
             Ok(())
         })()
     };
 }
+macro_rules! define_scoped_cx {
+    ($cx:ident) => {
+        #[allow(unused_macros)]
+        macro_rules! scoped_cx {
+            () => ($cx)
+        }
+    };
+}
 
 impl<P: PrettyPrinter> PrintCx<'a, 'gcx, 'tcx, P> {
     fn fn_sig(
@@ -267,20 +277,22 @@ impl<P: PrettyPrinter> PrintCx<'a, 'gcx, 'tcx, P> {
         c_variadic: bool,
         output: Ty<'tcx>,
     ) -> fmt::Result {
-        print!(self, write("("))?;
+        define_scoped_cx!(self);
+
+        p!(write("("))?;
         let mut inputs = inputs.iter();
         if let Some(&ty) = inputs.next() {
-            print!(self, print_display(ty))?;
+            p!(print_display(ty))?;
             for &ty in inputs {
-                print!(self, write(", "), print_display(ty))?;
+                p!(write(", "), print_display(ty))?;
             }
             if c_variadic {
-                print!(self, write(", ..."))?;
+                p!(write(", ..."))?;
             }
         }
-        print!(self, write(")"))?;
+        p!(write(")"))?;
         if !output.is_unit() {
-            print!(self, write(" -> "), print_display(output))?;
+            p!(write(" -> "), print_display(output))?;
         }
 
         Ok(())
@@ -308,21 +320,28 @@ impl<P: PrettyPrinter> PrintCx<'a, 'gcx, 'tcx, P> {
 
         let mut empty = true;
         let mut start_or_continue = |cx: &mut Self, start: &str, cont: &str| {
+            define_scoped_cx!(cx);
+
             if empty {
                 empty = false;
-                print!(cx, write("{}", start))
+                p!(write("{}", start))
             } else {
-                print!(cx, write("{}", cont))
+                p!(write("{}", cont))
             }
         };
 
+        // NOTE(eddyb) this must be below `start_or_continue`'s definition
+        // as that also has a `define_scoped_cx` and that kind of shadowing
+        // is disallowed (name resolution thinks `scoped_cx!` is ambiguous).
+        define_scoped_cx!(self);
+
         let old_region_index = self.region_index;
         let mut region_index = old_region_index;
         let new_value = self.tcx.replace_late_bound_regions(value, |br| {
             let _ = start_or_continue(self, "for<", ", ");
             let br = match br {
                 ty::BrNamed(_, name) => {
-                    let _ = print!(self, write("{}", name));
+                    let _ = p!(write("{}", name));
                     br
                 }
                 ty::BrAnon(_) |
@@ -335,7 +354,7 @@ impl<P: PrettyPrinter> PrintCx<'a, 'gcx, 'tcx, P> {
                             break name;
                         }
                     };
-                    let _ = print!(self, write("{}", name));
+                    let _ = p!(write("{}", name));
                     ty::BrNamed(self.tcx.hir().local_def_id(CRATE_NODE_ID), name)
                 }
             };
@@ -431,7 +450,7 @@ define_print! {
 
             for (_, def_id) in auto_traits {
                 if !first {
-                    print!(cx, write(" + "))?;
+                    p!(write(" + "))?;
                 }
                 first = false;
 
@@ -502,7 +521,8 @@ impl<'tcx> fmt::Debug for ty::ClosureUpvar<'tcx> {
 impl fmt::Debug for ty::UpvarId {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         PrintCx::with(FmtPrinter { fmt: f }, |mut cx| {
-            print!(cx, write("UpvarId({:?};`{}`;{:?})",
+            define_scoped_cx!(cx);
+            p!(write("UpvarId({:?};`{}`;{:?})",
                 self.var_path.hir_id,
                 cx.tcx.hir().name_by_hir_id(self.var_path.hir_id),
                 self.closure_expr_id))
@@ -520,15 +540,15 @@ impl<'tcx> fmt::Debug for ty::UpvarBorrow<'tcx> {
 define_print! {
     ('tcx) &'tcx ty::List<Ty<'tcx>>, (self, cx) {
         display {
-            print!(cx, write("{{"))?;
+            p!(write("{{"))?;
             let mut tys = self.iter();
             if let Some(&ty) = tys.next() {
-                print!(cx, print(ty))?;
+                p!(print(ty))?;
                 for &ty in tys {
-                    print!(cx, write(", "), print(ty))?;
+                    p!(write(", "), print(ty))?;
                 }
             }
-            print!(cx, write("}}"))
+            p!(write("}}"))
         }
     }
 }
@@ -536,7 +556,7 @@ define_print! {
 define_print! {
     ('tcx) ty::TypeAndMut<'tcx>, (self, cx) {
         display {
-            print!(cx,
+            p!(
                    write("{}", if self.mutbl == hir::MutMutable { "mut " } else { "" }),
                    print(self.ty))
         }
@@ -562,7 +582,7 @@ define_print! {
 define_print! {
     ('tcx) ty::adjustment::Adjustment<'tcx>, (self, cx) {
         debug {
-            print!(cx, write("{:?} -> ", self.kind), print(self.target))
+            p!(write("{:?} -> ", self.kind), print(self.target))
         }
     }
 }
@@ -576,14 +596,14 @@ define_print! {
 
             if let BrNamed(_, name) = *self {
                 if name != "" && name != "'_" {
-                    return print!(cx, write("{}", name));
+                    return p!(write("{}", name));
                 }
             }
 
             let highlight = RegionHighlightMode::get();
             if let Some((region, counter)) = highlight.highlight_bound_region {
                 if *self == region {
-                    return print!(cx, write("'{}", counter));
+                    return p!(write("'{}", counter));
                 }
             }
 
@@ -591,13 +611,13 @@ define_print! {
         }
         debug {
             return match *self {
-                BrAnon(n) => print!(cx, write("BrAnon({:?})", n)),
-                BrFresh(n) => print!(cx, write("BrFresh({:?})", n)),
+                BrAnon(n) => p!(write("BrAnon({:?})", n)),
+                BrFresh(n) => p!(write("BrFresh({:?})", n)),
                 BrNamed(did, name) => {
-                    print!(cx, write("BrNamed({:?}:{:?}, {})",
+                    p!(write("BrNamed({:?}:{:?}, {})",
                            did.krate, did.index, name))
                 }
-                BrEnv => print!(cx, write("BrEnv")),
+                BrEnv => p!(write("BrEnv")),
             };
         }
     }
@@ -638,10 +658,10 @@ define_print! {
 
             let highlight = RegionHighlightMode::get();
             if let Some(counter) = highlight.placeholder_highlight(*self) {
-                return print!(cx, write("'{}", counter));
+                return p!(write("'{}", counter));
             }
 
-            print!(cx, print_display(self.name))
+            p!(print_display(self.name))
         }
     }
 }
@@ -673,7 +693,7 @@ define_print! {
 
             // Watch out for region highlights.
             if let Some(n) = RegionHighlightMode::get().region_highlighted(self) {
-                return print!(cx, write("'{:?}", n));
+                return p!(write("'{:?}", n));
             }
 
             // These printouts are concise.  They do not contain all the information
@@ -683,29 +703,29 @@ define_print! {
             match *self {
                 ty::ReEarlyBound(ref data) => {
                     if data.name != "'_" {
-                        print!(cx, write("{}", data.name))
+                        p!(write("{}", data.name))
                     } else {
                         Ok(())
                     }
                 }
                 ty::ReLateBound(_, br) |
                 ty::ReFree(ty::FreeRegion { bound_region: br, .. }) => {
-                    print!(cx, print_display(br))
+                    p!(print_display(br))
                 }
                 ty::RePlaceholder(p) => {
-                    print!(cx, print_display(p))
+                    p!(print_display(p))
                 }
                 ty::ReScope(scope) if cx.identify_regions => {
                     match scope.data {
                         region::ScopeData::Node =>
-                            print!(cx, write("'{}s", scope.item_local_id().as_usize())),
+                            p!(write("'{}s", scope.item_local_id().as_usize())),
                         region::ScopeData::CallSite =>
-                            print!(cx, write("'{}cs", scope.item_local_id().as_usize())),
+                            p!(write("'{}cs", scope.item_local_id().as_usize())),
                         region::ScopeData::Arguments =>
-                            print!(cx, write("'{}as", scope.item_local_id().as_usize())),
+                            p!(write("'{}as", scope.item_local_id().as_usize())),
                         region::ScopeData::Destruction =>
-                            print!(cx, write("'{}ds", scope.item_local_id().as_usize())),
-                        region::ScopeData::Remainder(first_statement_index) => print!(cx, write(
+                            p!(write("'{}ds", scope.item_local_id().as_usize())),
+                        region::ScopeData::Remainder(first_statement_index) => p!(write(
                             "'{}_{}rs",
                             scope.item_local_id().as_usize(),
                             first_statement_index.index()
@@ -713,58 +733,58 @@ define_print! {
                     }
                 }
                 ty::ReVar(region_vid) if cx.identify_regions => {
-                    print!(cx, print_debug(region_vid))
+                    p!(print_debug(region_vid))
                 }
                 ty::ReVar(region_vid) => {
-                    print!(cx, print_display(region_vid))
+                    p!(print_display(region_vid))
                 }
                 ty::ReScope(_) |
                 ty::ReErased => Ok(()),
-                ty::ReStatic => print!(cx, write("'static")),
-                ty::ReEmpty => print!(cx, write("'<empty>")),
+                ty::ReStatic => p!(write("'static")),
+                ty::ReEmpty => p!(write("'<empty>")),
 
                 // The user should never encounter these in unsubstituted form.
-                ty::ReClosureBound(vid) => print!(cx, write("{:?}", vid)),
+                ty::ReClosureBound(vid) => p!(write("{:?}", vid)),
             }
         }
         debug {
             match *self {
                 ty::ReEarlyBound(ref data) => {
-                    print!(cx, write("ReEarlyBound({}, {})",
+                    p!(write("ReEarlyBound({}, {})",
                            data.index,
                            data.name))
                 }
 
                 ty::ReClosureBound(ref vid) => {
-                    print!(cx, write("ReClosureBound({:?})",
+                    p!(write("ReClosureBound({:?})",
                            vid))
                 }
 
                 ty::ReLateBound(binder_id, ref bound_region) => {
-                    print!(cx, write("ReLateBound({:?}, {:?})",
+                    p!(write("ReLateBound({:?}, {:?})",
                            binder_id,
                            bound_region))
                 }
 
-                ty::ReFree(ref fr) => print!(cx, write("{:?}", fr)),
+                ty::ReFree(ref fr) => p!(write("{:?}", fr)),
 
                 ty::ReScope(id) => {
-                    print!(cx, write("ReScope({:?})", id))
+                    p!(write("ReScope({:?})", id))
                 }
 
-                ty::ReStatic => print!(cx, write("ReStatic")),
+                ty::ReStatic => p!(write("ReStatic")),
 
                 ty::ReVar(ref vid) => {
-                    print!(cx, write("{:?}", vid))
+                    p!(write("{:?}", vid))
                 }
 
                 ty::RePlaceholder(placeholder) => {
-                    print!(cx, write("RePlaceholder({:?})", placeholder))
+                    p!(write("RePlaceholder({:?})", placeholder))
                 }
 
-                ty::ReEmpty => print!(cx, write("ReEmpty")),
+                ty::ReEmpty => p!(write("ReEmpty")),
 
-                ty::ReErased => print!(cx, write("ReErased"))
+                ty::ReErased => p!(write("ReErased"))
             }
         }
     }
@@ -817,7 +837,7 @@ impl ty::RegionKind {
 define_print! {
     () ty::FreeRegion, (self, cx) {
         debug {
-            print!(cx, write("ReFree({:?}, {:?})", self.scope, self.bound_region))
+            p!(write("ReFree({:?}, {:?})", self.scope, self.bound_region))
         }
     }
 }
@@ -839,18 +859,18 @@ define_print! {
     ('tcx) ty::FnSig<'tcx>, (self, cx) {
         display {
             if self.unsafety == hir::Unsafety::Unsafe {
-                print!(cx, write("unsafe "))?;
+                p!(write("unsafe "))?;
             }
 
             if self.abi != Abi::Rust {
-                print!(cx, write("extern {} ", self.abi))?;
+                p!(write("extern {} ", self.abi))?;
             }
 
-            print!(cx, write("fn"))?;
+            p!(write("fn"))?;
             cx.fn_sig(self.inputs(), self.c_variadic, self.output())
         }
         debug {
-            print!(cx, write("({:?}; c_variadic: {})->{:?}",
+            p!(write("({:?}; c_variadic: {})->{:?}",
                 self.inputs(), self.c_variadic, self.output()))
         }
     }
@@ -889,7 +909,7 @@ define_print! {
 
             let highlight = RegionHighlightMode::get();
             if let Some(counter) = highlight.region_highlighted(&ty::ReVar(*self)) {
-                return print!(cx, write("'{:?}", counter));
+                return p!(write("'{:?}", counter));
             }
 
             Ok(())
@@ -899,10 +919,10 @@ define_print! {
             // to keep NLL borrowck working even with `-Zverbose`.
             let highlight = RegionHighlightMode::get();
             if let Some(counter) = highlight.region_highlighted(&ty::ReVar(*self)) {
-                return print!(cx, write("'{:?}", counter));
+                return p!(write("'{:?}", counter));
             }
 
-            print!(cx, write("'_#{}r", self.index()))
+            p!(write("'_#{}r", self.index()))
         }
     }
 }
@@ -932,22 +952,22 @@ define_print! {
                 return self.print_debug(cx);
             }
             match *self {
-                ty::TyVar(_) => print!(cx, write("_")),
-                ty::IntVar(_) => print!(cx, write("{}", "{integer}")),
-                ty::FloatVar(_) => print!(cx, write("{}", "{float}")),
-                ty::FreshTy(v) => print!(cx, write("FreshTy({})", v)),
-                ty::FreshIntTy(v) => print!(cx, write("FreshIntTy({})", v)),
-                ty::FreshFloatTy(v) => print!(cx, write("FreshFloatTy({})", v))
+                ty::TyVar(_) => p!(write("_")),
+                ty::IntVar(_) => p!(write("{}", "{integer}")),
+                ty::FloatVar(_) => p!(write("{}", "{float}")),
+                ty::FreshTy(v) => p!(write("FreshTy({})", v)),
+                ty::FreshIntTy(v) => p!(write("FreshIntTy({})", v)),
+                ty::FreshFloatTy(v) => p!(write("FreshFloatTy({})", v))
             }
         }
         debug {
             match *self {
-                ty::TyVar(ref v) => print!(cx, write("{:?}", v)),
-                ty::IntVar(ref v) => print!(cx, write("{:?}", v)),
-                ty::FloatVar(ref v) => print!(cx, write("{:?}", v)),
-                ty::FreshTy(v) => print!(cx, write("FreshTy({:?})", v)),
-                ty::FreshIntTy(v) => print!(cx, write("FreshIntTy({:?})", v)),
-                ty::FreshFloatTy(v) => print!(cx, write("FreshFloatTy({:?})", v))
+                ty::TyVar(ref v) => p!(write("{:?}", v)),
+                ty::IntVar(ref v) => p!(write("{:?}", v)),
+                ty::FloatVar(ref v) => p!(write("{:?}", v)),
+                ty::FreshTy(v) => p!(write("FreshTy({:?})", v)),
+                ty::FreshIntTy(v) => p!(write("FreshIntTy({:?})", v)),
+                ty::FreshFloatTy(v) => p!(write("FreshFloatTy({:?})", v))
             }
         }
     }
@@ -1020,68 +1040,68 @@ define_print! {
     ('tcx) ty::Ty<'tcx>, (self, cx) {
         display {
             match self.sty {
-                Bool => print!(cx, write("bool")),
-                Char => print!(cx, write("char")),
-                Int(t) => print!(cx, write("{}", t.ty_to_string())),
-                Uint(t) => print!(cx, write("{}", t.ty_to_string())),
-                Float(t) => print!(cx, write("{}", t.ty_to_string())),
+                Bool => p!(write("bool")),
+                Char => p!(write("char")),
+                Int(t) => p!(write("{}", t.ty_to_string())),
+                Uint(t) => p!(write("{}", t.ty_to_string())),
+                Float(t) => p!(write("{}", t.ty_to_string())),
                 RawPtr(ref tm) => {
-                    print!(cx, write("*{} ", match tm.mutbl {
+                    p!(write("*{} ", match tm.mutbl {
                         hir::MutMutable => "mut",
                         hir::MutImmutable => "const",
                     }))?;
                     tm.ty.print(cx)
                 }
                 Ref(r, ty, mutbl) => {
-                    print!(cx, write("&"))?;
+                    p!(write("&"))?;
                     if r.display_outputs_anything(cx) {
-                        print!(cx, print_display(r), write(" "))?;
+                        p!(print_display(r), write(" "))?;
                     }
                     ty::TypeAndMut { ty, mutbl }.print(cx)
                 }
-                Never => print!(cx, write("!")),
+                Never => p!(write("!")),
                 Tuple(ref tys) => {
-                    print!(cx, write("("))?;
+                    p!(write("("))?;
                     let mut tys = tys.iter();
                     if let Some(&ty) = tys.next() {
-                        print!(cx, print(ty), write(","))?;
+                        p!(print(ty), write(","))?;
                         if let Some(&ty) = tys.next() {
-                            print!(cx, write(" "), print(ty))?;
+                            p!(write(" "), print(ty))?;
                             for &ty in tys {
-                                print!(cx, write(", "), print(ty))?;
+                                p!(write(", "), print(ty))?;
                             }
                         }
                     }
-                    print!(cx, write(")"))
+                    p!(write(")"))
                 }
                 FnDef(def_id, substs) => {
                     let sig = cx.tcx.fn_sig(def_id).subst(cx.tcx, substs);
-                    print!(cx, print(sig), write(" {{"))?;
+                    p!(print(sig), write(" {{"))?;
                     let _ = cx.print_def_path(
                         def_id,
                         Some(substs),
                         Namespace::ValueNS,
                         iter::empty(),
                     )?;
-                    print!(cx, write("}}"))
+                    p!(write("}}"))
                 }
                 FnPtr(ref bare_fn) => {
                     bare_fn.print(cx)
                 }
-                Infer(infer_ty) => print!(cx, write("{}", infer_ty)),
-                Error => print!(cx, write("[type error]")),
-                Param(ref param_ty) => print!(cx, write("{}", param_ty)),
+                Infer(infer_ty) => p!(write("{}", infer_ty)),
+                Error => p!(write("[type error]")),
+                Param(ref param_ty) => p!(write("{}", param_ty)),
                 Bound(debruijn, bound_ty) => {
                     match bound_ty.kind {
                         ty::BoundTyKind::Anon => {
                             if debruijn == ty::INNERMOST {
-                                print!(cx, write("^{}", bound_ty.var.index()))
+                                p!(write("^{}", bound_ty.var.index()))
                             } else {
-                                print!(cx, write("^{}_{}", debruijn.index(), bound_ty.var.index()))
+                                p!(write("^{}_{}", debruijn.index(), bound_ty.var.index()))
                             }
                         }
 
-                        ty::BoundTyKind::Param(p) => print!(cx, write("{}", p)),
+                        ty::BoundTyKind::Param(p) => p!(write("{}", p)),
                     }
                 }
                 Adt(def, substs) => {
@@ -1096,12 +1116,12 @@ define_print! {
                 Dynamic(data, r) => {
                     let print_r = r.display_outputs_anything(cx);
                     if print_r {
-                        print!(cx, write("("))?;
+                        p!(write("("))?;
                     }
-                    print!(cx, write("dyn "))?;
+                    p!(write("dyn "))?;
                     data.print(cx)?;
                     if print_r {
-                        print!(cx, write(" + "), print_display(r), write(")"))?;
+                        p!(write(" + "), print_display(r), write(")"))?;
                     }
                     Ok(())
                 }
@@ -1116,30 +1136,30 @@ define_print! {
                 }
                 Projection(ref data) => data.print(cx),
                 UnnormalizedProjection(ref data) => {
-                    print!(cx, write("Unnormalized("))?;
+                    p!(write("Unnormalized("))?;
                     data.print(cx)?;
-                    print!(cx, write(")"))
+                    p!(write(")"))
                 }
                 Placeholder(placeholder) => {
-                    print!(cx, write("Placeholder({:?})", placeholder))
+                    p!(write("Placeholder({:?})", placeholder))
                 }
                 Opaque(def_id, substs) => {
                     if cx.is_verbose {
-                        return print!(cx, write("Opaque({:?}, {:?})", def_id, substs));
+                        return p!(write("Opaque({:?}, {:?})", def_id, substs));
                     }
 
                     let def_key = cx.tcx.def_key(def_id);
                     if let Some(name) = def_key.disambiguated_data.data.get_opt_name() {
-                        print!(cx, write("{}", name))?;
+                        p!(write("{}", name))?;
                         let mut substs = substs.iter();
                         // FIXME(eddyb) print this with `print_def_path`.
                         if let Some(first) = substs.next() {
-                            print!(cx, write("::<"))?;
-                            print!(cx, write("{}", first))?;
+                            p!(write("::<"))?;
+                            p!(write("{}", first))?;
                             for subst in substs {
-                                print!(cx, write(", {}", subst))?;
+                                p!(write(", {}", subst))?;
                             }
-                            print!(cx, write(">"))?;
+                            p!(write(">"))?;
                         }
                         return Ok(());
                     }
@@ -1149,7 +1169,7 @@ define_print! {
 
                     let mut first = true;
                     let mut is_sized = false;
-                    print!(cx, write("impl"))?;
+                    p!(write("impl"))?;
                     for predicate in bounds.predicates {
                         if let Some(trait_ref) = predicate.to_opt_poly_trait_ref() {
                             // Don't print +Sized, but rather +?Sized if absent.
@@ -1158,36 +1178,36 @@ define_print! {
                                 continue;
                             }
 
-                            print!(cx,
+                            p!(
                                     write("{}", if first { " " } else { "+" }),
                                     print(trait_ref))?;
                             first = false;
                         }
                     }
                     if !is_sized {
-                        print!(cx, write("{}?Sized", if first { " " } else { "+" }))?;
+                        p!(write("{}?Sized", if first { " " } else { "+" }))?;
                     } else if first {
-                        print!(cx, write(" Sized"))?;
+                        p!(write(" Sized"))?;
                     }
                     Ok(())
                 }
-                Str => print!(cx, write("str")),
+                Str => p!(write("str")),
                 Generator(did, substs, movability) => {
                     let upvar_tys = substs.upvar_tys(did, cx.tcx);
                     let witness = substs.witness(did, cx.tcx);
                     if movability == hir::GeneratorMovability::Movable {
-                        print!(cx, write("[generator"))?;
+                        p!(write("[generator"))?;
                     } else {
-                        print!(cx, write("[static generator"))?;
+                        p!(write("[static generator"))?;
                     }
 
                     // FIXME(eddyb) should use `def_span`.
                     if let Some(hir_id) = cx.tcx.hir().as_local_hir_id(did) {
-                        print!(cx, write("@{:?}", cx.tcx.hir().span_by_hir_id(hir_id)))?;
+                        p!(write("@{:?}", cx.tcx.hir().span_by_hir_id(hir_id)))?;
                         let mut sep = " ";
                         cx.tcx.with_freevars(hir_id, |freevars| {
                             for (freevar, upvar_ty) in freevars.iter().zip(upvar_tys) {
-                                print!(cx,
+                                p!(
                                        write("{}{}:",
                                              sep,
                                              cx.tcx.hir().name(freevar.var_id())),
@@ -1199,36 +1219,36 @@ define_print! {
                     } else {
                         // cross-crate closure types should only be
                         // visible in codegen bug reports, I imagine.
-                        print!(cx, write("@{:?}", did))?;
+                        p!(write("@{:?}", did))?;
                         let mut sep = " ";
                         for (index, upvar_ty) in upvar_tys.enumerate() {
-                            print!(cx,
+                            p!(
                                    write("{}{}:", sep, index),
                                    print(upvar_ty))?;
                             sep = ", ";
                         }
                     }
 
-                    print!(cx, write(" "), print(witness), write("]"))
+                    p!(write(" "), print(witness), write("]"))
                 },
                 GeneratorWitness(types) => {
                     cx.in_binder(&types)
                 }
                 Closure(did, substs) => {
                     let upvar_tys = substs.upvar_tys(did, cx.tcx);
-                    print!(cx, write("[closure"))?;
+                    p!(write("[closure"))?;
 
                     // FIXME(eddyb) should use `def_span`.
                     if let Some(hir_id) = cx.tcx.hir().as_local_hir_id(did) {
                         if cx.tcx.sess.opts.debugging_opts.span_free_formats {
-                            print!(cx, write("@{:?}", hir_id))?;
+                            p!(write("@{:?}", hir_id))?;
                         } else {
-                            print!(cx, write("@{:?}", cx.tcx.hir().span_by_hir_id(hir_id)))?;
+                            p!(write("@{:?}", cx.tcx.hir().span_by_hir_id(hir_id)))?;
                         }
                         let mut sep = " ";
                         cx.tcx.with_freevars(hir_id, |freevars| {
                             for (freevar, upvar_ty) in freevars.iter().zip(upvar_tys) {
-                                print!(cx,
+                                p!(
                                        write("{}{}:",
                                              sep,
                                              cx.tcx.hir().name(freevar.var_id())),
@@ -1240,10 +1260,10 @@ define_print! {
                     } else {
                         // cross-crate closure types should only be
                         // visible in codegen bug reports, I imagine.
-                        print!(cx, write("@{:?}", did))?;
+                        p!(write("@{:?}", did))?;
                         let mut sep = " ";
                         for (index, upvar_ty) in upvar_tys.enumerate() {
-                            print!(cx,
+                            p!(
                                    write("{}{}:", sep, index),
                                    print(upvar_ty))?;
                             sep = ", ";
@@ -1251,34 +1271,34 @@ define_print! {
                     }
 
                     if cx.is_verbose {
-                        print!(cx, write(
+                        p!(write(
                             " closure_kind_ty={:?} closure_sig_ty={:?}",
                             substs.closure_kind_ty(did, cx.tcx),
                             substs.closure_sig_ty(did, cx.tcx)
                         ))?;
                     }
 
-                    print!(cx, write("]"))
+                    p!(write("]"))
                 },
                 Array(ty, sz) => {
-                    print!(cx, write("["), print(ty), write("; "))?;
+                    p!(write("["), print(ty), write("; "))?;
                     match sz {
                         ty::LazyConst::Unevaluated(_def_id, _substs) => {
-                            print!(cx, write("_"))?;
+                            p!(write("_"))?;
                         }
                         ty::LazyConst::Evaluated(c) => {
                             match c.val {
-                                ConstValue::Infer(..) => print!(cx, write("_"))?,
+                                ConstValue::Infer(..) => p!(write("_"))?,
                                 ConstValue::Param(ParamConst { name, .. }) =>
-                                    print!(cx, write("{}", name))?,
-                                _ => print!(cx, write("{}", c.unwrap_usize(cx.tcx)))?,
+                                    p!(write("{}", name))?,
+                                _ => p!(write("{}", c.unwrap_usize(cx.tcx)))?,
                             }
                         }
                     }
-                    print!(cx, write("]"))
+                    p!(write("]"))
                 }
                 Slice(ty) => {
-                    print!(cx, write("["), print(ty), write("]"))
+                    p!(write("["), print(ty), write("]"))
                 }
             }
         }
@@ -1292,9 +1312,9 @@ define_print! {
     ('tcx) ConstValue<'tcx>, (self, cx) {
         display {
             match self {
-                ConstValue::Infer(..) => print!(cx, write("_")),
-                ConstValue::Param(ParamConst { name, .. }) => print!(cx, write("{}", name)),
-                _ => print!(cx, write("{:?}", self)),
+                ConstValue::Infer(..) => p!(write("_")),
+                ConstValue::Param(ParamConst { name, .. }) => p!(write("{}", name)),
+                _ => p!(write("{:?}", self)),
             }
         }
     }
@@ -1303,7 +1323,7 @@ define_print! {
 define_print! {
     ('tcx) ty::Const<'tcx>, (self, cx) {
         display {
-            print!(cx, write("{} : {}", self.val, self.ty))
+            p!(write("{} : {}", self.val, self.ty))
         }
     }
 }
@@ -1313,8 +1333,8 @@ define_print! {
         display {
             match self {
                 // FIXME(const_generics) this should print at least the type.
-                ty::LazyConst::Unevaluated(..) => print!(cx, write("_ : _")),
-                ty::LazyConst::Evaluated(c) => print!(cx, write("{}", c)),
+                ty::LazyConst::Unevaluated(..) => p!(write("_ : _")),
+                ty::LazyConst::Evaluated(c) => p!(write("{}", c)),
             }
         }
     }
@@ -1323,10 +1343,10 @@ define_print! {
 define_print! {
     () ty::ParamTy, (self, cx) {
         display {
-            print!(cx, write("{}", self.name))
+            p!(write("{}", self.name))
         }
         debug {
-            print!(cx, write("{}/#{}", self.name, self.idx))
+            p!(write("{}/#{}", self.name, self.idx))
         }
     }
 }
@@ -1334,10 +1354,10 @@ define_print! {
 define_print! {
     () ty::ParamConst, (self, cx) {
         display {
-            print!(cx, write("{}", self.name))
+            p!(write("{}", self.name))
         }
         debug {
-            print!(cx, write("{}/#{}", self.name, self.index))
+            p!(write("{}/#{}", self.name, self.index))
         }
     }
 }
@@ -1350,7 +1370,7 @@ define_print_multi! {
     ]
     (self, cx) {
         display {
-            print!(cx, print(self.0), write(" : "), print(self.1))
+            p!(print(self.0), write(" : "), print(self.1))
         }
     }
 }
@@ -1358,7 +1378,7 @@ define_print_multi! {
 define_print! {
     ('tcx) ty::SubtypePredicate<'tcx>, (self, cx) {
         display {
-            print!(cx, print(self.a), write(" <: "), print(self.b))
+            p!(print(self.a), write(" <: "), print(self.b))
         }
     }
 }
@@ -1366,11 +1386,11 @@ define_print! {
 define_print! {
     ('tcx) ty::TraitPredicate<'tcx>, (self, cx) {
         debug {
-            print!(cx, write("TraitPredicate({:?})",
+            p!(write("TraitPredicate({:?})",
                    self.trait_ref))
         }
         display {
-            print!(cx, print(self.trait_ref.self_ty()), write(": "), print(self.trait_ref))
+            p!(print(self.trait_ref.self_ty()), write(": "), print(self.trait_ref))
         }
     }
 }
@@ -1378,7 +1398,7 @@ define_print! {
 define_print! {
     ('tcx) ty::ProjectionPredicate<'tcx>, (self, cx) {
         debug {
-            print!(cx,
+            p!(
                    write("ProjectionPredicate("),
                    print(self.projection_ty),
                    write(", "),
@@ -1386,7 +1406,7 @@ define_print! {
                    write(")"))
         }
         display {
-            print!(cx, print(self.projection_ty), write(" == "), print(self.ty))
+            p!(print(self.projection_ty), write(" == "), print(self.ty))
         }
     }
 }
@@ -1409,9 +1429,9 @@ define_print! {
     () ty::ClosureKind, (self, cx) {
         display {
             match *self {
-                ty::ClosureKind::Fn => print!(cx, write("Fn")),
-                ty::ClosureKind::FnMut => print!(cx, write("FnMut")),
-                ty::ClosureKind::FnOnce => print!(cx, write("FnOnce")),
+                ty::ClosureKind::Fn => p!(write("Fn")),
+                ty::ClosureKind::FnMut => p!(write("FnMut")),
+                ty::ClosureKind::FnOnce => p!(write("FnOnce")),
             }
         }
     }
@@ -1426,36 +1446,36 @@ define_print! {
                 ty::Predicate::RegionOutlives(ref predicate) => predicate.print(cx),
                 ty::Predicate::TypeOutlives(ref predicate) => predicate.print(cx),
                 ty::Predicate::Projection(ref predicate) => predicate.print(cx),
-                ty::Predicate::WellFormed(ty) => print!(cx, print(ty), write(" well-formed")),
+                ty::Predicate::WellFormed(ty) => p!(print(ty), write(" well-formed")),
                 ty::Predicate::ObjectSafe(trait_def_id) => {
-                    print!(cx, write("the trait `"))?;
+                    p!(write("the trait `"))?;
                     let _ = cx.print_def_path(
                         trait_def_id,
                         None,
                         Namespace::TypeNS,
                         iter::empty(),
                     )?;
-                    print!(cx, write("` is object-safe"))
+                    p!(write("` is object-safe"))
                 }
                 ty::Predicate::ClosureKind(closure_def_id, _closure_substs, kind) => {
-                    print!(cx, write("the closure `"))?;
+                    p!(write("the closure `"))?;
                     let _ = cx.print_def_path(
                         closure_def_id,
                         None,
                         Namespace::ValueNS,
                         iter::empty(),
                     )?;
-                    print!(cx, write("` implements the trait `{}`", kind))
+                    p!(write("` implements the trait `{}`", kind))
                 }
                 ty::Predicate::ConstEvaluatable(def_id, substs) => {
-                    print!(cx, write("the constant `"))?;
+                    p!(write("the constant `"))?;
                     let _ = cx.print_def_path(
                         def_id,
                         Some(substs),
                         Namespace::ValueNS,
                         iter::empty(),
                     )?;
-                    print!(cx, write("` can be evaluated"))
+                    p!(write("` can be evaluated"))
                 }
             }
         }
@@ -1468,14 +1488,14 @@ define_print! {
                 ty::Predicate::Projection(ref pair) => pair.print(cx),
                 ty::Predicate::WellFormed(ty) => ty.print(cx),
                 ty::Predicate::ObjectSafe(trait_def_id) => {
-                    print!(cx, write("ObjectSafe({:?})", trait_def_id))
+                    p!(write("ObjectSafe({:?})", trait_def_id))
                 }
                 ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) => {
-                    print!(cx, write("ClosureKind({:?}, {:?}, {:?})",
+                    p!(write("ClosureKind({:?}, {:?}, {:?})",
                         closure_def_id, closure_substs, kind))
                 }
                 ty::Predicate::ConstEvaluatable(def_id, substs) => {
-                    print!(cx, write("ConstEvaluatable({:?}, {:?})", def_id, substs))
+                    p!(write("ConstEvaluatable({:?}, {:?})", def_id, substs))
                 }
             }
         }
@@ -1486,16 +1506,16 @@ define_print! {
     ('tcx) Kind<'tcx>, (self, cx) {
         display {
             match self.unpack() {
-                UnpackedKind::Lifetime(lt) => print!(cx, print(lt)),
-                UnpackedKind::Type(ty) => print!(cx, print(ty)),
-                UnpackedKind::Const(ct) => print!(cx, print(ct)),
+                UnpackedKind::Lifetime(lt) => p!(print(lt)),
+                UnpackedKind::Type(ty) => p!(print(ty)),
+                UnpackedKind::Const(ct) => p!(print(ct)),
             }
         }
         debug {
             match self.unpack() {
-                UnpackedKind::Lifetime(lt) => print!(cx, print(lt)),
-                UnpackedKind::Type(ty) => print!(cx, print(ty)),
-                UnpackedKind::Const(ct) => print!(cx, print(ct)),
+                UnpackedKind::Lifetime(lt) => p!(print(lt)),
+                UnpackedKind::Type(ty) => p!(print(ty)),
+                UnpackedKind::Const(ct) => p!(print(ct)),
             }
         }
     }