Skip to content

Commit a008b38

Browse files
authored
Unrolled build for #128581
Rollup merge of #128581 - jieyouxu:checked-attr, r=nnethercote Assert that all attributes are actually checked via `CheckAttrVisitor` and aren't accidentally usable on completely unrelated HIR nodes ``@oli-obk's`` #128444 with unreachable case removed to avoid that PR bitrotting away. Based on #128402. This PR will make adding a new attribute ICE on any use of that attribute unless it gets a handler added in `rustc_passes::CheckAttrVisitor`. r? ``@nnethercote`` (since you were the reviewer of the original PR)
2 parents bbf60c8 + 33cb334 commit a008b38

File tree

6 files changed

+104
-6
lines changed

6 files changed

+104
-6
lines changed

compiler/rustc_feature/src/builtin_attrs.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -703,21 +703,21 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
703703
EncodeCrossCrate::No, allocator_internals, experimental!(needs_allocator),
704704
),
705705
gated!(
706-
panic_runtime, Normal, template!(Word), WarnFollowing,
706+
panic_runtime, CrateLevel, template!(Word), WarnFollowing,
707707
EncodeCrossCrate::No, experimental!(panic_runtime)
708708
),
709709
gated!(
710-
needs_panic_runtime, Normal, template!(Word), WarnFollowing,
710+
needs_panic_runtime, CrateLevel, template!(Word), WarnFollowing,
711711
EncodeCrossCrate::No, experimental!(needs_panic_runtime)
712712
),
713713
gated!(
714-
compiler_builtins, Normal, template!(Word), WarnFollowing,
714+
compiler_builtins, CrateLevel, template!(Word), WarnFollowing,
715715
EncodeCrossCrate::No,
716716
"the `#[compiler_builtins]` attribute is used to identify the `compiler_builtins` crate \
717717
which contains compiler-rt intrinsics and will never be stable",
718718
),
719719
gated!(
720-
profiler_runtime, Normal, template!(Word), WarnFollowing,
720+
profiler_runtime, CrateLevel, template!(Word), WarnFollowing,
721721
EncodeCrossCrate::No,
722722
"the `#[profiler_runtime]` attribute is used to identify the `profiler_builtins` crate \
723723
which contains the profiler runtime and will never be stable",

compiler/rustc_passes/messages.ftl

+4
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ passes_continue_labeled_block =
100100
.label = labeled blocks cannot be `continue`'d
101101
.block_label = labeled block the `continue` points to
102102
103+
passes_coroutine_on_non_closure =
104+
attribute should be applied to closures
105+
.label = not a closure
106+
103107
passes_coverage_not_fn_or_closure =
104108
attribute should be applied to a function definition or closure
105109
.label = not a function or closure

compiler/rustc_passes/src/check_attr.rs

+64-2
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ use rustc_hir::{
2020
TraitItem, CRATE_HIR_ID, CRATE_OWNER_ID,
2121
};
2222
use rustc_macros::LintDiagnostic;
23-
use rustc_middle::bug;
2423
use rustc_middle::hir::nested_filter;
2524
use rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault;
2625
use rustc_middle::query::Providers;
2726
use rustc_middle::traits::ObligationCause;
2827
use rustc_middle::ty::error::{ExpectedFound, TypeError};
2928
use rustc_middle::ty::{self, TyCtxt};
29+
use rustc_middle::{bug, span_bug};
3030
use rustc_session::lint::builtin::{
3131
CONFLICTING_REPR_HINTS, INVALID_DOC_ATTRIBUTES, INVALID_MACRO_EXPORT_ARGUMENTS,
3232
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES, UNUSED_ATTRIBUTES,
@@ -239,7 +239,59 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
239239
self.check_generic_attr(hir_id, attr, target, Target::Fn);
240240
self.check_proc_macro(hir_id, target, ProcMacroKind::Derive)
241241
}
242-
_ => {}
242+
[sym::coroutine] => {
243+
self.check_coroutine(attr, target);
244+
}
245+
[
246+
// ok
247+
sym::allow
248+
| sym::expect
249+
| sym::warn
250+
| sym::deny
251+
| sym::forbid
252+
| sym::cfg
253+
// need to be fixed
254+
| sym::cfi_encoding // FIXME(cfi_encoding)
255+
| sym::may_dangle // FIXME(dropck_eyepatch)
256+
| sym::pointee // FIXME(derive_smart_pointer)
257+
| sym::linkage // FIXME(linkage)
258+
| sym::no_sanitize // FIXME(no_sanitize)
259+
| sym::omit_gdb_pretty_printer_section // FIXME(omit_gdb_pretty_printer_section)
260+
| sym::used // handled elsewhere to restrict to static items
261+
| sym::repr // handled elsewhere to restrict to type decls items
262+
| sym::instruction_set // broken on stable!!!
263+
| sym::windows_subsystem // broken on stable!!!
264+
| sym::patchable_function_entry // FIXME(patchable_function_entry)
265+
| sym::deprecated_safe // FIXME(deprecated_safe)
266+
// internal
267+
| sym::prelude_import
268+
| sym::panic_handler
269+
| sym::allow_internal_unsafe
270+
| sym::fundamental
271+
| sym::lang
272+
| sym::needs_allocator
273+
| sym::default_lib_allocator
274+
| sym::start
275+
| sym::custom_mir,
276+
] => {}
277+
[name, ..] => {
278+
match BUILTIN_ATTRIBUTE_MAP.get(name) {
279+
// checked below
280+
Some(BuiltinAttribute { type_: AttributeType::CrateLevel, .. }) => {}
281+
Some(_) => {
282+
// FIXME: differentiate between unstable and internal attributes just like we do with features instead
283+
// of just accepting `rustc_` attributes by name. That should allow trimming the above list, too.
284+
if !name.as_str().starts_with("rustc_") {
285+
span_bug!(
286+
attr.span,
287+
"builtin attribute {name:?} not handled by `CheckAttrVisitor`"
288+
)
289+
}
290+
}
291+
None => (),
292+
}
293+
}
294+
[] => unreachable!(),
243295
}
244296

