From 2e326498a4ceca3eb6290dd969bc99d56777a526 Mon Sep 17 00:00:00 2001
From: John Benediktsson <mrjbq7@gmail.com>
Date: Tue, 8 Nov 2016 21:45:54 -0800
Subject: [PATCH] alien.parser: throw error if enum values don't fit c-type.

---
 basis/alien/parser/parser-tests.factor |  7 +++++++
 basis/alien/parser/parser.factor       | 18 ++++++++++++++----
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/basis/alien/parser/parser-tests.factor b/basis/alien/parser/parser-tests.factor
index fb1c76182f..b1dc1f6677 100644
--- a/basis/alien/parser/parser-tests.factor
+++ b/basis/alien/parser/parser-tests.factor
@@ -124,3 +124,10 @@ TYPEDEF: int alien-parser-test-int ! reasonably unique name...
 { } [
     [ C-TYPE: hi TYPEDEF: void* hi ] with-compilation-unit
 ] unit-test
+
+[
+"IN: alien.parser.tests
+USING: alien.c-types alien.syntax ;
+ENUM: tv_peripherals_4 < uchar
+{ appletv 1 } { chromecast 2 } { roku 444 } ;" eval( -- )
+] [ error>> enum-values-outside-c-type-interval? ] must-fail-with
diff --git a/basis/alien/parser/parser.factor b/basis/alien/parser/parser.factor
index b15c6e5a1f..aa599707f0 100755
--- a/basis/alien/parser/parser.factor
+++ b/basis/alien/parser/parser.factor
@@ -1,9 +1,12 @@
 ! Copyright (C) 2008, 2010 Slava Pestov, Doug Coleman, Joe Groff.
 ! See http://factorcode.org/license.txt for BSD license.
+
 USING: accessors alien alien.c-types alien.enums alien.libraries
-arrays classes classes.parser combinators combinators.short-circuit
-compiler.units effects fry kernel lexer locals math namespaces parser
-sequences splitting summary vocabs.parser words ;
+arrays classes classes.parser combinators
+combinators.short-circuit compiler.units effects fry kernel
+lexer locals math math.order namespaces parser sequences
+splitting summary vocabs.parser words ;
+
 IN: alien.parser
 
 SYMBOL: current-library
@@ -102,12 +105,19 @@ M: *-in-c-type-name summary
     dup ";" = not
     [ swap parse-enum-member scan-token parse-enum-members ] [ 2drop ] if ;
 
+ERROR: enum-values-outside-c-type-interval name base-type values ;
+
+: check-enum-members ( name base-type members -- name base-type members )
+    over c-type-interval '[ second _ _ between? ] dupd reject
+    [ nip enum-values-outside-c-type-interval ] unless-empty ;
+
 PRIVATE>
 
 : parse-enum ( -- name base-type members )
     parse-enum-name
     parse-enum-base-type
-    [ V{ } clone 0 ] dip parse-enum-members ;
+    [ V{ } clone 0 ] dip parse-enum-members
+    check-enum-members ;
 
 : scan-function-name ( -- return function )
     scan-c-type scan-token parse-pointers ;