[comp.lang.c] Turbo C Preprocessor bug

kb5mu@pnet01.CTS.COM (06/07/87)

I still haven't bought Turbo C, but a friend reports a preprocessor
bug.  This code:
    #define ctrl(x) (x & 037)
    printf("ctrl(d) = %d\n", ctrl('d'));
expands to:
    printf("ctrl(d) = %d\n", (ctrl & 037));
instead of the correct:
    printf("ctrl(d) = %d\n", ('d' & 037));
This happens with all flavors of the compiler, including the
preprocessor-only version.

[This is an ANSI-compatible version of the more traditional
    #define ctrl(x) ('x' & 037)
    printf("ctrl(d) = %d\n", ctrl(d));
The traditional form doesn't work either.]

Paul Williamson
    ... sdcsvax!crash!pnet01!kb5mu
 or ... williams@macomw.arpa

markg@amd.UUCP (06/08/87)

In article <7729@brl-adm.ARPA> kb5mu@pnet01.CTS.COM (Paul Williamson) writes:
- a friend reports a preprocessor bug.  This code:
-    #define ctrl(x) (x & 037)
-    printf("ctrl(d) = %d\n", ctrl('d'));
-expands to:
-    printf("ctrl(d) = %d\n", (ctrl & 037));
-instead of the correct:
-    printf("ctrl(d) = %d\n", ('d' & 037));

This is only a bug in the CPP.EXE program.  TCC.EXE does not use this pre-
processor.

-This happens with all flavors of the compiler, including the
-preprocessor-only version.

I attempted to reproduce the same problem using TCC/TC.EXE.  The program
compiled and executed correctly.  Using your example, the program printed 4.
Sorry to say that TCC.EXE can't produce a preprocessor pass output file so
we could see what really happens, but you can look at the .ASM file.


-- 
 Mark Gorlinsky - AMD Processor Products Division/APPS SQA
 UUCP: {decwrl,ihnp4,allegra}!amd!markg
 AT&T: (408) 982-7811
 DISCLAIMER: My opinions are mine, not my employers.