The (static) type of fd is int for its entire lifetime. But the value of fd has properties that change throughout the function body: these are dynamic properties. Assuming a POSIX implementation, at line
line 2. fd value is indeterminate; line 3. fd value is either the erroneous value -1 or an open file descriptor; line 5. fd value is the erroneous value -1; line 8. fd value is an open file descriptor; line 11. fd value is an ordinary integer and cannot be used as a file descriptor.
Here, the e_opt_hown annotation encodes the information that next may be NULL or point to a Node object in the heap of which it has ownership.