From 43f19eec0ec4c507be2391d66ff53e79a8580561 Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Mon, 7 May 2007 10:41:37 +0000 Subject: [PATCH] FIX Trac #1332: make isStringTy work right 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 | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/compiler/typecheck/TcType.lhs b/compiler/typecheck/TcType.lhs index caea74f..5928630 100644 --- a/compiler/typecheck/TcType.lhs +++ b/compiler/typecheck/TcType.lhs @@ -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 -- 1.7.10.4