[erlang-bugs] Code should not compile

Richard Carlsson carlsson.richard@REDACTED
Wed Jul 27 13:57:59 CEST 2011


On 07/27/2011 01:44 AM, Gordon Guthrie wrote:
> I attach a module and a header file.
>
> The module hmac_api_lib.erl has a bug on line 9 - the define is
> incomplete. It should not compile, but it does.

It's a preprocessor macro definition - they work this way. The first 
thing that happens (after tokenization) is that the code is split up 
into "forms" - sections that end with a period followed by either 
whitespace (including newlines) or EOF. In your example:

   -define(RFC2116_HT, "\t"

   -compile(export_all).

the form begins with '-' 'define' and ends with 'export_all' ')'.

After that, the preprocessor recognizes the form as a macro definition 
and binds 'RFC2116_HT' to the token sequence "\t" '-' 'compile' '(' 
'export_all'. The last parentheses is considered part of the -define 
directive, so it's not included. (Remember that it used to be that you 
could even leave out the final parenthesis? It wasn't actually needed, 
because the period+whitespace tells you where the definition ends, but 
it caused some confusion, so the end parenthesis must be there nowadays.)

It should be possible to make the preprocessor detect this sort of 
mistake in typical cases and at least emit a warning, but in general, 
macros must still be allowed to 1) be spread over multiple lines, 2) 
contain token sequences like '- <atom> (', and 3) not require that the 
definition body is balanced with respect to parentheses and other token 
pairs like case/end. So, it's not a simple matter of changing how the 
end-of-macro is detected.

     /Richard



More information about the erlang-bugs mailing list