From a815f753bc441d8eeb0f664e27c5a3d5322900e1 Mon Sep 17 00:00:00 2001 From: varkor Date: Sun, 29 Apr 2018 18:42:43 +0100 Subject: [PATCH 1/2] Add error when using repr(align=x) instead of repr(align(x)) --- src/libsyntax/attr.rs | 24 ++++++++++++++++++++++++ src/libsyntax/diagnostic_list.rs | 1 + 2 files changed, 25 insertions(+) diff --git a/src/libsyntax/attr.rs b/src/libsyntax/attr.rs index c68a743303a27..f0557277267a5 100644 --- a/src/libsyntax/attr.rs +++ b/src/libsyntax/attr.rs @@ -1045,6 +1045,30 @@ pub fn find_repr_attrs(diagnostic: &Handler, attr: &Attribute) -> Vec 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 diff --git a/src/libsyntax/diagnostic_list.rs b/src/libsyntax/diagnostic_list.rs index bb7988e64bce9..c9cac1b11427a 100644 --- a/src/libsyntax/diagnostic_list.rs +++ b/src/libsyntax/diagnostic_list.rs @@ -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 } From 35fe2998c0c555c978617913771691e384670486 Mon Sep 17 00:00:00 2001 From: varkor Date: Sun, 29 Apr 2018 18:46:41 +0100 Subject: [PATCH 2/2] Add test for repr(align=x) --- src/test/ui/repr-align-assign.rs | 17 +++++++++++++++++ src/test/ui/repr-align-assign.stderr | 15 +++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 src/test/ui/repr-align-assign.rs create mode 100644 src/test/ui/repr-align-assign.stderr diff --git a/src/test/ui/repr-align-assign.rs b/src/test/ui/repr-align-assign.rs new file mode 100644 index 0000000000000..c9780dde235bc --- /dev/null +++ b/src/test/ui/repr-align-assign.rs @@ -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 or the MIT license +// , 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() {} diff --git a/src/test/ui/repr-align-assign.stderr b/src/test/ui/repr-align-assign.stderr new file mode 100644 index 0000000000000..1fa1263b9467e --- /dev/null +++ b/src/test/ui/repr-align-assign.stderr @@ -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`.