dataConArgRep dflags fam_envs arg_ty
    (HsSrcBang _ unpk_prag True)  -- {-# UNPACK #-} !
  | not (gopt Opt_OmitInterfacePragmas dflags) -- Don't unpack if -fomit-iface-pragmas
          -- Don't unpack if we aren't optimising; rather arbitrarily,
          -- we use -fomit-iface-pragmas as the indication
  , let mb_co   = topNormaliseType_maybe fam_envs arg_ty
                     -- Unwrap type families and newtypes
        arg_ty' = case mb_co of { Just (_,ty) -> ty; Nothing -> arg_ty }
  , isUnpackableType fam_envs arg_ty'
  , (rep_tys, wrappers) <- dataConArgUnpack arg_ty'
  , case unpk_prag of
      Nothing -> gopt Opt_UnboxStrictFields dflags
              || (gopt Opt_UnboxSmallStrictFields dflags
                   && length rep_tys <= 1)  -- See Note [Unpack one-wide fields]
      Just unpack_me -> unpack_me
  = case mb_co of
      Nothing          -> (HsUnpack Nothing,   rep_tys, wrappers)
      Just (co,rep_ty) -> (HsUnpack (Just co), rep_tys, wrapCo co rep_ty wrappers)

  | otherwise  -- Record the strict-but-no-unpack decision
  = strict_but_not_unpacked arg_ty
dataConArgRep dflags fam_envs arg_ty
    (HsSrcBang _ unpk_prag True)  -- {-# UNPACK #-} !
  | not (gopt Opt_OmitInterfacePragmas dflags) -- Don't unpack if -fomit-iface-pragmas
          -- Don't unpack if we aren't optimising; rather arbitrarily,
          -- we use -fomit-iface-pragmas as the indication
  , let mb_co   = topNormaliseType_maybe fam_envs arg_ty
                     -- Unwrap type families and newtypes
        arg_ty' = case mb_co of { Just (_,ty) -> ty; Nothing -> arg_ty }
  , isUnpackableType fam_envs arg_ty'
  , (rep_tys, wrappers) <- dataConArgUnpack arg_ty'
  , case unpk_prag of
      Nothing -> gopt Opt_UnboxStrictFields dflags
              || (gopt Opt_UnboxSmallStrictFields dflags
                   && length rep_tys <= 1)  -- See Note [Unpack one-wide fields]
      Just unpack_me -> unpack_me
  = case mb_co of
      Nothing          -> (HsUnpack Nothing,   rep_tys, wrappers)
      Just (co,rep_ty) -> (HsUnpack (Just co), rep_tys, wrapCo co rep_ty wrappers)

  | otherwise  -- Record the strict-but-no-unpack decision
  = strict_but_not_unpacked arg_ty
dataConArgRep dflags fam_envs arg_ty
    (HsSrcBang _ unpk_prag True)  -- {-# UNPACK #-} !
  | not (gopt Opt_OmitInterfacePragmas dflags) -- Don't unpack if -fomit-iface-pragmas
          -- Don't unpack if we aren't optimising; rather arbitrarily,
          -- we use -fomit-iface-pragmas as the indication
  , let mb_co   = topNormaliseType_maybe fam_envs arg_ty
                     -- Unwrap type families and newtypes
        arg_ty' = case mb_co of { Just (_,ty) -> ty; Nothing -> arg_ty }
  , isUnpackableType fam_envs arg_ty'
  , (rep_tys, wrappers) <- dataConArgUnpack arg_ty'
  , case unpk_prag of
      Nothing -> gopt Opt_UnboxStrictFields dflags
              || (gopt Opt_UnboxSmallStrictFields dflags
                   && length rep_tys <= 1)  -- See Note [Unpack one-wide fields]
      Just unpack_me -> unpack_me
  = case mb_co of
      Nothing          -> (HsUnpack Nothing,   rep_tys, wrappers)
      Just (co,rep_ty) -> (HsUnpack (Just co), rep_tys, wrapCo co rep_ty wrappers)

  | otherwise  -- Record the strict-but-no-unpack decision
  = strict_but_not_unpacked arg_ty