Auto merge of #95562 - lcnr:attr-no-encode, r=davidtwco · rust-lang/rust@481db40 (original) (raw)

`@@ -147,6 +147,16 @@ pub enum AttributeDuplicates {

`

147

147

`FutureWarnPreceding,

`

148

148

`}

`

149

149

``

``

150

`` +

/// A conveniece macro to deal with $($expr)?.

``

``

151

`+

macro_rules! or_default {

`

``

152

`+

($default:expr,) => {

`

``

153

`+

$default

`

``

154

`+

};

`

``

155

`+

($default:expr, $next:expr) => {

`

``

156

`+

$next

`

``

157

`+

};

`

``

158

`+

}

`

``

159

+

150

160

`/// A convenience macro for constructing attribute templates.

`

151

161

`` /// E.g., template!(Word, List: "description") means that the attribute

``

152

162

`` /// supports forms #[attr] and #[attr(description)].

``

`@@ -168,9 +178,10 @@ macro_rules! template {

`

168

178

`}

`

169

179

``

170

180

`macro_rules! ungated {

`

171

``

`-

($attr:ident, typ:expr,typ:expr, typ:expr,tpl:expr, duplicates:exprduplicates:expr duplicates:expr(,)?) => {

`

``

181

`+

($attr:ident, typ:expr,typ:expr, typ:expr,tpl:expr, duplicates:exprduplicates:expr duplicates:expr(, @only_local: onlylocal:expr)?only_local:expr)? onlylocal:expr)?(,)?) => {

`

172

182

`BuiltinAttribute {

`

173

183

` name: sym::$attr,

`

``

184

`+

only_local: or_default!(false, (((only_local)?),

`

174

185

` type_: $typ,

`

175

186

` template: $tpl,

`

176

187

` gate: Ungated,

`

`@@ -180,18 +191,20 @@ macro_rules! ungated {

`

180

191

`}

`

181

192

``

182

193

`macro_rules! gated {

`

183

``

`-

($attr:ident, typ:expr,typ:expr, typ:expr,tpl:expr, duplicates:expr,duplicates:expr, duplicates:expr,gate:ident, msg:exprmsg:expr msg:expr(,)?) => {

`

``

194

`+

($attr:ident, typ:expr,typ:expr, typ:expr,tpl:expr, duplicates:exprduplicates:expr duplicates:expr(, @only_local: onlylocal:expr)?,only_local:expr)?, onlylocal:expr)?,gate:ident, msg:exprmsg:expr msg:expr(,)?) => {

`

184

195

`BuiltinAttribute {

`

185

196

` name: sym::$attr,

`

``

197

`+

only_local: or_default!(false, (((only_local)?),

`

186

198

` type_: $typ,

`

187

199

` template: $tpl,

`

188

200

` duplicates: $duplicates,

`

189

201

` gate: Gated(Stability::Unstable, sym::$gate, msg,cfgfn!(msg, cfg_fn!(msg,cfgfn!(gate)),

`

190

202

`}

`

191

203

`};

`

192

``

`-

($attr:ident, typ:expr,typ:expr, typ:expr,tpl:expr, duplicates:expr,duplicates:expr, duplicates:expr,msg:expr $(,)?) => {

`

``

204

`+

($attr:ident, typ:expr,typ:expr, typ:expr,tpl:expr, duplicates:exprduplicates:expr duplicates:expr(, @only_local: onlylocal:expr)?,only_local:expr)?, onlylocal:expr)?,msg:expr $(,)?) => {

`

193

205

`BuiltinAttribute {

`

194

206

` name: sym::$attr,

`

``

207

`+

only_local: or_default!(false, (((only_local)?),

`

195

208

` type_: $typ,

`

196

209

` template: $tpl,

`

197

210

` duplicates: $duplicates,

`

`@@ -201,12 +214,13 @@ macro_rules! gated {

`

201

214

`}

`

202

215

``

203

216

`macro_rules! rustc_attr {

`

204

``

`-

(TEST, attr:ident,attr:ident, attr:ident,typ:expr, tpl:expr,tpl:expr, tpl:expr,duplicate:expr $(,)?) => {

`

``

217

`+

(TEST, attr:ident,attr:ident, attr:ident,typ:expr, tpl:expr,tpl:expr, tpl:expr,duplicate:expr (,@onlylocal:(, @only_local: (,@onlylocal:only_local:expr)? $(,)?) => {

`

205

218

` rustc_attr!(

`

206

219

` $attr,

`

207

220

` $typ,

`

208

221

` $tpl,

`

209

222

` $duplicate,

`

``

223

`+

(@onlylocal:(@only_local: (@onlylocal:only_local,)?

`

210

224

` concat!(

`

211

225

`` "the `#[",

``

212

226

` stringify!($attr),

`

`@@ -215,9 +229,10 @@ macro_rules! rustc_attr {

`

215

229

`),

`

216

