Skip to content

Commit 096e8c2

Browse files
eddybnikomatsakis
authored andcommitted
syntax: parse const fn for free functions and inherent methods.
1 parent 6d718f2 commit 096e8c2

File tree

34 files changed

+218
-88
lines changed

34 files changed

+218
-88
lines changed

src/librustc/metadata/encoder.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,7 +1049,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
10491049
encode_stability(rbml_w, stab);
10501050
rbml_w.end_tag();
10511051
}
1052-
ast::ItemFn(ref decl, _, _, ref generics, _) => {
1052+
ast::ItemFn(ref decl, _, _, _, ref generics, _) => {
10531053
add_to_index(item, rbml_w, index);
10541054
rbml_w.start_tag(tag_items_data_item);
10551055
encode_def_id(rbml_w, def_id);
@@ -1967,7 +1967,7 @@ fn encode_reachable_extern_fns(ecx: &EncodeContext, rbml_w: &mut Encoder) {
19671967

19681968
for id in ecx.reachable {
19691969
if let Some(ast_map::NodeItem(i)) = ecx.tcx.map.find(*id) {
1970-
if let ast::ItemFn(_, _, abi, ref generics, _) = i.node {
1970+
if let ast::ItemFn(_, _, _, abi, ref generics, _) = i.node {
19711971
if abi != abi::Rust && !generics.is_type_parameterized() {
19721972
rbml_w.wr_tagged_u32(tag_reachable_extern_fn_id, *id);
19731973
}

src/librustc/middle/effect.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ impl<'a, 'tcx, 'v> Visitor<'v> for EffectCheckVisitor<'a, 'tcx> {
8787
block: &'v ast::Block, span: Span, _: ast::NodeId) {
8888

8989
let (is_item_fn, is_unsafe_fn) = match fn_kind {
90-
visit::FkItemFn(_, _, fn_style, _, _) =>
91-
(true, fn_style == ast::Unsafety::Unsafe),
90+
visit::FkItemFn(_, _, unsafety, _, _) =>
91+
(true, unsafety == ast::Unsafety::Unsafe),
9292
visit::FkMethod(_, sig, _) =>
9393
(true, sig.unsafety == ast::Unsafety::Unsafe),
9494
_ => (false, false),

src/librustc/middle/infer/error_reporting.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ trait ErrorReportingHelpers<'tcx> {
158158
fn give_expl_lifetime_param(&self,
159159
decl: &ast::FnDecl,
160160
unsafety: ast::Unsafety,
161+
constness: ast::Constness,
161162
ident: ast::Ident,
162163
opt_explicit_self: Option<&ast::ExplicitSelf_>,
163164
generics: &ast::Generics,
@@ -826,8 +827,9 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
826827
Some(ref node) => match *node {
827828
ast_map::NodeItem(ref item) => {
828829
match item.node {
829-
ast::ItemFn(ref fn_decl, pur, _, ref gen, _) => {
830-
Some((fn_decl, gen, pur, item.ident, None, item.span))
830+
ast::ItemFn(ref fn_decl, unsafety, constness, _, ref gen, _) => {
831+
Some((fn_decl, gen, unsafety, constness,
832+
item.ident, None, item.span))
831833
},
832834
_ => None
833835
}
@@ -838,6 +840,7 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
838840
Some((&sig.decl,
839841
&sig.generics,
840842
sig.unsafety,
843+
sig.constness,
841844
item.ident,
842845
Some(&sig.explicit_self.node),
843846
item.span))
@@ -852,6 +855,7 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
852855
Some((&sig.decl,
853856
&sig.generics,
854857
sig.unsafety,
858+
sig.constness,
855859
item.ident,
856860
Some(&sig.explicit_self.node),
857861
item.span))
@@ -863,12 +867,12 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
863867
},
864868
None => None
865869
};
866-
let (fn_decl, generics, unsafety, ident, expl_self, span)
870+
let (fn_decl, generics, unsafety, constness, ident, expl_self, span)
867871
= node_inner.expect("expect item fn");
868872
let rebuilder = Rebuilder::new(self.tcx, fn_decl, expl_self,
869873
generics, same_regions, &life_giver);
870874
let (fn_decl, expl_self, generics) = rebuilder.rebuild();
871-
self.give_expl_lifetime_param(&fn_decl, unsafety, ident,
875+
self.give_expl_lifetime_param(&fn_decl, unsafety, constness, ident,
872876
expl_self.as_ref(), &generics, span);
873877
}
874878
}
@@ -1423,12 +1427,13 @@ impl<'a, 'tcx> ErrorReportingHelpers<'tcx> for InferCtxt<'a, 'tcx> {
14231427
fn give_expl_lifetime_param(&self,
14241428
decl: &ast::FnDecl,
14251429
unsafety: ast::Unsafety,
1430+
constness: ast::Constness,
14261431
ident: ast::Ident,
14271432
opt_explicit_self: Option<&ast::ExplicitSelf_>,
14281433
generics: &ast::Generics,
14291434
span: codemap::Span) {
1430-
let suggested_fn = pprust::fun_to_string(decl, unsafety, ident,
1431-
opt_explicit_self, generics);
1435+
let suggested_fn = pprust::fun_to_string(decl, unsafety, constness, ident,
1436+
opt_explicit_self, generics);
14321437
let msg = format!("consider using an explicit lifetime \
14331438
parameter as shown: {}", suggested_fn);
14341439
self.tcx.sess.span_help(span, &msg[..]);
@@ -1710,7 +1715,7 @@ fn lifetimes_in_scope(tcx: &ty::ctxt,
17101715
let method_id_opt = match tcx.map.find(parent) {
17111716
Some(node) => match node {
17121717
ast_map::NodeItem(item) => match item.node {
1713-
ast::ItemFn(_, _, _, ref gen, _) => {
1718+
ast::ItemFn(_, _, _, _, ref gen, _) => {
17141719
taken.push_all(&gen.lifetimes);
17151720
None
17161721
},

src/librustc/middle/reachable.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ fn item_might_be_inlined(item: &ast::Item) -> bool {
4646

4747
match item.node {
4848
ast::ItemImpl(_, _, ref generics, _, _, _) |
49-
ast::ItemFn(_, _, _, ref generics, _) => {
49+
ast::ItemFn(_, _, _, _, ref generics, _) => {
5050
generics_require_inlining(generics)
5151
}
5252
_ => false,
@@ -256,7 +256,7 @@ impl<'a, 'tcx> ReachableContext<'a, 'tcx> {
256256
// but all other rust-only interfaces can be private (they will not
257257
// participate in linkage after this product is produced)
258258
if let ast_map::NodeItem(item) = *node {
259-
if let ast::ItemFn(_, _, abi, _, _) = item.node {
259+
if let ast::ItemFn(_, _, _, abi, _, _) = item.node {
260260
if abi != abi::Rust {
261261
self.reachable_symbols.insert(search_item);
262262
}
@@ -273,7 +273,7 @@ impl<'a, 'tcx> ReachableContext<'a, 'tcx> {
273273
match *node {
274274
ast_map::NodeItem(item) => {
275275
match item.node {
276-
ast::ItemFn(_, _, _, _, ref search_block) => {
276+
ast::ItemFn(_, _, _, _, _, ref search_block) => {
277277
if item_might_be_inlined(&*item) {
278278
visit::walk_block(self, &**search_block)
279279
}

src/librustc/middle/resolve_lifetime.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ impl<'a, 'v> Visitor<'v> for LifetimeContext<'a> {
154154
fn visit_fn(&mut self, fk: visit::FnKind<'v>, fd: &'v ast::FnDecl,
155155
b: &'v ast::Block, s: Span, _: ast::NodeId) {
156156
match fk {
157-
visit::FkItemFn(_, generics, _, _, _) => {
157+
visit::FkItemFn(_, generics, _, _, _, _) => {
158158
self.visit_early_late(subst::FnSpace, generics, |this| {
159159
this.walk_fn(fk, fd, b, s)
160160
})

src/librustc/middle/stability.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use syntax::{attr, visit};
2323
use syntax::ast;
2424
use syntax::ast::{Attribute, Block, Crate, DefId, FnDecl, NodeId, Variant};
2525
use syntax::ast::{Item, Generics, StructField};
26-
use syntax::ast_util::is_local;
26+
use syntax::ast_util::{is_local, PostExpansionMethod};
2727
use syntax::attr::{Stability, AttrMetaMethods};
2828
use syntax::visit::{FnKind, Visitor};
2929
use syntax::feature_gate::emit_feature_err;

src/librustc/middle/ty.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2428,7 +2428,7 @@ impl<'a, 'tcx> ParameterEnvironment<'a, 'tcx> {
24282428
}
24292429
Some(ast_map::NodeItem(item)) => {
24302430
match item.node {
2431-
ast::ItemFn(_, _, _, _, ref body) => {
2431+
ast::ItemFn(_, _, _, _, _, ref body) => {
24322432
// We assume this is a function.
24332433
let fn_def_id = ast_util::local_def(id);
24342434
let fn_scheme = lookup_item_type(cx, fn_def_id);

src/librustc_lint/builtin.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -977,7 +977,7 @@ impl LintPass for NonSnakeCase {
977977
},
978978
_ => (),
979979
},
980-
visit::FkItemFn(ident, _, _, _, _) => {
980+
visit::FkItemFn(ident, _, _, _, _, _) => {
981981
self.check_snake_case(cx, "function", &token::get_ident(ident), Some(span))
982982
},
983983
_ => (),
@@ -1853,7 +1853,7 @@ impl LintPass for UnconditionalRecursion {
18531853
ast::NodeId, ast::NodeId, ast::Ident, ast::NodeId) -> bool;
18541854

18551855
let (name, checker) = match fn_kind {
1856-
visit::FkItemFn(name, _, _, _, _) => (name, id_refers_to_this_fn as F),
1856+
visit::FkItemFn(name, _, _, _, _, _) => (name, id_refers_to_this_fn as F),
18571857
visit::FkMethod(name, _, _) => (name, id_refers_to_this_method as F),
18581858
// closures can't recur, so they don't matter.
18591859
visit::FkFnBlock => return

src/librustc_resolve/build_reduced_graph.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ impl<'a, 'b:'a, 'tcx:'b> GraphBuilder<'a, 'b, 'tcx> {
425425
.define_value(DefConst(local_def(item.id)), sp, modifiers);
426426
parent.clone()
427427
}
428-
ItemFn(_, _, _, _, _) => {
428+
ItemFn(_, _, _, _, _, _) => {
429429
let name_bindings = self.add_child(name, parent, ForbidDuplicateValues, sp);
430430

431431
let def = DefFn(local_def(item.id), false);

src/librustc_resolve/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1809,7 +1809,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
18091809
ItemRibKind),
18101810
|this| visit::walk_item(this, item));
18111811
}
1812-
ItemFn(_, _, _, ref generics, _) => {
1812+
ItemFn(_, _, _, _, ref generics, _) => {
18131813
self.with_type_parameter_rib(HasTypeParameters(generics,
18141814
FnSpace,
18151815
ItemRibKind),

0 commit comments

Comments
 (0)