[mcbind] [PATCH 1/4] Allow enum values to be previous members of same enum.
[Thread Prev] | [Thread Next]
- Subject: [mcbind] [PATCH 1/4] Allow enum values to be previous members of same enum.
- From: "S. Gilles" <sgilles@xxxxxxx>
- Reply-to: myrddin-dev@xxxxxxxxxxxxxx
- Date: Tue, 10 Mar 2020 11:47:48 -0400
- To: "myrddin-dev" <myrddin-dev@xxxxxxxxxxxxxx>
- Cc: "S. Gilles" <sgilles@xxxxxxx>
For example, pthread.h contains something like
enum
{
PTHREAD_MUTEX_TIMED_NP,
PTHREAD_MUTEX_RECURSIVE_NP,
PTHREAD_MUTEX_ERRORCHECK_NP,
PTHREAD_MUTEX_ADAPTIVE_NP,
PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
};
Since the enum e hasn't been added to p when PTHREAD_MUTEX_NORMAL is
read, lookup() will fail on PTHREAD_MUTEX_TIMED_NP unless e is
specifically probed.
---
parse.myr | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/parse.myr b/parse.myr
index f28e01a..f5afb31 100644
--- a/parse.myr
+++ b/parse.myr
@@ -639,7 +639,30 @@ const parseenumbody = {p, tagname, pbody
match p.tok.kind
| `Tasn:
next(p)
- v = parseconstexpr(p)
+ l = p.tok.loc
+ var expr = parseexpr(p)
+ var folded
+ /*
+ References to enum values in this enum (which hasn't yet been added to p)
+ have to be handled specially. Otherwise, just try to evaluate.
+ */
+ match expr
+ | &(`Eident &[.sc=`Sclassenum, .name=other]):
+ match std.htget(e.membs, other)
+ | `std.Some c:
+ folded = `std.Some `Constint c
+ | `std.None:
+ folded = foldexpr(expr)
+ ;;
+ | _:
+ folded = foldexpr(expr)
+ ;;
+ match folded
+ | `std.Some `Constint c:
+ v = c
+ | _:
+ err(l, "expected constant value for enum {}", name)
+ ;;
/* TODO: turn this into a bitfield type */
| _:
;;
--
2.25.1
| [mcbind] [PATCH 0/4] Misc mcbind adjustments | "S. Gilles" <sgilles@xxxxxxx> |
- Prev by Date: [mcbind] [PATCH 4/4] Add a few cases to foldexpr
- Next by Date: [mcbind] [PATCH 2/4] Add `Einit where necessary to complete matchings
- Previous by thread: [mcbind] [PATCH 4/4] Add a few cases to foldexpr
- Next by thread: [mcbind] [PATCH 2/4] Add `Einit where necessary to complete matchings
- Index(es):