230

`)

`

217

231

`};

`

218

``

`-

($attr:ident, typ:expr,typ:expr, typ:expr,tpl:expr, duplicates:expr,duplicates:expr, duplicates:expr,msg:expr $(,)?) => {

`

``

232

`+

($attr:ident, typ:expr,typ:expr, typ:expr,tpl:expr, duplicates:exprduplicates:expr duplicates:expr(, @only_local: onlylocal:expr)?,only_local:expr)?, onlylocal:expr)?,msg:expr $(,)?) => {

`

219

233

`BuiltinAttribute {

`

220

234

` name: sym::$attr,

`

``

235

`+

only_local: or_default!(false, (((only_local)?),

`

221

236

` type_: $typ,

`

222

237

` template: $tpl,

`

223

238

` duplicates: $duplicates,

`

`@@ -237,6 +252,10 @@ const INTERNAL_UNSTABLE: &str = "this is an internal attribute that will never b

`

237

252

``

238

253

`pub struct BuiltinAttribute {

`

239

254

`pub name: Symbol,

`

``

255

`+

/// Whether this attribute is only used in the local crate.

`

``

256

`+

///

`

``

257

`+

/// If so, it is not encoded in the crate metadata.

`

``

258

`+

pub only_local: bool,

`

240

259

`pub type_: AttributeType,

`

241

260

`pub template: AttributeTemplate,

`

242

261

`pub duplicates: AttributeDuplicates,

`

`@@ -295,7 +314,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[

`

295

314

`ungated!(must_use, Normal, template!(Word, NameValueStr: "reason"), FutureWarnFollowing),

`

296

315

`gated!(

`

297

316

` must_not_suspend, Normal, template!(Word, NameValueStr: "reason"), WarnFollowing,

`

298

``

`-

must_not_suspend, experimental!(must_not_suspend)

`

``

317

`+

experimental!(must_not_suspend)

`

299

318

`),

`

300

319

`ungated!(

`

301

320

` deprecated, Normal,

`

`@@ -324,8 +343,8 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[

`

324

343

`ungated!(repr, Normal, template!(List: "C"), DuplicatesOk),

`

325

344

`ungated!(export_name, Normal, template!(NameValueStr: "name"), FutureWarnPreceding),

`

326

345

`ungated!(link_section, Normal, template!(NameValueStr: "name"), FutureWarnPreceding),

`

327

``

`-

ungated!(no_mangle, Normal, template!(Word), WarnFollowing),

`

328

``

`-

ungated!(used, Normal, template!(Word, List: "compiler|linker"), WarnFollowing),

`

``

346

`+

ungated!(no_mangle, Normal, template!(Word), WarnFollowing, @only_local: true),

`

``

347

`+

ungated!(used, Normal, template!(Word, List: "compiler|linker"), WarnFollowing, @only_local: true),

`

329

348

``

330

349

`// Limits:

`

331

350

`ungated!(recursion_limit, CrateLevel, template!(NameValueStr: "N"), FutureWarnFollowing),

`

`@@ -358,8 +377,8 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[

`

358

377

`ungated!(panic_handler, Normal, template!(Word), WarnFollowing), // RFC 2070

`

359

378

``

360

379

`// Code generation:

`

361

``

`-

ungated!(inline, Normal, template!(Word, List: "always|never"), FutureWarnFollowing),

`

362

``

`-

ungated!(cold, Normal, template!(Word), WarnFollowing),

`

``

380

`+

ungated!(inline, Normal, template!(Word, List: "always|never"), FutureWarnFollowing, @only_local: true),

`

``

381

`+

ungated!(cold, Normal, template!(Word), WarnFollowing, @only_local: true),

`

363

382

`ungated!(no_builtins, CrateLevel, template!(Word), WarnFollowing),

`

364

383

`ungated!(target_feature, Normal, template!(List: r#"enable = "name""#), DuplicatesOk),

`

365

384

`ungated!(track_caller, Normal, template!(Word), WarnFollowing),

`

`@@ -385,7 +404,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[

`

385

404

`),

`

386

405

``

387

406

`// Linking:

`

388

``

`-

gated!(naked, Normal, template!(Word), WarnFollowing, naked_functions, experimental!(naked)),

`

``

407

`+

gated!(naked, Normal, template!(Word), WarnFollowing, @only_local: true, naked_functions, experimental!(naked)),

`

389

408

`gated!(

`

390

409

` link_ordinal, Normal, template!(List: "ordinal"), ErrorPreceding, raw_dylib,

`

391

410

` experimental!(link_ordinal)

`

`@@ -394,6 +413,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[

`

394

413

`// Plugins:

`

395

414

`BuiltinAttribute {

`

396

415

`name: sym::plugin,

`

``

416

`+

only_local: false,

`

397

417

`type_: CrateLevel,

`

398

418

`template: template!(List: "name"),

`

399

419

`duplicates: DuplicatesOk,

`

