]> granicus.if.org Git - clang/commitdiff
Preprocessor: don't consider // to be a line comment in -E -std=c89 mode.
authorJordan Rose <jordan_rose@apple.com>
Tue, 5 Mar 2013 22:51:04 +0000 (22:51 +0000)
committerJordan Rose <jordan_rose@apple.com>
Tue, 5 Mar 2013 22:51:04 +0000 (22:51 +0000)
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>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176526 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/Lexer.cpp
test/Preprocessor/c90.c
test/Preprocessor/traditional-cpp.c

index 65ea5e3996442ee754354c24f060dd70ec587779..e18953d4483c38d1d7f798a619ed1d4c372e73a2 100644 (file)
@@ -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.
 
index 1d5010d75e34e1e579ce135f83cc344c94676829..3b9105fe6ee91b6bf6480affa7003e96a668e45f 100644 (file)
@@ -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
index 5a94c00c969fb969ed611f580e905c3bcbc3e72a..0396c9b126cd829a5a19b2e547e47e337c62cc3e 100644 (file)
@@ -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{{$}}
+ */