diff --git a/src/librustc_target/abi/mod.rs b/src/librustc_target/abi/mod.rs
index f73085196f4..fd1f779f9ec 100644
--- a/src/librustc_target/abi/mod.rs
+++ b/src/librustc_target/abi/mod.rs
@@ -326,9 +326,9 @@ impl AddAssign for Size {
}
/// Alignment of a type in bytes, both ABI-mandated and preferred.
-/// Each field is a power of two, giving the alignment a maximum value of
-/// 2(28 - 1), which is limited by LLVM to a i32,
-/// with a maximum capacity of 231 - 1 or 2147483647.
+/// Each field is a power of two, giving the alignment a maximum value
+/// of 2(28 - 1), which is limited by LLVM to a
+/// maximum capacity of 229 or 536870912.
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, RustcEncodable, RustcDecodable)]
pub struct Align {
abi_pow2: u8,
@@ -356,7 +356,7 @@ impl Align {
}
if bytes != 1 {
Err(format!("`{}` is not a power of 2", align))
- } else if pow > 30 {
+ } else if pow > 29 {
Err(format!("`{}` is too large", align))
} else {
Ok(pow)
diff --git a/src/libsyntax/attr.rs b/src/libsyntax/attr.rs
index f0557277267..13f8bb9a318 100644
--- a/src/libsyntax/attr.rs
+++ b/src/libsyntax/attr.rs
@@ -1012,11 +1012,11 @@ pub fn find_repr_attrs(diagnostic: &Handler, attr: &Attribute) -> Vec
let parse_alignment = |node: &ast::LitKind| -> Result {
if let ast::LitKind::Int(literal, ast::LitIntType::Unsuffixed) = node {
if literal.is_power_of_two() {
- // rustc::ty::layout::Align restricts align to <= 2147483647
- if *literal <= 2147483647 {
+ // rustc::ty::layout::Align restricts align to <= 2^29
+ if *literal <= 1 << 29 {
Ok(*literal as u32)
} else {
- Err("larger than 2147483647")
+ Err("larger than 2^29")
}
} else {
Err("not a power of two")
diff --git a/src/test/compile-fail/repr-align.rs b/src/test/compile-fail/repr-align.rs
index 7c8eb6a2de9..9b0408de2a4 100644
--- a/src/test/compile-fail/repr-align.rs
+++ b/src/test/compile-fail/repr-align.rs
@@ -15,7 +15,10 @@ struct A(i32);
#[repr(align(15))] //~ ERROR: invalid `repr(align)` attribute: not a power of two
struct B(i32);
-#[repr(align(4294967296))] //~ ERROR: invalid `repr(align)` attribute: larger than 2147483647
+#[repr(align(4294967296))] //~ ERROR: invalid `repr(align)` attribute: larger than 2^29
struct C(i32);
+#[repr(align(536870912))] // ok: this is the largest accepted alignment
+struct D(i32);
+
fn main() {}