]> granicus.if.org Git - clang/commitdiff
Simplify raw mode lexing by treating an unterminate /**/ comment the
authorChris Lattner <sabre@nondot.org>
Sun, 12 Oct 2008 01:31:51 +0000 (01:31 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 12 Oct 2008 01:31:51 +0000 (01:31 +0000)
same we we do an unterminated string or character literal.  This makes
it so we can guarantee that the lexer never calls into the
preprocessor (which would be suicide for a raw lexer).

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

include/clang/Basic/DiagnosticKinds.def
include/clang/Lex/Lexer.h
lib/Lex/Lexer.cpp
lib/Lex/TokenLexer.cpp

index 4e4a42f7ae87db89ee81d4281e547e6963182382..691f83e1b97bdd4251bdebc19fd9297ba9ceb271 100644 (file)
@@ -32,7 +32,7 @@ DIAG(null_in_char  , WARNING,
      "null character(s) preserved in character literal")
 DIAG(null_in_file  , WARNING,
      "null character ignored")
-DIAG(nested_block_comment, WARNING,
+DIAG(warn_nested_block_comment, WARNING,
      "\"/*\" within block comment")
 DIAG(escaped_newline_block_comment_end, WARNING,
      "escaped newline between */ characters at block comment end")
index 9b17377d7ca97fb99a6a3ada124cea0351f609fa..a3668dfd08ba10c904eb65b5b33310429bf338c8 100644 (file)
@@ -60,9 +60,8 @@ class Lexer {
   ///     effect of this, implicit macro expansion is naturally disabled.
   ///  3. "#" tokens at the start of a line are treated as normal tokens, not
   ///     implicitly transformed by the lexer.
-  ///  4. All diagnostic messages are disabled, except for unterminated /*.
-  ///  5. The only callback made into the preprocessor is to report a hard error
-  ///     on an unterminated '/*' comment.
+  ///  4. All diagnostic messages are disabled.
+  ///  5. No callbacks are made into the preprocessor.
   ///
   /// Note that in raw mode that the PP pointer may be null.
   bool LexingRawMode;
index 63bf58a12c8fbba8166db2d433eb750cf199768e..44a32dbe254e86f2aede305337d2fed301c48cab 100644 (file)
@@ -931,7 +931,8 @@ bool Lexer::SkipBlockComment(Token &Result, const char *CurPtr) {
   unsigned char C = getCharAndSize(CurPtr, CharSize);
   CurPtr += CharSize;
   if (C == 0 && CurPtr == BufferEnd+1) {
-    Diag(BufferPtr, diag::err_unterminated_block_comment);
+    if (!LexingRawMode)
+      Diag(BufferPtr, diag::err_unterminated_block_comment);
     BufferPtr = CurPtr-1;
     return true;
   }
@@ -1000,10 +1001,10 @@ bool Lexer::SkipBlockComment(Token &Result, const char *CurPtr) {
         // If this is a /* inside of the comment, emit a warning.  Don't do this
         // if this is a /*/, which will end the comment.  This misses cases with
         // embedded escaped newlines, but oh well.
-        Diag(CurPtr-1, diag::nested_block_comment);
+        Diag(CurPtr-1, diag::warn_nested_block_comment);
       }
     } else if (C == 0 && CurPtr == BufferEnd+1) {
-      Diag(BufferPtr, diag::err_unterminated_block_comment);
+      if (!LexingRawMode) Diag(BufferPtr, diag::err_unterminated_block_comment);
       // Note: the user probably forgot a */.  We could continue immediately
       // after the /*, but this would involve lexing a lot of what really is the
       // comment, which surely would confuse the parser.
index d3acaeaab544ced3d01fb3db2c3dfd94e0627f05..82b2b4df0b09876e847d93eec0ba0734a38d67a8 100644 (file)
@@ -377,11 +377,7 @@ bool TokenLexer::PasteTokens(Token &Tok) {
     // Lex the resultant pasted token into Result.
     Token Result;
     
-    // Avoid testing /*, as the lexer would think it is the start of a comment
-    // and emit an error that it is unterminated.
-    if (Tok.is(tok::slash) && RHS.is(tok::star)) {
-      isInvalid = true;
-    } else if (Tok.is(tok::identifier) && RHS.is(tok::identifier)) {
+    if (Tok.is(tok::identifier) && RHS.is(tok::identifier)) {
       // Common paste case: identifier+identifier = identifier.  Avoid creating
       // a lexer and other overhead.
       PP.IncrementPasteCounter(true);