X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FbasicTypes%2FDataCon.lhs;h=0c6e3c57200d8f94c9e6d1691100b38af8875de3;hp=851bf661da52d639a68ea60a66e7ed5d89aedf6b;hb=6a05ec5ef5373f61b7f9f5bdc344483417fa801b;hpb=6202305819577fce2b11ab509ed94422775df30e;ds=sidebyside diff --git a/compiler/basicTypes/DataCon.lhs b/compiler/basicTypes/DataCon.lhs index 851bf66..0c6e3c5 100644 --- a/compiler/basicTypes/DataCon.lhs +++ b/compiler/basicTypes/DataCon.lhs @@ -87,15 +87,20 @@ differently, as follows. Note [Data Constructor Naming] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Each data constructor C has two, and possibly three, Names associated with it: +Each data constructor C has two, and possibly up to four, Names associated with it: - OccName Name space Used for + OccName Name space Name of --------------------------------------------------------------------------- - * The "source data con" C DataName The DataCon itself - * The "real data con" C VarName Its worker Id - * The "wrapper data con" $WC VarName Wrapper Id (optional) - -Each of these three has a distinct Unique. The "source data con" name + * The "data con itself" C DataName DataCon + * The "worker data con" C VarName Id (the worker) + * The "wrapper data con" $WC VarName Id (the wrapper) + * The "newtype coercion" :CoT TcClsName TyCon + +EVERY data constructor (incl for newtypes) has the former two (the +data con itself, and its worker. But only some data constructors have a +wrapper (see Note [The need for a wrapper]). + +Each of these three has a distinct Unique. The "data con itself" name appears in the output of the renamer, and names the Haskell-source data constructor. The type checker translates it into either the wrapper Id (if it exists) or worker Id (otherwise). @@ -129,6 +134,8 @@ The "wrapper Id", $WC, goes as follows nothing for the wrapper to do. That is, if its defn would be $wC = C +Note [The need for a wrapper] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Why might the wrapper have anything to do? Two reasons: * Unboxing strict fields (with -funbox-strict-fields) @@ -152,6 +159,8 @@ Why might the wrapper have anything to do? Two reasons: The third argument is a coerion [a] :: [a]:=:[a] +INVARIANT: the dictionary constructor for a class + never has a wrapper. A note about the stupid context