Skip to content

Commit

Permalink
Rollup merge of rust-lang#76293 - Amjad50:incompatible_features_error…
Browse files Browse the repository at this point in the history
…, r=lcnr

Implementation of incompatible features error

Proposal of a new error: Incompatible features

This error should happen if two features which are not compatible are used together.

For now the only incompatible features are `const_generics` and `min_const_generics`

fixes rust-lang#76280
  • Loading branch information
Dylan-DPC committed Sep 5, 2020
2 parents efea057 + 8f2d906 commit 600a080
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 1 deletion.
34 changes: 34 additions & 0 deletions compiler/rustc_ast_passes/src/feature_gate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {

pub fn check_crate(krate: &ast::Crate, sess: &Session) {
maybe_stage_features(sess, krate);
check_incompatible_features(sess);
let mut visitor = PostExpansionVisitor { sess, features: &sess.features_untracked() };

let spans = sess.parse_sess.gated_spans.spans.borrow();
Expand Down Expand Up @@ -677,3 +678,36 @@ fn maybe_stage_features(sess: &Session, krate: &ast::Crate) {
}
}
}

fn check_incompatible_features(sess: &Session) {
let features = sess.features_untracked();

let declared_features = features
.declared_lang_features
.iter()
.copied()
.map(|(name, span, _)| (name, span))
.chain(features.declared_lib_features.iter().copied());

for (f1, f2) in rustc_feature::INCOMPATIBLE_FEATURES
.iter()
.filter(|&&(f1, f2)| features.enabled(f1) && features.enabled(f2))
{
if let Some((f1_name, f1_span)) = declared_features.clone().find(|(name, _)| name == f1) {
if let Some((f2_name, f2_span)) = declared_features.clone().find(|(name, _)| name == f2)
{
let spans = vec![f1_span, f2_span];
sess.struct_span_err(
spans.clone(),
&format!(
"features `{}` and `{}` are incompatible, using them at the same time \
is not allowed",
f1_name, f2_name
),
)
.help("remove one of these features")
.emit();
}
}
}
}
5 changes: 5 additions & 0 deletions compiler/rustc_feature/src/active.rs
Original file line number Diff line number Diff line change
Expand Up @@ -605,3 +605,8 @@ pub const INCOMPLETE_FEATURES: &[Symbol] = &[
sym::lazy_normalization_consts,
sym::specialization,
];

/// Some features are not allowed to be used together at the same time, if
/// the two are present, produce an error
pub const INCOMPATIBLE_FEATURES: &[(Symbol, Symbol)] =
&[(sym::const_generics, sym::min_const_generics)];
2 changes: 1 addition & 1 deletion compiler/rustc_feature/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ pub fn find_feature_issue(feature: Symbol, issue: GateIssue) -> Option<NonZeroU3
}

pub use accepted::ACCEPTED_FEATURES;
pub use active::{Features, ACTIVE_FEATURES, INCOMPLETE_FEATURES};
pub use active::{Features, ACTIVE_FEATURES, INCOMPATIBLE_FEATURES, INCOMPLETE_FEATURES};
pub use builtin_attrs::{
deprecated_attributes, find_gated_cfg, is_builtin_attr_name, AttributeGate, AttributeTemplate,
AttributeType, BuiltinAttribute, GatedCfg, BUILTIN_ATTRIBUTES, BUILTIN_ATTRIBUTE_MAP,
Expand Down
7 changes: 7 additions & 0 deletions src/test/ui/const-generics/min-and-full-same-time.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#![feature(const_generics)]
//~^ ERROR features `const_generics` and `min_const_generics` are incompatible
#![allow(incomplete_features)]
#![feature(min_const_generics)]


fn main() {}
13 changes: 13 additions & 0 deletions src/test/ui/const-generics/min-and-full-same-time.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error: features `const_generics` and `min_const_generics` are incompatible, using them at the same time is not allowed
--> $DIR/min-and-full-same-time.rs:1:12
|
LL | #![feature(const_generics)]
| ^^^^^^^^^^^^^^
...
LL | #![feature(min_const_generics)]
| ^^^^^^^^^^^^^^^^^^
|
= help: remove one of these features

error: aborting due to previous error

0 comments on commit 600a080

Please sign in to comment.