From 2a7755fee187492a6bf36a89f5f3ec0b5407a637 Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Wed, 16 Nov 2016 00:49:47 +0100
Subject: [PATCH] Different treatment of atomic premise in type class.

In Coq 8.6 type class search is not called recursively on premises
that are not type classes. To that end, we use a hint extern to invoke
an ordinary auto.
---
 heap_lang/tactics.v        | 2 +-
 program_logic/weakestpre.v | 7 ++++---
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/heap_lang/tactics.v b/heap_lang/tactics.v
index 4d9c1633c..f399d09d3 100644
--- a/heap_lang/tactics.v
+++ b/heap_lang/tactics.v
@@ -230,7 +230,7 @@ Ltac solve_atomic :=
   end.
 Hint Extern 10 (language.atomic _) => solve_atomic.
 (* For the side-condition of elim_upd_fupd_wp_atomic *)
-Hint Extern 10 (language.atomic _) => solve_atomic : typeclass_instances.
+Hint Extern 10 (language.atomic _) => solve_atomic : atomic.
 
 (** Substitution *)
 Ltac simpl_subst :=
diff --git a/program_logic/weakestpre.v b/program_logic/weakestpre.v
index 97fee1f57..699172b24 100644
--- a/program_logic/weakestpre.v
+++ b/program_logic/weakestpre.v
@@ -310,12 +310,13 @@ Section proofmode_classes.
     ElimModal (|={E}=> P) P (WP e @ E {{ Φ }}) (WP e @ E {{ Φ }}).
   Proof. by rewrite /ElimModal fupd_frame_r wand_elim_r fupd_wp. Qed.
 
-  (* lower precedence, if possible, it should always pick elim_upd_fupd_wp *)
-  Global Instance elim_modal_fupd_wp_atomic E1 E2 e P Φ :
+  Instance elim_modal_fupd_wp_atomic E1 E2 e P Φ :
     atomic e →
     ElimModal (|={E1,E2}=> P) P
             (WP e @ E1 {{ Φ }}) (WP e @ E2 {{ v, |={E2,E1}=> Φ v }})%I | 100.
   Proof. intros. by rewrite /ElimModal fupd_frame_r wand_elim_r wp_atomic. Qed.
 End proofmode_classes.
 
-Hint Extern 0 (atomic _) => assumption : typeclass_instances.
+(* Lower precedence, if possible, it should always pick elim_upd_fupd_wp *)
+Hint Extern 100 (ElimModal (|={_,_}=> _) _ (WP _ @ _ {{ _ }}) _) =>
+  eapply elim_modal_fupd_wp_atomic; solve [auto with atomic] : typeclass_instances.
-- 
GitLab