`@@ -475,7 +495,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[

`

475

495

`),

`

476

496

`// DuplicatesOk since it has its own validation

`

477

497

`ungated!(

`

478

``

`-

stable, Normal, template!(List: r#"feature = "name", since = "version""#), DuplicatesOk

`

``

498

`+

stable, Normal, template!(List: r#"feature = "name", since = "version""#), DuplicatesOk,

`

479

499

`),

`

480

500

`ungated!(

`

481

501

` unstable, Normal,

`

`@@ -546,11 +566,11 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[

`

546

566

`// ==========================================================================

`

547

567

``

548

568

`gated!(

`

549

``

`-

linkage, Normal, template!(NameValueStr: "external|internal|..."), ErrorPreceding,

`

``

569

`+

linkage, Normal, template!(NameValueStr: "external|internal|..."), ErrorPreceding, @only_local: true,

`

550

570

`` "the linkage attribute is experimental and not portable across platforms",

``

551

571

`),

`

552

572

`rustc_attr!(

`

553

``

`-

rustc_std_internal_symbol, Normal, template!(Word), WarnFollowing, INTERNAL_UNSTABLE

`

``

573

`+

rustc_std_internal_symbol, Normal, template!(Word), WarnFollowing, @only_local: true, INTERNAL_UNSTABLE

`

554

574

`),

`

555

575

``

556

576

`// ==========================================================================

`

`@@ -633,7 +653,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[

`

633

653

`// Internal attributes, Misc:

`

634

654

`// ==========================================================================

`

635

655

`gated!(

`

636

``

`-

lang, Normal, template!(NameValueStr: "name"), DuplicatesOk, lang_items,

`

``

656

`+

lang, Normal, template!(NameValueStr: "name"), DuplicatesOk, @only_local: true, lang_items,

`

637

657

`"language items are subject to change",

`

638

658

`),

`

639

659

`rustc_attr!(

`

`@@ -642,11 +662,11 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[

`

642

662

`"#[rustc_pass_by_value] is used to mark types that must be passed by value instead of reference."

`

643

663

`),

`

644

664

`rustc_attr!(

`

645

``

`-

rustc_coherence_is_core, AttributeType::CrateLevel, template!(Word), ErrorFollowing,

`

``

665

`+

rustc_coherence_is_core, AttributeType::CrateLevel, template!(Word), ErrorFollowing, @only_local: true,

`

646

666

`` "#![rustc_coherence_is_core] allows inherent methods on builtin types, only intended to be used in core."

``

647

667

`),

`

648

668

`rustc_attr!(

`

649

``

`-

rustc_allow_incoherent_impl, AttributeType::Normal, template!(Word), ErrorFollowing,

`

``

669

`+

rustc_allow_incoherent_impl, AttributeType::Normal, template!(Word), ErrorFollowing, @only_local: true,

`

650

670

`"#[rustc_allow_incoherent_impl] has to be added to all impl items of an incoherent inherent impl."

`

651

671

`),

`

652

672

`rustc_attr!(

`

`@@ -656,6 +676,8 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[

`

656

676

`),

`

657

677

`BuiltinAttribute {

`

658

678

`name: sym::rustc_diagnostic_item,

`

``

679

`` +

// FIXME: This can be true once we always use tcx.is_diagnostic_item.

``

``

680

`+

only_local: false,

`

659

681

`type_: Normal,

`

660

682

`template: template!(NameValueStr: "name"),

`

661

683

`duplicates: ErrorFollowing,

`

`@@ -676,7 +698,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[

`

676

698

`"unboxed_closures are still evolving",

`

677

699

`),

`

678

700

`rustc_attr!(

`

679

``

`-

rustc_inherit_overflow_checks, Normal, template!(Word), WarnFollowing,

`

``

701

`+

rustc_inherit_overflow_checks, Normal, template!(Word), WarnFollowing, @only_local: true,

`

680

702

`` "the #[rustc_inherit_overflow_checks] attribute is just used to control \

``

681

703

` overflow checking behavior of several libcore functions that are inlined \

`

682

704

` across crates and will never be stable",

`

`@@ -778,6 +800,10 @@ pub fn is_builtin_attr_name(name: Symbol) -> bool {

`

778

800

`BUILTIN_ATTRIBUTE_MAP.get(&name).is_some()

`

779

801

`}

`

780

802

``

``

803

`+

pub fn is_builtin_only_local(name: Symbol) -> bool {

`

``

804

`+

BUILTIN_ATTRIBUTE_MAP.get(&name).map_or(false, |attr| attr.only_local)

`

``

805

`+

}

`

``

806

+

781

807

`pub static BUILTIN_ATTRIBUTE_MAP: SyncLazy<FxHashMap<Symbol, &BuiltinAttribute>> =

`

782

808

`SyncLazy::new(|| {

`

783

809

`let mut map = FxHashMap::default();

`