Skip to content

Commit

Permalink
Rollup merge of rust-lang#48752 - alexcrichton:fix-target-feature, r=…
Browse files Browse the repository at this point in the history
…michaelwoerister

rustc: Fix ICE with `#[target_feature]` on module

This commit fixes an ICE in rustc when `#[target_feature]` was applied to items
other than functions due to the way the feature was validated.
  • Loading branch information
Manishearth authored Mar 8, 2018
2 parents 7c581b0 + 4bde92c commit c8a73e4
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 2 deletions.
8 changes: 7 additions & 1 deletion src/librustc/hir/check_attr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,13 @@ struct CheckAttrVisitor<'a, 'tcx: 'a> {
impl<'a, 'tcx> CheckAttrVisitor<'a, 'tcx> {
/// Check any attribute.
fn check_attributes(&self, item: &hir::Item, target: Target) {
self.tcx.trans_fn_attrs(self.tcx.hir.local_def_id(item.id));
if target == Target::Fn {
self.tcx.trans_fn_attrs(self.tcx.hir.local_def_id(item.id));
} else if let Some(a) = item.attrs.iter().find(|a| a.check_name("target_feature")) {
self.tcx.sess.struct_span_err(a.span, "attribute should be applied to a function")
.span_label(item.span, "not a function")
.emit();
}

for attr in &item.attrs {
if let Some(name) = attr.name() {
Expand Down
1 change: 1 addition & 0 deletions src/librustc_typeck/collect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1866,6 +1866,7 @@ fn trans_fn_attrs<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, id: DefId) -> TransFnAt
.emit();
}
} else if attr.check_name("target_feature") {
// handle deprecated #[target_feature = "..."]
if let Some(val) = attr.value_str() {
for feat in val.as_str().split(",").map(|f| f.trim()) {
if !feat.is_empty() && !feat.contains('\0') {
Expand Down
4 changes: 4 additions & 0 deletions src/test/ui/target-feature-wrong.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ unsafe fn foo() {}
//~^ ERROR: can only be applied to `unsafe` function
fn bar() {}

#[target_feature(enable = "sse2")]
//~^ ERROR: should be applied to a function
mod another {}

fn main() {
unsafe {
foo();
Expand Down
11 changes: 10 additions & 1 deletion src/test/ui/target-feature-wrong.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,14 @@ error: #[target_feature(..)] can only be applied to `unsafe` function
LL | #[target_feature(enable = "sse2")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 4 previous errors
error: attribute should be applied to a function
--> $DIR/target-feature-wrong.rs:32:1
|
LL | #[target_feature(enable = "sse2")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LL | //~^ ERROR: should be applied to a function
LL | mod another {}
| -------------- not a function

error: aborting due to 5 previous errors

0 comments on commit c8a73e4

Please sign in to comment.