Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature gate rust-call ABI. #23948

Merged
merged 2 commits into from
Apr 2, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions src/libsyntax/feature_gate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
use self::Status::*;
use self::AttributeType::*;

use abi::RustIntrinsic;
use abi::Abi;
use ast::NodeId;
use ast;
use attr;
Expand Down Expand Up @@ -511,7 +511,7 @@ impl<'a, 'v> Visitor<'v> for PostExpansionVisitor<'a> {
across platforms, it is recommended to \
use `#[link(name = \"foo\")]` instead")
}
if foreign_module.abi == RustIntrinsic {
if foreign_module.abi == Abi::RustIntrinsic {
self.gate_feature("intrinsics",
i.span,
"intrinsics are subject to change")
Expand Down Expand Up @@ -627,11 +627,17 @@ impl<'a, 'v> Visitor<'v> for PostExpansionVisitor<'a> {
span: Span,
_node_id: NodeId) {
match fn_kind {
visit::FkItemFn(_, _, _, abi) if abi == RustIntrinsic => {
visit::FkItemFn(_, _, _, abi) if abi == Abi::RustIntrinsic => {
self.gate_feature("intrinsics",
span,
"intrinsics are subject to change")
}
visit::FkItemFn(_, _, _, abi) |
visit::FkMethod(_, &ast::MethodSig { abi, .. }) if abi == Abi::RustCall => {
self.gate_feature("unboxed_closures",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should this say something other than unboxed_closures?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

from the tests, it looks like @nikomatsakis deliberately chose to (re?)use that feature name rather than add a new one ... ?

span,
"rust-call ABI is subject to change")
}
_ => {}
}
visit::walk_fn(self, fn_kind, fn_decl, block, span);
Expand Down
21 changes: 21 additions & 0 deletions src/test/compile-fail/feature-gate-rust-call.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

extern "rust-call" fn foo() { } //~ ERROR rust-call ABI is subject to change

trait Foo {
extern "rust-call" fn foo();
}

impl Foo for i32 {
extern "rust-call" fn foo() { } //~ ERROR rust-call ABI is subject to change
}

fn main() { }
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,23 @@

struct Foo;
impl Fn<()> for Foo {
//~^ ERROR angle-bracket notation is not stable when used with the `Fn` family of traits
extern "rust-call" fn call(self, args: ()) -> () {}
//~^ ERROR rust-call ABI is subject to change
}
struct Foo1;
impl FnOnce() for Foo1 {
//~^ ERROR associated type bindings are not allowed here
extern "rust-call" fn call_once(self, args: ()) -> () {}
//~^ ERROR rust-call ABI is subject to change
}
struct Bar;
impl FnMut<()> for Bar {
//~^ ERROR angle-bracket notation is not stable when used with the `Fn` family of traits
extern "rust-call" fn call_mut(&self, args: ()) -> () {}
//~^ ERROR rust-call ABI is subject to change
}
struct Baz;
impl FnOnce<()> for Baz {
//~^ ERROR angle-bracket notation is not stable when used with the `Fn` family of traits
extern "rust-call" fn call_once(&self, args: ()) -> () {}
//~^ ERROR rust-call ABI is subject to change
}

fn main() {}
2 changes: 2 additions & 0 deletions src/test/run-make/rustdoc-extern-method/bar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(unboxed_closures)]

extern crate foo;

// @has bar/trait.Foo.html //pre "pub trait Foo"
Expand Down
1 change: 1 addition & 0 deletions src/test/run-make/rustdoc-extern-method/foo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
// except according to those terms.

#![crate_type="lib"]
#![feature(unboxed_closures)]

pub trait Foo {
extern "rust-call" fn foo(&self, _: ()) -> i32;
Expand Down