Detect out of bounds when inserting discriminant
diff --git a/syntax/discriminant.rs b/syntax/discriminant.rs
index c65b3f4..4caa42b 100644
--- a/syntax/discriminant.rs
+++ b/syntax/discriminant.rs
@@ -100,6 +100,21 @@
 }
 
 fn insert(set: &mut DiscriminantSet, discriminant: Discriminant) -> Result<Discriminant> {
+    if let Some(expected_repr) = set.repr {
+        for bounds in &BOUNDS {
+            if bounds.repr != expected_repr {
+                continue;
+            }
+            if bounds.min <= discriminant && discriminant <= bounds.max {
+                break;
+            }
+            let msg = format!(
+                "discriminant value `{}` is outside the limits of {}",
+                discriminant, expected_repr,
+            );
+            return Err(Error::new(Span::call_site(), msg));
+        }
+    }
     if set.values.insert(discriminant) {
         set.previous = Some(discriminant);
         Ok(discriminant)