diff options
| author | Jordan Rose <jordan_rose@apple.com> | 2013-03-05 22:51:04 +0000 |
|---|---|---|
| committer | Jordan Rose <jordan_rose@apple.com> | 2013-03-05 22:51:04 +0000 |
| commit | 864b8107397b5f6b18b45cd51249d2a7634e2b56 (patch) | |
| tree | 762b0ce78e8ffea3681220b5acd165604f118262 /clang/lib/Lex | |
| parent | 56fe4066e589ff76051d9af0344f931d7adf628a (diff) | |
| download | bcm5719-llvm-864b8107397b5f6b18b45cd51249d2a7634e2b56.tar.gz bcm5719-llvm-864b8107397b5f6b18b45cd51249d2a7634e2b56.zip | |
Preprocessor: don't consider // to be a line comment in -E -std=c89 mode.
It's beneficial when compiling to treat // as the start of a line
comment even in -std=c89 mode, since it's not valid C code (with a few
rare exceptions) and is usually intended as such. We emit a pedantic
warning and then continue on as if line comments were enabled.
This has been our behavior for quite some time.
However, people use the preprocessor for things besides C source files.
In today's prompting example, the input contains (unquoted) URLs, which
contain // but should still be preserved.
This change instructs the lexer to treat // as a plain token if Clang is
in C90 mode and generating preprocessed output rather than actually compiling.
<rdar://problem/13338743>
llvm-svn: 176526
Diffstat (limited to 'clang/lib/Lex')
| -rw-r--r-- | clang/lib/Lex/Lexer.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp index 65ea5e39964..e18953d4483 100644 --- a/clang/lib/Lex/Lexer.cpp +++ b/clang/lib/Lex/Lexer.cpp @@ -3121,10 +3121,13 @@ LexNextToken: // this as "foo / bar" and langauges with Line comments would lex it as // "foo". Check to see if the character after the second slash is a '*'. // If so, we will lex that as a "/" instead of the start of a comment. - // However, we never do this in -traditional-cpp mode. - if ((LangOpts.LineComment || - getCharAndSize(CurPtr+SizeTmp, SizeTmp2) != '*') && - !LangOpts.TraditionalCPP) { + // However, we never do this if we are just preprocessing. + bool TreatAsComment = LangOpts.LineComment && !LangOpts.TraditionalCPP; + if (!TreatAsComment) + if (!(PP && PP->isPreprocessedOutput())) + TreatAsComment = getCharAndSize(CurPtr+SizeTmp, SizeTmp2) != '*'; + + if (TreatAsComment) { if (SkipLineComment(Result, ConsumeChar(CurPtr, SizeTmp, Result))) return; // There is a token to return. |

