Opened 9 years ago

Closed 9 years ago

Last modified 44 years ago

#388 closed bug (Rejected)

Incorrect "Defined but not used"

Reported by: nobody Owned by: nobody
Priority: normal Milestone:
Component: Compiler Version: 6.4
Keywords: Cc:
Operating System: Architecture:
Type of failure: Difficulty:
Test Case: Blocked By:
Blocking: Related Tickets:

Description

This is johndetr@microsoft.com.

When I compile the following function:

150 hexArg :: P Hex
151 hexArg = do MyState i n <- getState
152             let i = i + 1
153             setState (MyState i n)
154             x <- hexNumber
155             if i < n then do { char ','; return () }
156                       else do { char ')'; eof }
157             return x

I get the following messages:

Vesta.hs:151:20: Warning: Defined but not used: `i'

Vesta.hs:152:16:
    Warning: This binding for `i' shadows an existing 
binding
             In the binding group for: i

The second  is correct, if course, but the first is not.

If I change the new binding to i' instead of i (and the 
references below, of course) *both* messages go away!

Please let me know if you'd like more information, a 
shorter error case, etc.

Change History (1)

comment:1 Changed 9 years ago by simonpj

  • Status changed from assigned to closed
Logged In: YES 
user_id=50165

I'm afraid the error message is quite right.  In Haskell, 'let' is 
always recursive, so 
    let i = i+1
means
    letrec i = i+1
which binds i to bottom, of course. Indeed the 'i' bound by the 
previous statement is unused.  Changing the new binding to 
something else is the right thing to do.
Note: See TracTickets for help on using tickets.