FIX Trac #1332: make isStringTy work right
authorsimonpj@microsoft.com <unknown>
Mon, 7 May 2007 10:41:37 +0000 (10:41 +0000)
committersimonpj@microsoft.com <unknown>
Mon, 7 May 2007 10:41:37 +0000 (10:41 +0000)
For some ancient reason, TcType.isStringTy was treating newtypes as
transparent, which is quite consistent with isIntTy, isBoolTy etc.
(I think the reason is that isStringTy was written to go with isFFIDotNetTy,
which deals in representation types.)

Anyway, this inconsistency is Utterly Wrong when called from
Inst.shortCutStringLit, and that made tc224 fail.  I can't think how
it ever succeeded.  Maybe it never did!

Anyway this fixes it. It may be that .NET FFI calls are not quite as
permissive, but they are almost certainly broken in more serious ways,
so I'm going to jump that bridge if we come to it.

compiler/typecheck/TcType.lhs

index caea74f..5928630 100644 (file)
@@ -55,7 +55,7 @@ module TcType (
   eqKind, 
   isSigmaTy, isOverloadedTy, isRigidTy, isBoxyTy,
   isDoubleTy, isFloatTy, isIntTy, isStringTy,
-  isIntegerTy, isBoolTy, isUnitTy,
+  isIntegerTy, isBoolTy, isUnitTy, isCharTy,
   isTauTy, isTauTyCon, tcIsTyVarTy, tcIsForAllTy, 
 
   ---------------------------------
@@ -942,6 +942,12 @@ isIntegerTy    = is_tc integerTyConKey
 isIntTy        = is_tc intTyConKey
 isBoolTy       = is_tc boolTyConKey
 isUnitTy       = is_tc unitTyConKey
+isCharTy       = is_tc charTyConKey
+
+isStringTy ty
+  = case tcSplitTyConApp_maybe ty of
+      Just (tc, [arg_ty]) -> tc == listTyCon && isCharTy arg_ty
+      other              -> False
 
 is_tc :: Unique -> Type -> Bool
 -- Newtypes are opaque to this
@@ -1135,18 +1141,10 @@ isFFIDotnetTy :: DynFlags -> Type -> Bool
 isFFIDotnetTy dflags ty
   = checkRepTyCon (\ tc -> (legalFIResultTyCon dflags tc || 
                           isFFIDotnetObjTy ty || isStringTy ty)) ty
+       -- NB: isStringTy used to look through newtypes, but
+       --     it no longer does so.  May need to adjust isFFIDotNetTy
+       --     if we do want to look through newtypes.
 
--- Support String as an argument or result from a .NET FFI call.
-isStringTy ty = 
-  case tcSplitTyConApp_maybe (repType ty) of
-    Just (tc, [arg_ty])
-      | tc == listTyCon ->
-        case tcSplitTyConApp_maybe (repType arg_ty) of
-         Just (cc,[]) -> cc == charTyCon
-         _ -> False
-    _ -> False
-
--- Support String as an argument or result from a .NET FFI call.
 isFFIDotnetObjTy ty = 
   let
    (_, t_ty) = tcSplitForAllTys ty