Skip to content

Commit 79f5479

Browse files
authored
Merge pull request #1607 from ucsd-progsys/T1604
fix for #T1604
2 parents 30ec4b6 + 5bea115 commit 79f5479

File tree

6 files changed

+38
-10
lines changed

6 files changed

+38
-10
lines changed

src/Language/Haskell/Liquid/Bare.hs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ makeSpecRefl cfg src menv specs env name sig tycEnv = SpRefl
442442
rflSyms = S.fromList (getReflects specs)
443443
sigVars = F.notracepp "SIGVARS" $ (fst3 <$> xtes) -- reflects
444444
++ (fst <$> gsAsmSigs sig) -- assumes
445+
++ (fst <$> gsRefSigs sig)
445446
-- ++ (fst <$> gsTySigs sig) -- measures
446447

447448
lmap = Bare.reLMap env
@@ -462,11 +463,12 @@ getReflects = fmap val . S.toList . S.unions . fmap (names . snd) . M.toList
462463
------------------------------------------------------------------------------------------
463464
addReflSigs :: GhcSpecRefl -> GhcSpecSig -> GhcSpecSig
464465
------------------------------------------------------------------------------------------
465-
addReflSigs refl sig = sig { gsAsmSigs = reflSigs ++ filter notReflected (gsAsmSigs sig) }
466+
addReflSigs refl sig = sig { gsRefSigs = reflSigs, gsAsmSigs = wreflSigs ++ filter notReflected (gsAsmSigs sig) }
466467
where
467-
reflSigs = [ (x, t) | (x, t, _) <- gsHAxioms refl ]
468-
reflected = fst <$> reflSigs
469-
notReflected xt = (fst xt) `notElem` reflected
468+
(wreflSigs, reflSigs) = L.partition ((`elem` gsWiredReft refl) . fst)
469+
[ (x, t) | (x, t, _) <- gsHAxioms refl ]
470+
reflected = fst <$> (wreflSigs ++ reflSigs)
471+
notReflected xt = fst xt `notElem` reflected
470472

