Instance QS: listspec t_struct_elem _next.Definition link := field_at Tsh t_struct_elem _next.Definition link_ := field_at_ Tsh t_struct_elem _next.Definition elemrep (rep: elemtype QS) (p: val) : mpred :=
  field_at Tsh t_struct_elem _a p (Vint (fst rep)) *
  (field_at Tsh t_struct_elem _b p (Vint (snd rep)) *
   (field_at_ Tsh t_struct_elem _next p)).Parameter tycontext_eq : tycontext -> tycontext -> bool.Axiom typecontext_eq_correct : forall x y, tycontext_eq x y = true -> x = y.Definition tycontext_type :=
 ({| Expr.Impl := tycontext
       ; Expr.Eqb := tycontext_eq
       ; Expr.Eqb_correct := typecontext_eq_correct
   |}).Parameter expr_eq : option expr -> option expr -> bool.Axiom expr_eq_correct : forall x y, expr_eq x y = true -> x = y.Definition c_option_expr_type :=
 ({| Expr.Impl := option expr
     ; Expr.Eqb := expr_eq
     ; Expr.Eqb_correct := expr_eq_correct |}).Definition c_type_type :=
 ({| Expr.Impl := type
     ; Expr.Eqb := type_eq
     ; Expr.Eqb_correct := environ_lemmas.type_eq_true |}).Parameter environ_eq : environ -> environ -> bool.Axiom environ_eq_correct : forall x y, environ_eq x y = true -> x = y.Definition environ_type :=
 ({| Expr.Impl := environ
     ; Expr.Eqb := environ_eq
     ; Expr.Eqb_correct := environ_eq_correct |}).Definition environ2prop_type : Expr.type.Definition our_types := cons tycontext_type
                       (cons c_option_expr_type
                       (cons c_type_type
                       (cons environ_type
                       (cons Expr.Prop_type
                       (cons environ2prop_type nil))))).Definition tycontext_type_var := Expr.tvType 0.Definition c_option_expr_type_var := Expr.tvType 1.Definition c_type_type_var := Expr.tvType 2.Definition environ_type_var := Expr.tvType 3.Definition prop_type_var := Expr.tvType 4.Definition environ2prop_type_var := Expr.tvType 5.Definition delta_const := @Expr.Const our_types tycontext_type_var Delta.(*above preconstructed, below constructed by entailer *)

Definition c_option_expr_const := @Expr.Const our_types c_option_expr_type_var
(@Some expr
            (Ebinop Oeq (Etempvar _h (tptr t_struct_elem))
               (Ecast (Econst_int (Int.repr 0) tint) (tptr tvoid)) tint)).Definition ret_type_signature :=
Expr.Sig our_types (cons tycontext_type_var nil)
  c_type_type_var ret_type.Definition tc_expropt_signature_lifted : Expr.signature our_types :=
Expr.Sig our_types (cons tycontext_type_var (cons c_option_expr_type_var (cons c_type_type_var nil))) environ2prop_type_var tc_expropt.Definition tc_expropt_signature : Expr.signature our_types :=
Expr.Sig our_types (cons tycontext_type_var (cons c_option_expr_type_var (cons c_type_type_var (cons environ_type_var nil)))) prop_type_var tc_expropt.Definition environ_signature (rho: environ) : Expr.signature our_types :=
Expr.Sig our_types (nil) (environ_type_var) (rho).Definition functions (rho:environ) := cons ret_type_signature
                       (cons tc_expropt_signature
                       (cons tc_expropt_signature_lifted
                       (cons (environ_signature rho) nil))).Definition ret_type_delta : Expr.expr our_types.Definition tc_expropt_application_lifted : Expr.expr our_types.Definition tc_expropt_application_unlifted : Expr.expr our_types.Definition reflected_tc_expropt :=
(tc_expropt Delta
         (@Some expr
            (Ebinop Oeq (Etempvar _h (tptr t_struct_elem))
               (Ecast (Econst_int (Int.repr 0) tint) (tptr tvoid)) tint))
         (ret_type Delta)).Definition reflected_tc_expropt_unlifted :=
forall rho,
(tc_expropt Delta
         (@Some expr
            (Ebinop Oeq (Etempvar _h (tptr t_struct_elem))
               (Ecast (Econst_int (Int.repr 0) tint) (tptr tvoid)) tint))
         (ret_type Delta) rho).

Lemma tc_expropt_true : forall rho, tc_environ Delta rho -> (tc_expropt Delta (@Some expr (Ebinop Oeq (Etempvar _h (tptr t_struct_elem)) (Ecast (Econst_int (Int.repr 0) tint) (tptr tvoid)) tint)) (ret_type Delta) rho).