Skip to content

Invalid constructor names are accepted in data declarations

Earlier today, someone was asking on #haskell why the constructor name (^) wouldn't work in GADT definitions. My response was that (^) isn't a constructor name, but much to my surprise, GHC accepts such names in a regular data declaration:

data Foo = F | (^^^^) Int Int

This creates a Foo type and value constructor F, but no value constructor (^^^^). However, in 7.6.3, if DataKinds are enabled, both constructors appear at the type level.

In HEAD, the same definition is accepted, with only F existing at the value level, as before. But at the type level, both F and (^^^^) just generate errors that Foo is not a promotable type. At that point, I think there's no question that the declaration should just be ruled out.

Trac metadata
Trac field Value
Version 7.6.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information