471473
makeAutoInst :: Bare.Env -> ModName -> Ms.BareSpec -> M.HashMap Ghc.Var (Maybe Int)
472474
makeAutoInst env name spec = Misc.hashMapMapKeys (Bare.lookupGhcVar env name "Var") (Ms.autois spec)
@@ -478,6 +480,7 @@ makeSpecSig :: Config -> ModName -> Bare.ModSpecs -> Bare.Env -> Bare.SigEnv ->
478480
makeSpecSig cfg name specs env sigEnv tycEnv measEnv cbs = SpSig
479481
{ gsTySigs = F.notracepp "gsTySigs" tySigs
480482
, gsAsmSigs = F.notracepp "gsAsmSigs" asmSigs
483+
, gsRefSigs = []
481484
, gsDicts = dicts
482485
, gsMethods = if noclasscheck cfg then [] else Bare.makeMethodTypes dicts (Bare.meClasses measEnv) cbs
483486
, gsInSigs = mempty -- TODO-REBARE :: ![(Var, LocSpecType)]

src/Language/Haskell/Liquid/Constraint/Init.hs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,16 @@ initEnv info
7979
(invs2, f42) <- mapSndM refreshArgs' $ makeAutoDecrDataCons dcsty' (gsAutosize (gsTerm sp)) dcs'
8080
let f4 = mergeDataConTypes tce (mergeDataConTypes tce f40 (f41 ++ f42)) (filter (isDataConId . fst) f2)
8181
let tx = mapFst F.symbol . addRInv ialias . predsUnify sp
82-
let bs = (tx <$> ) <$> [f0 ++ f0' ++ fi, f1 ++ f1', f2, (F.notracepp "assumed" f3) ++ f3', f4, f5]
82+
f6 <- (map tx . addPolyInfo') <$> (refreshArgs' $ vals gsRefSigs (gsSig sp))
83+
let bs = (tx <$> ) <$> [f0 ++ f0' ++ fi, f1 ++ f1', f2, f3 ++ f3', f4, f5]
8384
modify $ \s -> s { dataConTys = f4 }
8485
lt1s <- F.toListSEnv . cgLits <$> get
8586
let lt2s = [ (F.symbol x, rTypeSort tce t) | (x, t) <- f1' ]
8687
let tcb = mapSnd (rTypeSort tce) <$> concat bs
8788
let cbs = giCbs . giSrc $ info
88-
let γ0 = measEnv sp (head bs) cbs tcb lt1s lt2s (bs!!3) (bs!!5) hs info
89-
γ <- globalize <$> foldM (+=) γ0 ( [("initEnv", x, y) | (x, y) <- concat $ tail bs])
89+
rTrue <- mapM (mapSndM true) f6
90+
let γ0 = measEnv sp (head bs) cbs tcb lt1s lt2s (f6 ++ bs!!3) (bs!!5) hs info
91+
γ <- globalize <$> foldM (+=) γ0 ( [("initEnv", x, y) | (x, y) <- concat $ (rTrue:tail bs)])
9092
return γ {invs = is (invs1 ++ invs2)}
9193
where
9294
sp = giSpec info
@@ -239,7 +241,7 @@ recSelectorsTy info = forM topVs $ \v -> (v,) <$> trueTy (varType v)
239241
where
240242
topVs = filter isTop $ giDefVars (giSrc info)
241243
isTop v = isExportedVar (giSrc info) v && not (v `S.member` sigVs) && isRecordSelector v
242-
sigVs = S.fromList [v | (v,_) <- gsTySigs sp ++ gsAsmSigs sp ++ gsInSigs sp]
244+
sigVs = S.fromList [v | (v,_) <- gsTySigs sp ++ gsAsmSigs sp ++ gsRefSigs sp ++ gsInSigs sp]
243245
sp = gsSig . giSpec $ info
244246

245247

@@ -249,7 +251,7 @@ grtyTop info = forM topVs $ \v -> (v,) <$> trueTy (varType v)
249251
where
250252
topVs = filter isTop $ giDefVars (giSrc info)
251253
isTop v = isExportedVar (giSrc info) v && not (v `S.member` sigVs) && not (isRecordSelector v)
252-
sigVs = S.fromList [v | (v,_) <- gsTySigs sp ++ gsAsmSigs sp ++ gsInSigs sp]
254+
sigVs = S.fromList [v | (v,_) <- gsTySigs sp ++ gsAsmSigs sp ++ gsRefSigs sp ++ gsInSigs sp]
253255
sp = gsSig . giSpec $ info
254256

255257

src/Language/Haskell/Liquid/Constraint/Qualifier.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ specBinders :: GhcInfo -> [(Var, LocSpecType)]
126126
specBinders info = mconcat
127127
[ gsTySigs (gsSig sp)
128128
, gsAsmSigs (gsSig sp)
129+
, gsRefSigs (gsSig sp)
129130
, gsCtors (gsData sp)
130131
, if info `hasOpt` scrapeInternals then gsInSigs (gsSig sp) else []
131132
]

src/Language/Haskell/Liquid/Constraint/ToFixpoint.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ makeSimplify (x, t) = go $ specTypeToResultRef (F.eApps (F.EVar $ F.symbol x) (F
144144
makeEquations :: GhcSpec -> [F.Equation]
145145
makeEquations sp = [ F.mkEquation f xts (equationBody (F.EVar f) xArgs e mbT) t
146146
| F.Equ f xts e t _ <- axioms
147-
, let mbT = M.lookup f sigs
148147
, let xArgs = F.EVar . fst <$> xts
148+
, let mbT = if null xArgs then Nothing else M.lookup f sigs
149149
]
150150
where
151151
axioms = gsMyAxioms refl ++ gsImpAxioms refl

src/Language/Haskell/Liquid/Types/Specs.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ data GhcSpecQual = SpQual
9494
data GhcSpecSig = SpSig
9595
{ gsTySigs :: ![(Var, LocSpecType)] -- ^ Asserted Reftypes
9696
, gsAsmSigs :: ![(Var, LocSpecType)] -- ^ Assumed Reftypes
97+
, gsRefSigs :: ![(Var, LocSpecType)] -- ^ Reflected Reftypes
9798
, gsInSigs :: ![(Var, LocSpecType)] -- ^ Auto generated Signatures
9899
, gsNewTypes :: ![(TyCon, LocSpecType)] -- ^ Mapping of 'newtype' type constructors with their refined types.
99100
, gsDicts :: !(DEnv Var LocSpecType) -- ^ Refined Classes from Instances

tests/neg/T1604.hs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{-@ LIQUID "--reflection" @-}
2+
{-@ LIQUID "--ple" @-}
3+
4+
data Val = V { val :: Int }
5+
{-@ data Val = V { val :: Int } @-}
6+
{-@ type ValN N = {v:Val | val v == N} @-}
7+
8+
{-@ reflect ex1 @-}
9+
{-@ ex1 :: ValN 5 @-}
10+
ex1 :: Val
11+
ex1 = V 4
12+
13+
14+
{-@ test1 :: {v:Bool | v} @-}
15+
test1 = val ex1 == 6
16+
17+
{-@ test2 :: () -> {v:() | val ex1 == 6} @-}
18+
test2 () = ()
19+
20+
{-@ test3 :: () -> {v:() | 1 == 2} @-}
21+
test3 () = ()

0 commit comments

Comments
 (0)