diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-09-29 04:35:58 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-09-29 04:35:58 +0200 |
| commit | 37333b5131ba867007964dfd9b20fe59a5c191ef (patch) | |
| tree | 72b8bffece74edb60ba1a63398bff3bd28b8cbaf /src/libsyntax | |
| parent | b61e69433951e31f7bd746e22f516a48ad41623b (diff) | |
| parent | 057f23d3ddabf8c89e5da371d724d1995e9655da (diff) | |
| download | rust-37333b5131ba867007964dfd9b20fe59a5c191ef.tar.gz rust-37333b5131ba867007964dfd9b20fe59a5c191ef.zip | |
Rollup merge of #63492 - eddyb:cvarargs, r=nagisa,matthewjasper
Remove redundancy from the implementation of C variadics.
This cleanup was first described in https://github.com/rust-lang/rust/issues/44930#issuecomment-497163539:
* AST doesn't track `c_variadic: bool` anymore, relying solely on a trailing `CVarArgs` type in fn signatures
* HIR doesn't have a `CVarArgs` anymore, relying solely on `c_variadic: bool`
* same for `ty::FnSig` (see tests for diagnostics improvements from that)
* `{hir,mir}::Body` have one extra argument than the signature when `c_variadic == true`
* `rustc_typeck` and `rustc_mir::{build,borrowck}` need to give that argument the right type (which no longer uses a lifetime parameter, but a function-internal scope)
* `rustc_target::abi::call` doesn't need special hacks anymore (since it never sees the `VaListImpl` now, it's all inside the body)
r? @nagisa / @rkruppe cc @dlrobertson @oli-obk
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/ext/build.rs | 1 | ||||
| -rw-r--r-- | src/libsyntax/feature_gate/check.rs | 11 | ||||
| -rw-r--r-- | src/libsyntax/mut_visit.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser/expr.rs | 1 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser/item.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser/ty.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust/tests.rs | 1 |
9 files changed, 21 insertions, 15 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index a7f035dc9ec..bc468c1ad0e 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -1893,7 +1893,6 @@ impl Param { pub struct FnDecl { pub inputs: Vec<Param>, pub output: FunctionRetTy, - pub c_variadic: bool, } impl FnDecl { @@ -1903,6 +1902,12 @@ impl FnDecl { pub fn has_self(&self) -> bool { self.inputs.get(0).map(Param::is_self).unwrap_or(false) } + pub fn c_variadic(&self) -> bool { + self.inputs.last().map(|arg| match arg.ty.kind { + TyKind::CVarArgs => true, + _ => false, + }).unwrap_or(false) + } } /// Is the trait definition an auto trait? diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index 6b93d045588..8c5289671c9 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -562,7 +562,6 @@ impl<'a> ExtCtxt<'a> { P(ast::FnDecl { inputs, output, - c_variadic: false }) } diff --git a/src/libsyntax/feature_gate/check.rs b/src/libsyntax/feature_gate/check.rs index 622b48ab928..d7fc74955bb 100644 --- a/src/libsyntax/feature_gate/check.rs +++ b/src/libsyntax/feature_gate/check.rs @@ -531,7 +531,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { self.check_abi(header.abi, span); } - if fn_decl.c_variadic { + if fn_decl.c_variadic() { gate_feature_post!(&self, c_variadic, span, "C-variadic functions are unstable"); } @@ -564,7 +564,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { if block.is_none() { self.check_abi(sig.header.abi, ti.span); } - if sig.decl.c_variadic { + if sig.decl.c_variadic() { gate_feature_post!(&self, c_variadic, ti.span, "C-variadic functions are unstable"); } @@ -601,7 +601,12 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { } match ii.kind { - ast::ImplItemKind::Method(..) => {} + ast::ImplItemKind::Method(ref sig, _) => { + if sig.decl.c_variadic() { + gate_feature_post!(&self, c_variadic, ii.span, + "C-variadic functions are unstable"); + } + } ast::ImplItemKind::OpaqueTy(..) => { gate_feature_post!( &self, diff --git a/src/libsyntax/mut_visit.rs b/src/libsyntax/mut_visit.rs index 43b5df38e14..80dfe9e5be0 100644 --- a/src/libsyntax/mut_visit.rs +++ b/src/libsyntax/mut_visit.rs @@ -717,7 +717,7 @@ pub fn noop_visit_asyncness<T: MutVisitor>(asyncness: &mut IsAsync, vis: &mut T) } pub fn noop_visit_fn_decl<T: MutVisitor>(decl: &mut P<FnDecl>, vis: &mut T) { - let FnDecl { inputs, output, c_variadic: _ } = decl.deref_mut(); + let FnDecl { inputs, output } = decl.deref_mut(); inputs.flat_map_in_place(|param| vis.flat_map_param(param)); match output { FunctionRetTy::Default(span) => vis.visit_span(span), diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index cc582819b6b..f22fd5ad703 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1194,7 +1194,7 @@ impl<'a> Parser<'a> { } fn parse_fn_params(&mut self, named_params: bool, allow_c_variadic: bool) - -> PResult<'a, (Vec<Param> , bool)> { + -> PResult<'a, Vec<Param>> { let sp = self.token.span; let mut c_variadic = false; let (params, _): (Vec<Option<Param>>, _) = self.parse_paren_comma_seq(|p| { @@ -1218,6 +1218,8 @@ impl<'a> Parser<'a> { let span = p.token.span; p.span_err(span, "`...` must be the last argument of a C-variadic function"); + // FIXME(eddyb) this should probably still push `CVarArgs`. + // Maybe AST validation/HIR lowering should emit the above error? Ok(None) } else { Ok(Some(param)) @@ -1245,7 +1247,7 @@ impl<'a> Parser<'a> { "C-variadic function must be declared with at least one named argument"); } - Ok((params, c_variadic)) + Ok(params) } /// Returns the parsed optional self parameter and whether a self shortcut was used. @@ -1414,7 +1416,6 @@ impl<'a> Parser<'a> { Ok(P(FnDecl { inputs: fn_inputs, output: self.parse_ret_ty(true)?, - c_variadic: false })) } diff --git a/src/libsyntax/parse/parser/expr.rs b/src/libsyntax/parse/parser/expr.rs index c776704b285..23674ad589d 100644 --- a/src/libsyntax/parse/parser/expr.rs +++ b/src/libsyntax/parse/parser/expr.rs @@ -1176,7 +1176,6 @@ impl<'a> Parser<'a> { Ok(P(FnDecl { inputs: inputs_captures, output, - c_variadic: false })) } diff --git a/src/libsyntax/parse/parser/item.rs b/src/libsyntax/parse/parser/item.rs index 370030d02c7..92b19b73e57 100644 --- a/src/libsyntax/parse/parser/item.rs +++ b/src/libsyntax/parse/parser/item.rs @@ -1292,13 +1292,12 @@ impl<'a> Parser<'a> { /// Parses the argument list and result type of a function declaration. fn parse_fn_decl(&mut self, allow_c_variadic: bool) -> PResult<'a, P<FnDecl>> { - let (args, c_variadic) = self.parse_fn_params(true, allow_c_variadic)?; + let args = self.parse_fn_params(true, allow_c_variadic)?; let ret_ty = self.parse_ret_ty(true)?; Ok(P(FnDecl { inputs: args, output: ret_ty, - c_variadic, })) } diff --git a/src/libsyntax/parse/parser/ty.rs b/src/libsyntax/parse/parser/ty.rs index b4c006ca2b1..c52d3733b5e 100644 --- a/src/libsyntax/parse/parser/ty.rs +++ b/src/libsyntax/parse/parser/ty.rs @@ -292,12 +292,11 @@ impl<'a> Parser<'a> { }; self.expect_keyword(kw::Fn)?; - let (inputs, c_variadic) = self.parse_fn_params(false, true)?; + let inputs = self.parse_fn_params(false, true)?; let ret_ty = self.parse_ret_ty(false)?; let decl = P(FnDecl { inputs, output: ret_ty, - c_variadic, }); Ok(TyKind::BareFn(P(BareFnTy { abi, diff --git a/src/libsyntax/print/pprust/tests.rs b/src/libsyntax/print/pprust/tests.rs index 05d78cdd87e..faa70edbfa2 100644 --- a/src/libsyntax/print/pprust/tests.rs +++ b/src/libsyntax/print/pprust/tests.rs @@ -29,7 +29,6 @@ fn test_fun_to_string() { let decl = ast::FnDecl { inputs: Vec::new(), output: ast::FunctionRetTy::Default(syntax_pos::DUMMY_SP), - c_variadic: false }; let generics = ast::Generics::default(); assert_eq!( |
