syntax: parse const fn for free functions and inherent methods.
This commit is contained in:
parent
bc6318d2be
commit
af3795721c
34 changed files with 218 additions and 88 deletions
|
|
@ -1049,7 +1049,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
|
|||
encode_stability(rbml_w, stab);
|
||||
rbml_w.end_tag();
|
||||
}
|
||||
ast::ItemFn(ref decl, _, _, ref generics, _) => {
|
||||
ast::ItemFn(ref decl, _, _, _, ref generics, _) => {
|
||||
add_to_index(item, rbml_w, index);
|
||||
rbml_w.start_tag(tag_items_data_item);
|
||||
encode_def_id(rbml_w, def_id);
|
||||
|
|
@ -1967,7 +1967,7 @@ fn encode_reachable_extern_fns(ecx: &EncodeContext, rbml_w: &mut Encoder) {
|
|||
|
||||
for id in ecx.reachable {
|
||||
if let Some(ast_map::NodeItem(i)) = ecx.tcx.map.find(*id) {
|
||||
if let ast::ItemFn(_, _, abi, ref generics, _) = i.node {
|
||||
if let ast::ItemFn(_, _, _, abi, ref generics, _) = i.node {
|
||||
if abi != abi::Rust && !generics.is_type_parameterized() {
|
||||
rbml_w.wr_tagged_u32(tag_reachable_extern_fn_id, *id);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -87,8 +87,8 @@ impl<'a, 'tcx, 'v> Visitor<'v> for EffectCheckVisitor<'a, 'tcx> {
|
|||
block: &'v ast::Block, span: Span, _: ast::NodeId) {
|
||||
|
||||
let (is_item_fn, is_unsafe_fn) = match fn_kind {
|
||||
visit::FkItemFn(_, _, fn_style, _, _) =>
|
||||
(true, fn_style == ast::Unsafety::Unsafe),
|
||||
visit::FkItemFn(_, _, unsafety, _, _) =>
|
||||
(true, unsafety == ast::Unsafety::Unsafe),
|
||||
visit::FkMethod(_, sig, _) =>
|
||||
(true, sig.unsafety == ast::Unsafety::Unsafe),
|
||||
_ => (false, false),
|
||||
|
|
|
|||
|
|
@ -158,6 +158,7 @@ trait ErrorReportingHelpers<'tcx> {
|
|||
fn give_expl_lifetime_param(&self,
|
||||
decl: &ast::FnDecl,
|
||||
unsafety: ast::Unsafety,
|
||||
constness: ast::Constness,
|
||||
ident: ast::Ident,
|
||||
opt_explicit_self: Option<&ast::ExplicitSelf_>,
|
||||
generics: &ast::Generics,
|
||||
|
|
@ -826,8 +827,9 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
|
|||
Some(ref node) => match *node {
|
||||
ast_map::NodeItem(ref item) => {
|
||||
match item.node {
|
||||
ast::ItemFn(ref fn_decl, pur, _, ref gen, _) => {
|
||||
Some((fn_decl, gen, pur, item.ident, None, item.span))
|
||||
ast::ItemFn(ref fn_decl, unsafety, constness, _, ref gen, _) => {
|
||||
Some((fn_decl, gen, unsafety, constness,
|
||||
item.ident, None, item.span))
|
||||
},
|
||||
_ => None
|
||||
}
|
||||
|
|
@ -838,6 +840,7 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
|
|||
Some((&sig.decl,
|
||||
&sig.generics,
|
||||
sig.unsafety,
|
||||
sig.constness,
|
||||
item.ident,
|
||||
Some(&sig.explicit_self.node),
|
||||
item.span))
|
||||
|
|
@ -852,6 +855,7 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
|
|||
Some((&sig.decl,
|
||||
&sig.generics,
|
||||
sig.unsafety,
|
||||
sig.constness,
|
||||
item.ident,
|
||||
Some(&sig.explicit_self.node),
|
||||
item.span))
|
||||
|
|
@ -863,12 +867,12 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
|
|||
},
|
||||
None => None
|
||||
};
|
||||
let (fn_decl, generics, unsafety, ident, expl_self, span)
|
||||
let (fn_decl, generics, unsafety, constness, ident, expl_self, span)
|
||||
= node_inner.expect("expect item fn");
|
||||
let rebuilder = Rebuilder::new(self.tcx, fn_decl, expl_self,
|
||||
generics, same_regions, &life_giver);
|
||||
let (fn_decl, expl_self, generics) = rebuilder.rebuild();
|
||||
self.give_expl_lifetime_param(&fn_decl, unsafety, ident,
|
||||
self.give_expl_lifetime_param(&fn_decl, unsafety, constness, ident,
|
||||
expl_self.as_ref(), &generics, span);
|
||||
}
|
||||
}
|
||||
|
|
@ -1423,12 +1427,13 @@ impl<'a, 'tcx> ErrorReportingHelpers<'tcx> for InferCtxt<'a, 'tcx> {
|
|||
fn give_expl_lifetime_param(&self,
|
||||
decl: &ast::FnDecl,
|
||||
unsafety: ast::Unsafety,
|
||||
constness: ast::Constness,
|
||||
ident: ast::Ident,
|
||||
opt_explicit_self: Option<&ast::ExplicitSelf_>,
|
||||
generics: &ast::Generics,
|
||||
span: codemap::Span) {
|
||||
let suggested_fn = pprust::fun_to_string(decl, unsafety, ident,
|
||||
opt_explicit_self, generics);
|
||||
let suggested_fn = pprust::fun_to_string(decl, unsafety, constness, ident,
|
||||
opt_explicit_self, generics);
|
||||
let msg = format!("consider using an explicit lifetime \
|
||||
parameter as shown: {}", suggested_fn);
|
||||
self.tcx.sess.span_help(span, &msg[..]);
|
||||
|
|
@ -1710,7 +1715,7 @@ fn lifetimes_in_scope(tcx: &ty::ctxt,
|
|||
let method_id_opt = match tcx.map.find(parent) {
|
||||
Some(node) => match node {
|
||||
ast_map::NodeItem(item) => match item.node {
|
||||
ast::ItemFn(_, _, _, ref gen, _) => {
|
||||
ast::ItemFn(_, _, _, _, ref gen, _) => {
|
||||
taken.push_all(&gen.lifetimes);
|
||||
None
|
||||
},
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ fn item_might_be_inlined(item: &ast::Item) -> bool {
|
|||
|
||||
match item.node {
|
||||
ast::ItemImpl(_, _, ref generics, _, _, _) |
|
||||
ast::ItemFn(_, _, _, ref generics, _) => {
|
||||
ast::ItemFn(_, _, _, _, ref generics, _) => {
|
||||
generics_require_inlining(generics)
|
||||
}
|
||||
_ => false,
|
||||
|
|
@ -256,7 +256,7 @@ impl<'a, 'tcx> ReachableContext<'a, 'tcx> {
|
|||
// but all other rust-only interfaces can be private (they will not
|
||||
// participate in linkage after this product is produced)
|
||||
if let ast_map::NodeItem(item) = *node {
|
||||
if let ast::ItemFn(_, _, abi, _, _) = item.node {
|
||||
if let ast::ItemFn(_, _, _, abi, _, _) = item.node {
|
||||
if abi != abi::Rust {
|
||||
self.reachable_symbols.insert(search_item);
|
||||
}
|
||||
|
|
@ -273,7 +273,7 @@ impl<'a, 'tcx> ReachableContext<'a, 'tcx> {
|
|||
match *node {
|
||||
ast_map::NodeItem(item) => {
|
||||
match item.node {
|
||||
ast::ItemFn(_, _, _, _, ref search_block) => {
|
||||
ast::ItemFn(_, _, _, _, _, ref search_block) => {
|
||||
if item_might_be_inlined(&*item) {
|
||||
visit::walk_block(self, &**search_block)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ impl<'a, 'v> Visitor<'v> for LifetimeContext<'a> {
|
|||
fn visit_fn(&mut self, fk: visit::FnKind<'v>, fd: &'v ast::FnDecl,
|
||||
b: &'v ast::Block, s: Span, _: ast::NodeId) {
|
||||
match fk {
|
||||
visit::FkItemFn(_, generics, _, _, _) => {
|
||||
visit::FkItemFn(_, generics, _, _, _, _) => {
|
||||
self.visit_early_late(subst::FnSpace, generics, |this| {
|
||||
this.walk_fn(fk, fd, b, s)
|
||||
})
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ use syntax::{attr, visit};
|
|||
use syntax::ast;
|
||||
use syntax::ast::{Attribute, Block, Crate, DefId, FnDecl, NodeId, Variant};
|
||||
use syntax::ast::{Item, Generics, StructField};
|
||||
use syntax::ast_util::is_local;
|
||||
use syntax::ast_util::{is_local, PostExpansionMethod};
|
||||
use syntax::attr::{Stability, AttrMetaMethods};
|
||||
use syntax::visit::{FnKind, Visitor};
|
||||
use syntax::feature_gate::emit_feature_err;
|
||||
|
|
|
|||
|
|
@ -2428,7 +2428,7 @@ impl<'a, 'tcx> ParameterEnvironment<'a, 'tcx> {
|
|||
}
|
||||
Some(ast_map::NodeItem(item)) => {
|
||||
match item.node {
|
||||
ast::ItemFn(_, _, _, _, ref body) => {
|
||||
ast::ItemFn(_, _, _, _, _, ref body) => {
|
||||
// We assume this is a function.
|
||||
let fn_def_id = ast_util::local_def(id);
|
||||
let fn_scheme = lookup_item_type(cx, fn_def_id);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue