@@ -36,13 +36,18 @@ use rustc_session::lint::builtin::{
3636} ;
3737use rustc_session:: parse:: feature_err;
3838use rustc_span:: { BytePos , DUMMY_SP , Span , Symbol , edition, sym} ;
39+ use rustc_target:: spec:: BinaryFormat ;
3940use rustc_trait_selection:: error_reporting:: InferCtxtErrorExt ;
4041use rustc_trait_selection:: infer:: { TyCtxtInferExt , ValuePairs } ;
4142use rustc_trait_selection:: traits:: ObligationCtxt ;
4243use tracing:: debug;
4344
4445use crate :: { errors, fluent_generated as fluent} ;
4546
47+ // Max alignment supported for PE-COFF binary format.
48+ // See https://learn.microsoft.com/en-us/cpp/cpp/align-cpp?view=msvc-170
49+ const COFF_MAX_ALIGN_BYTES : usize = 0x2000 ;
50+
4651#[ derive( LintDiagnostic ) ]
4752#[ diag( passes_diagnostic_diagnostic_on_unimplemented_only_for_traits) ]
4853struct DiagnosticOnUnimplementedOnlyForTraits ;
@@ -2132,6 +2137,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
21322137 }
21332138
21342139 fn check_align_value ( & self , align : Align , span : Span ) {
2140+ if self . tcx . sess . target . binary_format == BinaryFormat :: Coff {
2141+ if align. bytes ( ) > COFF_MAX_ALIGN_BYTES {
2142+ self . dcx ( ) . emit_err ( errors:: InvalidReprAlignForCoff { span } ) ;
2143+ }
2144+ }
2145+
21352146 if align. bytes ( ) > 2_u64 . pow ( 29 ) {
21362147 // for values greater than 2^29, a different error will be emitted, make sure that happens
21372148 self . dcx ( ) . span_delayed_bug (
0 commit comments