From 693fdfa069b74ffe1f79caa3c9ea8754555d29bd Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Tue, 5 Mar 2013 22:51:04 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176526 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Lex/Lexer.cpp | 11 +++++++---- test/Preprocessor/c90.c | 5 +++++ test/Preprocessor/traditional-cpp.c | 4 ++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index 65ea5e3996..e18953d448 100644 --- a/lib/Lex/Lexer.cpp +++ b/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. diff --git a/test/Preprocessor/c90.c b/test/Preprocessor/c90.c index 1d5010d75e..3b9105fe6e 100644 --- a/test/Preprocessor/c90.c +++ b/test/Preprocessor/c90.c @@ -1,4 +1,5 @@ /* RUN: %clang_cc1 %s -std=c89 -Eonly -verify -pedantic-errors + * RUN: %clang_cc1 %s -std=c89 -E | FileCheck %s */ /* PR3919 */ @@ -8,3 +9,7 @@ #define foo3$bar /* expected-error {{'$' in identifier}} */ +/* CHECK-NOT: this comment should be missing + * CHECK: {{^}}// this comment should be present{{$}} + */ +// this comment should be present diff --git a/test/Preprocessor/traditional-cpp.c b/test/Preprocessor/traditional-cpp.c index 5a94c00c96..0396c9b126 100644 --- a/test/Preprocessor/traditional-cpp.c +++ b/test/Preprocessor/traditional-cpp.c @@ -78,3 +78,7 @@ a b c in skipped block /* CHECK-NOT: {{^}}a b c in skipped block{{$}} * CHECK-NOT: {{^}}/* Comments are whitespace too */ + +Preserve URLs: http://clang.llvm.org +/* CHECK: {{^}}Preserve URLs: http://clang.llvm.org{{$}} + */ -- 2.40.0