@@ -1741,12 +1741,46 @@ impl CheckAttrVisitor<'_> {
17411741 }
17421742
17431743 fn check_used ( & self , attrs : & [ Attribute ] , target : Target ) {
1744+ let mut used_linker_span = None ;
1745+ let mut used_compiler_span = None ;
17441746 for attr in attrs {
17451747 if attr. has_name ( sym:: used) && target != Target :: Static {
17461748 self . tcx
17471749 . sess
17481750 . span_err ( attr. span , "attribute must be applied to a `static` variable" ) ;
17491751 }
1752+ let inner = attr. meta_item_list ( ) ;
1753+ match inner. as_deref ( ) {
1754+ Some ( [ item] ) if item. has_name ( sym:: linker) => {
1755+ if used_linker_span. is_none ( ) {
1756+ used_linker_span = Some ( attr. span ) ;
1757+ }
1758+ }
1759+ Some ( [ item] ) if item. has_name ( sym:: compiler) => {
1760+ if used_compiler_span. is_none ( ) {
1761+ used_compiler_span = Some ( attr. span ) ;
1762+ }
1763+ }
1764+ Some ( _) => {
1765+ // This error case is handled in rustc_typeck::collect.
1766+ }
1767+ None => {
1768+ // Default case (compiler) when arg isn't defined.
1769+ if used_compiler_span. is_none ( ) {
1770+ used_compiler_span = Some ( attr. span ) ;
1771+ }
1772+ }
1773+ }
1774+ }
1775+ if let ( Some ( linker_span) , Some ( compiler_span) ) = ( used_linker_span, used_compiler_span) {
1776+ let spans = vec ! [ linker_span, compiler_span] ;
1777+ self . tcx
1778+ . sess
1779+ . struct_span_err (
1780+ spans,
1781+ "`used(compiler)` and `used(linker)` can't be used together" ,
1782+ )
1783+ . emit ( ) ;
17501784 }
17511785 }
17521786
0 commit comments