Ticket #7667 (new bug)

Opened 4 months ago

Last modified 6 weeks ago

Template Haskell fails to recognize type operator/function +

Reported by: andygill Owned by:
Priority: normal Milestone: 7.8.1
Component: Template Haskell Version: 7.6.2
Keywords: Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: GHC rejects valid program Difficulty: Unknown
Test Case: Blocked By:
Blocking: Related Tickets:

Description

The following message is issued for a valid TH program.

Main.hs:7:1:
    Illegal type constructor or class name: `+'
    When splicing a TH declaration:
      type instance GHC.TypeLits.+ 1 2 = 3
Failed, modules loaded: Test1.

Code attached.

The program is attempting to capture the name +, as used by Nat at the type level.

The problem appears to be in Convert.hs

 -- Convert.hs

     okOcc :: OccName.NameSpace -> String -> Bool
     okOcc _ [] = False 
     okOcc ns str@(c:_) | OccName.isVarNameSpace ns = startsVarId c || startsVarSym c
                        | otherwise = startsConId c || startsConSym c || str == "[]"

+ is rejected, by okOcc, even though it is acceptable, the symbol neither starts with upper-case, or ':'.

I have tried using reify to extract the *actual* name from other sources (rather than use mkNameG_tc), and it fails in the same way.

Attachments

Test1.hs Download (360 bytes) - added by andygill 4 months ago.
Main.hs Download (97 bytes) - added by andygill 4 months ago.

Change History

Changed 4 months ago by andygill

Changed 4 months ago by andygill

Changed 3 months ago by simonpj

  • difficulty set to Unknown

OK so we could test flags etc make okOcc accept the type operator. Or alternatively we could simply omit the test, which would allow TH to generate names that the programmer could not right. In fact it currently only checks the name space; that is, checks that if the name claims to be a data constructor then it starts with an uppper case letter or colon. But it does not check the name is a legal one; it could be the data constructor C$$ for example, which the programmer can't write.

I'm inclined to go the whole way, and simply treat the name space in the TH name as authoritative, regardless of the string that used for the name.

I'll that unless someone yells.

Simon

Changed 6 weeks ago by igloo

  • milestone set to 7.8.1

See also #7484

Note: See TracTickets for help on using tickets.