    {-# LANGUAGE DeriveDataTypeable, StandaloneDeriving, CPP #-}
    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Data.Generics.Instances
    -- Copyright   :  (c) The University of Glasgow, CWI 2001--2004
    -- License     :  BSD-style (see the LICENSE file)
    --
    -- Maintainer  :  generics@haskell.org
    -- Stability   :  experimental
    -- Portability :  non-portable (uses Data.Data)
    --
    -- \"Scrap your boilerplate\" --- Generic programming in Haskell
    -- See <http://www.cs.uu.nl/wiki/GenericProgramming/SYB>. The present module
    -- contains thirteen 'Data' instances which are considered dubious (either
    -- because the types are abstract or just not meant to be traversed).
    -- Instances in this module might change or disappear in future releases
    -- of this package.
    --
    -- (This module does not export anything. It really just defines instances.)
    --
    -----------------------------------------------------------------------------

    {-# OPTIONS_GHC -fno-warn-orphans #-}
    module Data.Generics.Instances () where

    ------------------------------------------------------------------------------

    import Data.Data

    #ifdef __GLASGOW_HASKELL__
    #if __GLASGOW_HASKELL__ >= 611
    import GHC.IO.Handle         -- So we can give Data instance for Handle
    #else
    import GHC.IOBase            -- So we can give Data instance for IO, Handle
    #endif
    import GHC.Stable            -- So we can give Data instance for StablePtr
    import GHC.ST                -- So we can give Data instance for ST
    import GHC.Conc              -- So we can give Data instance for TVar
    import Data.IORef            -- So we can give Data instance for IORef
    import Control.Concurrent    -- So we can give Data instance for MVar
    #else
    # ifdef __HUGS__
    import Hugs.Prelude( Ratio(..) )
    # endif
    import System.IO
    import Foreign.Ptr
    import Foreign.ForeignPtr
    import Foreign.StablePtr
    import Control.Monad.ST
    #endif

    #include "Typeable.h"

    -- Version compatibility issues caused by #2760
    myMkNoRepType :: String -> DataType
    #if __GLASGOW_HASKELL__ >= 611
    myMkNoRepType = mkNoRepType
    #else
    myMkNoRepType = mkNorepType
    #endif

    ------------------------------------------------------------------------------
    --
    --      Instances of the Data class for Prelude-like types.
    --      We define top-level definitions for representations.
    --
    ------------------------------------------------------------------------------

    ------------------------------------------------------------------------------
    -- Instances of abstract datatypes (6)
    ------------------------------------------------------------------------------

    instance Data TypeRep where
      toConstr _   = error "toConstr"
      gunfold _ _  = error "gunfold"
      dataTypeOf _ = myMkNoRepType "Data.Typeable.TypeRep"

    ------------------------------------------------------------------------------

    instance Data TyCon where
      toConstr _   = error "toConstr"
      gunfold _ _  = error "gunfold"
      dataTypeOf _ = myMkNoRepType "Data.Typeable.TyCon"

    ------------------------------------------------------------------------------

    INSTANCE_TYPEABLE0(DataType,dataTypeTc,"DataType")

    instance Data DataType where
      toConstr _   = error "toConstr"
      gunfold _ _  = error "gunfold"
      dataTypeOf _ = myMkNoRepType "Data.Generics.Basics.DataType"

    ------------------------------------------------------------------------------

    instance Data Handle where
      toConstr _   = error "toConstr"
      gunfold _ _  = error "gunfold"
      dataTypeOf _ = myMkNoRepType "GHC.IOBase.Handle"

    ------------------------------------------------------------------------------

    instance Typeable a => Data (StablePtr a) where
      toConstr _   = error "toConstr"
      gunfold _ _  = error "gunfold"
      dataTypeOf _ = myMkNoRepType "GHC.Stable.StablePtr"

    ------------------------------------------------------------------------------

    #ifdef __GLASGOW_HASKELL__
    instance Data ThreadId where
      toConstr _   = error "toConstr"
      gunfold _ _  = error "gunfold"
      dataTypeOf _ = myMkNoRepType "GHC.Conc.ThreadId"
    #endif

    ------------------------------------------------------------------------------
    -- Dubious instances (7)
    ------------------------------------------------------------------------------

    #ifdef __GLASGOW_HASKELL__
    instance Typeable a => Data (TVar a) where
      toConstr _   = error "toConstr"
      gunfold _ _  = error "gunfold"
      dataTypeOf _ = myMkNoRepType "GHC.Conc.TVar"
    #endif

    ------------------------------------------------------------------------------

    instance Typeable a => Data (MVar a) where
      toConstr _   = error "toConstr"
      gunfold _ _  = error "gunfold"
      dataTypeOf _ = myMkNoRepType "GHC.Conc.MVar"

    ------------------------------------------------------------------------------

    #ifdef __GLASGOW_HASKELL__
    instance Typeable a => Data (STM a) where
      toConstr _   = error "toConstr"
      gunfold _ _  = error "gunfold"
      dataTypeOf _ = myMkNoRepType "GHC.Conc.STM"
    #endif

    ------------------------------------------------------------------------------

    instance (Typeable s, Typeable a) => Data (ST s a) where
      toConstr _   = error "toConstr"
      gunfold _ _  = error "gunfold"
      dataTypeOf _ = myMkNoRepType "GHC.ST.ST"

    ------------------------------------------------------------------------------

    instance Typeable a => Data (IORef a) where
      toConstr _   = error "toConstr"
      gunfold _ _  = error "gunfold"
      dataTypeOf _ = myMkNoRepType "GHC.IOBase.IORef"

    ------------------------------------------------------------------------------

    instance Typeable a => Data (IO a) where
      toConstr _   = error "toConstr"
      gunfold _ _  = error "gunfold"
      dataTypeOf _ = myMkNoRepType "GHC.IOBase.IO"

    ------------------------------------------------------------------------------

    --
    -- A last resort for functions
    --

    instance (Data a, Data b) => Data (a -> b) where
      toConstr _   = error "toConstr"
      gunfold _ _  = error "gunfold"
      dataTypeOf _ = myMkNoRepType "Prelude.(->)"
      dataCast2 f  = gcast2 f