]> git.lizzy.rs Git - rust.git/commitdiff
Fix cross-crate visibility of fictive variant constructors
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Sat, 13 Apr 2019 09:56:07 +0000 (12:56 +0300)
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Sun, 14 Apr 2019 09:22:44 +0000 (12:22 +0300)
src/librustc_metadata/decoder.rs
src/test/ui/rfc-2008-non-exhaustive/variants_fictive_visibility.rs [new file with mode: 0644]

index f456a5c1619c5a06ed6874bd874080af2a5b1adb..e2464c517ae728419527d412fb3e115e47f23355 100644 (file)
@@ -831,7 +831,16 @@ pub fn each_child_of_item<F>(&self, id: DefIndex, mut callback: F, sess: &Sessio
                             let ctor_def_id = self.get_ctor_def_id(child_index).unwrap_or(def_id);
                             let ctor_kind = self.get_ctor_kind(child_index);
                             let ctor_def = Def::Ctor(ctor_def_id, CtorOf::Variant, ctor_kind);
-                            let vis = self.get_visibility(ctor_def_id.index);
+                            let mut vis = self.get_visibility(ctor_def_id.index);
+                            // If the variant is marked as non_exhaustive then lower the visibility
+                            // to within the crate.
+                            let has_non_exhaustive = || { attr::contains_name(
+                                &self.get_item_attrs(def_id.index, sess), "non_exhaustive"
+                            )};
+                            if vis == ty::Visibility::Public && has_non_exhaustive() {
+                                let crate_def_id = DefId { index: CRATE_DEF_INDEX, ..def_id };
+                                vis = ty::Visibility::Restricted(crate_def_id);
+                            }
                             callback(def::Export { def: ctor_def, ident, vis, span });
                         }
                         _ => {}
diff --git a/src/test/ui/rfc-2008-non-exhaustive/variants_fictive_visibility.rs b/src/test/ui/rfc-2008-non-exhaustive/variants_fictive_visibility.rs
new file mode 100644 (file)
index 0000000..9057592
--- /dev/null
@@ -0,0 +1,9 @@
+// compile-pass
+// aux-build:variants.rs
+
+extern crate variants;
+
+const S: u8 = 0;
+use variants::NonExhaustiveVariants::Struct as S;
+
+fn main() {}