Fix #13833: accept type literals with no FlexibleInstances
authorKirill Zaborsky <qrilka@gmail.com>
Fri, 15 Jun 2018 18:12:58 +0000 (14:12 -0400)
committerBen Gamari <ben@smart-cactus.org>
Fri, 15 Jun 2018 18:13:09 +0000 (14:13 -0400)
Test Plan: ./validate

Reviewers: bgamari, simonpj

Reviewed By: bgamari, simonpj

Subscribers: simonpj, rwbarton, thomie, carter

GHC Trac Issues: #13833

Differential Revision: https://phabricator.haskell.org/D4823

compiler/typecheck/TcValidity.hs
docs/users_guide/8.6.1-notes.rst
testsuite/tests/typecheck/should_compile/T13833.hs [new file with mode: 0644]
testsuite/tests/typecheck/should_compile/all.T

index 84309db..6d866f7 100644 (file)
@@ -1121,12 +1121,13 @@ tcInstHeadTyNotSynonym ty
 
 tcInstHeadTyAppAllTyVars :: Type -> Bool
 -- Used in Haskell-98 mode, for the argument types of an instance head
--- These must be a constructor applied to type variable arguments.
+-- These must be a constructor applied to type variable arguments
+-- or a type-level literal.
 -- But we allow kind instantiations.
 tcInstHeadTyAppAllTyVars ty
   | Just (tc, tys) <- tcSplitTyConApp_maybe (dropCasts ty)
   = ok (filterOutInvisibleTypes tc tys)  -- avoid kinds
-
+  | LitTy _ <- ty = True  -- accept type literals (Trac #13833)
   | otherwise
   = False
   where
index 147558e..4bc01c9 100644 (file)
@@ -125,6 +125,11 @@ Language
 
   This is now an error unless :extension:`PolyKinds` is enabled.
 
+- Type literals now could be used in type class instances without the extension
+  :extension:`FlexibleInstances`.
+
+  See :ghc-ticket:`13833`.
+
 Compiler
 ~~~~~~~~
 
diff --git a/testsuite/tests/typecheck/should_compile/T13833.hs b/testsuite/tests/typecheck/should_compile/T13833.hs
new file mode 100644 (file)
index 0000000..266b00b
--- /dev/null
@@ -0,0 +1,12 @@
+{-# LANGUAGE DataKinds, KindSignatures #-}
+
+import GHC.TypeLits (Nat, Symbol)
+
+class A (n::Nat)
+instance A 0
+
+class B (s::Symbol)
+instance B "B"
+
+main :: IO ()
+main = return ()
index 8a7a7da..beaea5d 100644 (file)
@@ -623,3 +623,4 @@ test('T15050', [expect_broken(15050)], compile, [''])
 test('T14735', normal, compile, [''])
 test('T15180', normal, compile, [''])
 test('T15232', normal, compile, [''])
+test('T13833', normal, compile, [''])
\ No newline at end of file