summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dhall/src/lib.rs1
-rw-r--r--dhall/src/semantics/nze/normalize.rs27
-rw-r--r--dhall/src/semantics/tck/typecheck.rs4
-rw-r--r--dhall/src/syntax/ast/expr.rs6
4 files changed, 19 insertions, 19 deletions
diff --git a/dhall/src/lib.rs b/dhall/src/lib.rs
index d7d7f05..058411c 100644
--- a/dhall/src/lib.rs
+++ b/dhall/src/lib.rs
@@ -1,5 +1,4 @@
#![doc(html_root_url = "https://docs.rs/dhall/0.3.0")]
-#![feature(never_type)]
#![allow(
clippy::int_plus_one, // Comes from pest_consume macro
clippy::module_inception,
diff --git a/dhall/src/semantics/nze/normalize.rs b/dhall/src/semantics/nze/normalize.rs
index 08e3e87..79d55e8 100644
--- a/dhall/src/semantics/nze/normalize.rs
+++ b/dhall/src/semantics/nze/normalize.rs
@@ -58,20 +58,21 @@ pub(crate) fn squash_textlit(
ret
}
-pub(crate) fn merge_maps<K, V, F, Err>(
+pub(crate) fn merge_maps<K, V, F>(
map1: &HashMap<K, V>,
map2: &HashMap<K, V>,
mut f: F,
-) -> Result<HashMap<K, V>, Err>
+) -> HashMap<K, V>
where
- F: FnMut(&K, &V, &V) -> Result<V, Err>,
+ F: FnMut(&K, &V, &V) -> V,
K: std::hash::Hash + Eq + Clone,
V: Clone,
{
let mut kvs = HashMap::new();
for (x, v2) in map2 {
let newv = if let Some(v1) = map1.get(x) {
- f(x, v1, v2)?
+ // Collision: the key is present in both maps
+ f(x, v1, v2)
} else {
v2.clone()
};
@@ -81,7 +82,7 @@ where
// Insert only if key not already present
kvs.entry(x.clone()).or_insert_with(|| v1.clone());
}
- Ok(kvs)
+ kvs
}
// Small helper enum to avoid repetition
@@ -175,29 +176,29 @@ fn apply_binop<'a>(o: BinOp, x: &'a Nir, y: &'a Nir) -> Option<Ret<'a>> {
Ret::NirRef(y)
}
(RecursiveRecordMerge, RecordLit(kvs1), RecordLit(kvs2)) => {
- let kvs = merge_maps::<_, _, _, !>(kvs1, kvs2, |_, v1, v2| {
- Ok(Nir::from_partial_expr(ExprKind::BinOp(
+ let kvs = merge_maps(kvs1, kvs2, |_, v1, v2| {
+ Nir::from_partial_expr(ExprKind::BinOp(
RecursiveRecordMerge,
v1.clone(),
v2.clone(),
- )))
- })?;
+ ))
+ });
Ret::NirKind(RecordLit(kvs))
}
(RecursiveRecordTypeMerge, RecordType(kts_x), RecordType(kts_y)) => {
- let kts = merge_maps::<_, _, _, !>(
+ let kts = merge_maps(
kts_x,
kts_y,
// If the Label exists for both records, then we hit the recursive case.
|_, l: &Nir, r: &Nir| {
- Ok(Nir::from_partial_expr(ExprKind::BinOp(
+ Nir::from_partial_expr(ExprKind::BinOp(
RecursiveRecordTypeMerge,
l.clone(),
r.clone(),
- )))
+ ))
},
- )?;
+ );
Ret::NirKind(RecordType(kts))
}
diff --git a/dhall/src/semantics/tck/typecheck.rs b/dhall/src/semantics/tck/typecheck.rs
index 365df25..173b76d 100644
--- a/dhall/src/semantics/tck/typecheck.rs
+++ b/dhall/src/semantics/tck/typecheck.rs
@@ -346,9 +346,7 @@ fn type_one_layer(
// Union the two records, prefering
// the values found in the RHS.
- let kts = merge_maps::<_, _, _, !>(kts_x, kts_y, |_, _, r_t| {
- Ok(r_t.clone())
- })?;
+ let kts = merge_maps(kts_x, kts_y, |_, _, r_t| r_t.clone());
let u = max(x.ty().ty(), y.ty().ty());
Nir::from_kind(NirKind::RecordType(kts)).to_type(u)
diff --git a/dhall/src/syntax/ast/expr.rs b/dhall/src/syntax/ast/expr.rs
index ce0a3d2..8023771 100644
--- a/dhall/src/syntax/ast/expr.rs
+++ b/dhall/src/syntax/ast/expr.rs
@@ -257,10 +257,12 @@ impl Expr {
}
}
-pub fn trivial_result<T>(x: Result<T, !>) -> T {
+// Empty enum to indicate that no error can occur
+enum X {}
+fn trivial_result<T>(x: Result<T, X>) -> T {
match x {
Ok(x) => x,
- Err(e) => e,
+ Err(e) => match e {},
}
}