245297
let builtin = attr.ident().and_then(|ident| BUILTIN_ATTRIBUTE_MAP.get(&ident.name));
@@ -376,6 +428,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
376428

377429
/// Checks that `#[optimize(..)]` is applied to a function/closure/method,
378430
/// or to an impl block or module.
431+
// FIXME(#128488): this should probably be elevated to an error?
379432
fn check_optimize(&self, hir_id: HirId, attr: &Attribute, target: Target) {
380433
match target {
381434
Target::Fn
@@ -2279,6 +2332,15 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
22792332
self.abort.set(true);
22802333
}
22812334
}
2335+
2336+
fn check_coroutine(&self, attr: &Attribute, target: Target) {
2337+
match target {
2338+
Target::Closure => return,
2339+
_ => {
2340+
self.dcx().emit_err(errors::CoroutineOnNonClosure { span: attr.span });
2341+
}
2342+
}
2343+
}
22822344
}
22832345

22842346
impl<'tcx> Visitor<'tcx> for CheckAttrVisitor<'tcx> {

compiler/rustc_passes/src/errors.rs

+7
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,13 @@ pub struct Confusables {
636636
pub attr_span: Span,
637637
}
638638

639+
#[derive(Diagnostic)]
640+
#[diag(passes_coroutine_on_non_closure)]
641+
pub struct CoroutineOnNonClosure {
642+
#[primary_span]
643+
pub span: Span,
644+
}
645+
639646
#[derive(Diagnostic)]
640647
#[diag(passes_empty_confusables)]
641648
pub(crate) struct EmptyConfusables {
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//! The `coroutine` attribute is only allowed on closures.
2+
3+
#![feature(coroutines)]
4+
5+
#[coroutine]
6+
//~^ ERROR: attribute should be applied to closures
7+
struct Foo;
8+
9+
#[coroutine]
10+
//~^ ERROR: attribute should be applied to closures
11+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
error: attribute should be applied to closures
2+
--> $DIR/invalid_attr_usage.rs:5:1
3+
|
4+
LL | #[coroutine]
5+
| ^^^^^^^^^^^^
6+
7+
error: attribute should be applied to closures
8+
--> $DIR/invalid_attr_usage.rs:9:1
9+
|
10+
LL | #[coroutine]
11+
| ^^^^^^^^^^^^
12+
13+
error: aborting due to 2 previous errors
14+

0 commit comments

Comments
 (0)