fatal error: Internal error: put_tokens.

Started by borgfan, August 17, 2005, 06:30:54 PM

Previous topic - Next topic

borgfan

Just started using Pelles C and am frequently using it instead of MSVC - easy and quick to use.

Am a bit stuck compiling a particular file and get a number of errors which I suspect indicate a bug or compiler limitation - the file does perform loads of preprocessor manipulation.  (the source compiles ok with MSVC or Watcom).

E:\aes\aestab.c(204): error #1025: Eval botch (unknown operator).
E:\aes\aestab.c(207): error #1025: Eval botch (unknown operator).
E:\aes\aestab.c(210): error #1025: Eval botch (unknown operator).
E:\aes\aestab.c(213): error #1025: Eval botch (unknown operator).
E:\aes\aestab.c(230): fatal error: Internal error: put_tokens.

Any suggestions?

Pelle

From the error messages, without looking at the actual code, I can only say that there is a problem with a preprocessor expression - it seems to contain an "unknown" operator. AFAIK, all standard C preprocessor operators should be supported...

What exactly *is* on line 204, 207, ...?

Pelle
/Pelle

borgfan

I've attached the relevant source files, hope this helps.  The error lines are #if expressions , but I would suspect that the problem sits elsewhere.  I have compiled the file ok with VC++ in MS Visual Studio .Net 2003

Gerard

Pelle

The lines all looked like this:

#if RC_LENGTH > 10


and RC_LENGTH had this definition:

#if !defined(BLOCK_SIZE)
#define RC_LENGTH   29
#else
#define RC_LENGTH   (5 * BLOCK_SIZE / 4 - (BLOCK_SIZE == 16 ? 10 : 11))
#endif


So with BLOCK_SIZE defined, the conditional operator was used. A bugfix in the preprocessor evaluator, exactly a year ago, was great - except that it "killed" the conditional operator. My regression tests didn't cover this case - and it's obviously an uncommon operator since it survived a whole year...

Attached is a bugfix version of the compiler. If it works for you too, it will be included in the next beta version of 4.00.
/Pelle

borgfan

Thanks for the speedy response - impressive!

I tried a re-compile with the bugfix you supplied but I'm getting other errors which look like they are related to the previous problem:


Building aestab.obj.
E:\aes\filenec\aesopt.h(258): warning #1031: Multibyte character constant undefined.
E:\aes\filenec\aesopt.h(260): warning #1031: Multibyte character constant undefined.
E:\aes\filenec\aestab.c(230): fatal error: Internal error: put_tokens.

where
258   #elif (('1234' >> 24) == '1')
259   #  define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
260   #elif (('4321' >> 24) == '1')
261   #  define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
262   #endif

Pelle

Right. I extracted code to test the "unknown operator" problem, I never tested with the entire file. You actually have two problems (at least).

The "put-tokens" problem is because a *huge* buffer seems to be needed to generate the preprocessor output in this case. This will take a little longer to fix - I will look at it tomorrow (it's sleepy time now...)

The following "character constant" is non-standard, and I don't support it even in MS mode. You can probably work around this - see comments in aesopt.h around line 220.

'1234'


Pelle
/Pelle

Pelle

Let's try again. The attached version seems to work. I still get errors because I'm missing aes.h, and possibly other #include files, but I think the errors are from missing declarations rather than compiler problems.

Pelle
/Pelle

borgfan

Success!  Thanks very much for this correction - hope it wasn't so obscure that it wasted your time. :D


Gerard

Pelle

Great news! Thanks!

A bit obscure - but if it made the compiler a little bit better, probably a good investment in time... ;-)

Pelle
/Pelle