about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorDavid Wood <david@davidtw.co>2020-08-04 10:27:35 +0100
committerDavid Wood <david@davidtw.co>2020-08-16 15:42:20 +0100
commit764dc3dc2f8a2a421fa9d9c6144ad75310a26b99 (patch)
tree33c52d52a4c60664b27f429b7baff690d8fa3e79 /src
parent97ba0c7171c4d2d9b899a2bd8e40a8974c47b86d (diff)
downloadrust-764dc3dc2f8a2a421fa9d9c6144ad75310a26b99.tar.gz
rust-764dc3dc2f8a2a421fa9d9c6144ad75310a26b99.zip
lang_items: add support for lang items on variants
This commit adds support for lang items (`#[lang = "..."]` attributes)
on enum variants.

Signed-off-by: David Wood <david@davidtw.co>
Diffstat (limited to 'src')
-rw-r--r--src/librustc_hir/target.rs2
-rw-r--r--src/librustc_passes/lang_items.rs8
2 files changed, 9 insertions, 1 deletions
diff --git a/src/librustc_hir/target.rs b/src/librustc_hir/target.rs
index 3a4485a1b17..1efc8bc3124 100644
--- a/src/librustc_hir/target.rs
+++ b/src/librustc_hir/target.rs
@@ -29,6 +29,7 @@ pub enum Target {
     TyAlias,
     OpaqueTy,
     Enum,
+    Variant,
     Struct,
     Union,
     Trait,
@@ -62,6 +63,7 @@ impl Display for Target {
                 Target::TyAlias => "type alias",
                 Target::OpaqueTy => "opaque type",
                 Target::Enum => "enum",
+                Target::Variant => "enum variant",
                 Target::Struct => "struct",
                 Target::Union => "union",
                 Target::Trait => "trait",
diff --git a/src/librustc_passes/lang_items.rs b/src/librustc_passes/lang_items.rs
index 07415870549..9ec47d2d9ab 100644
--- a/src/librustc_passes/lang_items.rs
+++ b/src/librustc_passes/lang_items.rs
@@ -30,7 +30,13 @@ struct LanguageItemCollector<'tcx> {
 
 impl ItemLikeVisitor<'v> for LanguageItemCollector<'tcx> {
     fn visit_item(&mut self, item: &hir::Item<'_>) {
-        self.check_for_lang(Target::from_item(item), item.hir_id, item.attrs)
+        self.check_for_lang(Target::from_item(item), item.hir_id, item.attrs);
+
+        if let hir::ItemKind::Enum(def, ..) = &item.kind {
+            for variant in def.variants {
+                self.check_for_lang(Target::Variant, variant.id, variant.attrs);
+            }
+        }
     }
 
     fn visit_trait_item(&mut self, trait_item: &hir::TraitItem<'_>) {