aboutsummaryrefslogtreecommitdiffstats
path: root/cfrontend/Initializers.v
diff options
context:
space:
mode:
Diffstat (limited to 'cfrontend/Initializers.v')
-rw-r--r--cfrontend/Initializers.v10
1 files changed, 7 insertions, 3 deletions
diff --git a/cfrontend/Initializers.v b/cfrontend/Initializers.v
index 19518aea..388b6544 100644
--- a/cfrontend/Initializers.v
+++ b/cfrontend/Initializers.v
@@ -133,6 +133,11 @@ Fixpoint constval (ce: composite_env) (a: expr) : res val :=
Error(msg "not a compile-time constant")
end.
+(** [constval_cast ce a ty] evaluates [a] then converts its value to type [ty]. *)
+
+Definition constval_cast (ce: composite_env) (a: expr) (ty: type): res val :=
+ do v <- constval ce a; do_cast v (typeof a) ty.
+
(** * Translation of initializers *)
Inductive initializer :=
@@ -148,9 +153,8 @@ with initializer_list :=
of type [ty]. Return the corresponding initialization datum. *)
Definition transl_init_single (ce: composite_env) (ty: type) (a: expr) : res init_data :=
- do v1 <- constval ce a;
- do v2 <- do_cast v1 (typeof a) ty;
- match v2, ty with
+ do v <- constval_cast ce a ty;
+ match v, ty with
| Vint n, Tint (I8|IBool) sg _ => OK(Init_int8 n)
| Vint n, Tint I16 sg _ => OK(Init_int16 n)
| Vint n, Tint I32 sg _ => OK(Init_int32 n)