<div dir="ltr">On Fri, Jul 5, 2013 at 3:44 PM, Austin Seipp <span dir="ltr"><<a href="mailto:aseipp@pobox.com" target="_blank">aseipp@pobox.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
Attached is a patch that makes the preprocessor ignore token pasting<br>
(##) and stringification (#) when in -traditional mode. This makes it<br>
behave more like GCC[1].<br>
<br>
This change fixes PR16371, and is needed for Clang to function<br>
properly as a preprocessor for Haskell (in the Glasgow Haskell<br>
Compiler.) If you're curious and look at the bug, I made some<br>
incorrect assumptions about the behavior of -traditional for GCC (and<br>
attached a bad patch,) but this fixes the problem in the principled<br>
way. And the patch is simpler, which is good too.<br>
<br>
There is something this patch does not handle compared to GCC. For<br>
traditional macros, GCC will expand parameter identifiers *inside*<br>
string bodies. This allows you to imitate these operators. So this<br>
code:<br>
<br>
---<br>
#define foo(a) test(#a)<br>
foo(123)<br>
---<br>
<br>
would become the following under -traditional:<br>
<br>
---<br>
#define foo(a) test("a")<br>
foo(123)<br>
---<br>
<br>
and 'a' would be expanded to '123' inside the string. This would even<br>
occur in a case like:<br>
<br>
---<br>
#define foo(a) test("this is a test")<br>
---<br>
<br>
under -traditional mode.<br>
<br>
This patch does not attempt to implement this behavior; we don't need<br>
it in GHC, and Clang's -traditional is already a subset of what GCC<br>
supports anyway, and as a result it's pretty simple.</blockquote><div><br></div><div>Completely emulating -traditional would be crazy with our current lexer and parser implementation; I think the only implementation we would accept would be implementing it from scratch, independent from the current Lexer.  (There wouldn't be much code duplication given how different the semantics of traditional preprocessing are, and we could simplify the implementation by assuming it's only used for preprocessed output.)</div>

<div><br></div><div>Richard, do you have an opinion on this patch?  You've expressed some concerns about -traditional-cpp before.</div><div><br></div><div>-Eli  </div></div></div></div>