Skip to content

Commit

Permalink
Auto merge of #50317 - varkor:repr-align-assign, r=nagisa
Browse files Browse the repository at this point in the history
Improve error message for #[repr(align=x)]

Before:
```
error[E0552]: unrecognized representation hint
 --> src/main.rs:1:8
  |
1 | #[repr(align="8")]
  |        ^^^^^^^^^
```
After:
```
error[E0693]: incorrect `repr(align)` attribute format
 --> src/main.rs:1:8
  |
2 | #[repr(align="8")]
  |        ^^^^^^^^^ help: use parentheses instead: `align(8)`
```

Fixes #50314.
  • Loading branch information
bors committed Apr 29, 2018
2 parents 79252ff + 35fe299 commit 774a6a3
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 0 deletions.
24 changes: 24 additions & 0 deletions src/libsyntax/attr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1045,6 +1045,30 @@ pub fn find_repr_attrs(diagnostic: &Handler, attr: &Attribute) -> Vec<ReprAttr>
span_err!(diagnostic, item.span, E0589,
"invalid `repr(align)` attribute: {}", literal_error);
}
} else {
if let Some(meta_item) = item.meta_item() {
if meta_item.ident.name == "align" {
if let MetaItemKind::NameValue(ref value) = meta_item.node {
recognised = true;
let mut err = struct_span_err!(diagnostic, item.span, E0693,
"incorrect `repr(align)` attribute format");
match value.node {
ast::LitKind::Int(int, ast::LitIntType::Unsuffixed) => {
err.span_suggestion(item.span,
"use parentheses instead",
format!("align({})", int));
}
ast::LitKind::Str(s, _) => {
err.span_suggestion(item.span,
"use parentheses instead",
format!("align({})", s));
}
_ => {}
}
err.emit();
}
}
}
}
if !recognised {
// Not a word we recognize
Expand Down
1 change: 1 addition & 0 deletions src/libsyntax/diagnostic_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -324,4 +324,5 @@ register_diagnostics! {
E0589, // invalid `repr(align)` attribute
E0629, // missing 'feature' (rustc_const_unstable)
E0630, // rustc_const_unstable attribute must be paired with stable/unstable attribute
E0693, // incorrect `repr(align)` attribute format
}
17 changes: 17 additions & 0 deletions src/test/ui/repr-align-assign.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Copyright 2018 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.

#[repr(align=8)] //~ ERROR incorrect `repr(align)` attribute format
struct A(u64);

#[repr(align="8")] //~ ERROR incorrect `repr(align)` attribute format
struct B(u64);

fn main() {}
15 changes: 15 additions & 0 deletions src/test/ui/repr-align-assign.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
error[E0693]: incorrect `repr(align)` attribute format
--> $DIR/repr-align-assign.rs:11:8
|
LL | #[repr(align=8)] //~ ERROR incorrect `repr(align)` attribute format
| ^^^^^^^ help: use parentheses instead: `align(8)`

error[E0693]: incorrect `repr(align)` attribute format
--> $DIR/repr-align-assign.rs:14:8
|
LL | #[repr(align="8")] //~ ERROR incorrect `repr(align)` attribute format
| ^^^^^^^^^ help: use parentheses instead: `align(8)`

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0693`.

0 comments on commit 774a6a3

Please sign in to comment.