Fixpoint denote_tc_assert_b_norho a:=
match a with
| tc_TT => true
| tc_andp' a b => andb (denote_tc_assert_b_norho a) (denote_tc_assert_b_norho b)
| tc_orp' a b => orb (denote_tc_assert_b_norho a) (denote_tc_assert_b_norho b)
| _ => false
end.
Fixpoint denote_tc_assert_b_norho_forgive_isptr a e:=
match a with
| tc_TT => true
| tc_andp' a b => andb (denote_tc_assert_b_norho_forgive_isptr a e)
(denote_tc_assert_b_norho_forgive_isptr b e)
| tc_orp' a b => orb (denote_tc_assert_b_norho_forgive_isptr a e)
(denote_tc_assert_b_norho_forgive_isptr b e)
| tc_isptr e0 => expr_beq e e0
| _ => false
end.
Definition tc_lvalue_b_norho Delta e :=
denote_tc_assert_b_norho (typecheck_lvalue Delta e).
Definition tc_expr_b_norho Delta e :=
denote_tc_assert_b_norho (typecheck_expr Delta e).
Definition tc_temp_id_b_norho id t Delta e:=
denote_tc_assert_b_norho (typecheck_temp_id id t Delta e).
Definition tc_lvalue_b_norho' Delta e :=
match e with
| Ederef e0 t => denote_tc_assert_b_norho_forgive_isptr
(typecheck_lvalue Delta e) e0
| _ => denote_tc_assert_b_norho (typecheck_lvalue Delta e)
end.
Fixpoint tc_efield_b_norho Delta efs :=
match efs with
| nil => true
| eArraySubsc ei :: efs' =>
(tc_expr_b_norho Delta ei && tc_efield_b_norho Delta efs')%bool
| eStructField _ :: efs' => tc_efield_b_norho Delta efs'
| eUnionField _ :: efs' => tc_efield_b_norho Delta efs'
end.

Lemma tc_efield_b_sound: forall efs Delta rho,
tc_efield_b_norho Delta efs = true -> tc_efield Delta efs rho.