Print variadic argument pattern in HIR pretty printer

This commit is contained in:
DaniPopes 2023-10-25 01:05:26 +02:00
parent b66fe58f68
commit 2c1dbed4aa
No known key found for this signature in database
GPG Key ID: 0F09640DDB7AC692
3 changed files with 40 additions and 7 deletions

View File

@ -502,13 +502,13 @@ impl<'a> State<'a> {
self.word(";"); self.word(";");
self.end(); // end the outer cbox self.end(); // end the outer cbox
} }
hir::ItemKind::Fn(ref sig, param_names, body) => { hir::ItemKind::Fn(ref sig, generics, body) => {
self.head(""); self.head("");
self.print_fn( self.print_fn(
sig.decl, sig.decl,
sig.header, sig.header,
Some(item.ident.name), Some(item.ident.name),
param_names, generics,
&[], &[],
Some(body), Some(body),
); );
@ -1948,11 +1948,10 @@ impl<'a> State<'a> {
self.print_generic_params(generics.params); self.print_generic_params(generics.params);
self.popen(); self.popen();
let mut i = 0;
// Make sure we aren't supplied *both* `arg_names` and `body_id`. // Make sure we aren't supplied *both* `arg_names` and `body_id`.
assert!(arg_names.is_empty() || body_id.is_none()); assert!(arg_names.is_empty() || body_id.is_none());
self.commasep(Inconsistent, decl.inputs, |s, ty| { let mut i = 0;
s.ibox(INDENT_UNIT); let mut print_arg = |s: &mut Self| {
if let Some(arg_name) = arg_names.get(i) { if let Some(arg_name) = arg_names.get(i) {
s.word(arg_name.to_string()); s.word(arg_name.to_string());
s.word(":"); s.word(":");
@ -1963,11 +1962,17 @@ impl<'a> State<'a> {
s.space(); s.space();
} }
i += 1; i += 1;
};
self.commasep(Inconsistent, decl.inputs, |s, ty| {
s.ibox(INDENT_UNIT);
print_arg(s);
s.print_type(ty); s.print_type(ty);
s.end() s.end();
}); });
if decl.c_variadic { if decl.c_variadic {
self.word(", ..."); self.word(", ");
print_arg(self);
self.word("...");
} }
self.pclose(); self.pclose();

View File

@ -0,0 +1,15 @@
// pretty-compare-only
// pretty-mode:hir
// pp-exact:hir-fn-variadic.pp
#![feature(c_variadic)]
#[prelude_import]
use ::std::prelude::rust_2015::*;
#[macro_use]
extern crate std;
extern "C" {
fn foo(x: i32, ...);
}
unsafe extern "C" fn bar(_: i32, mut va2: ...) -> usize { va2.arg::<usize>() }

View File

@ -0,0 +1,13 @@
// pretty-compare-only
// pretty-mode:hir
// pp-exact:hir-fn-variadic.pp
#![feature(c_variadic)]
extern "C" {
pub fn foo(x: i32, va1: ...);
}
pub unsafe extern "C" fn bar(_: i32, mut va2: ...) -> usize {
va2.arg::<usize>()
}