diff --git a/Driver/PrintPreprocessedOutput.cpp b/Driver/PrintPreprocessedOutput.cpp
--- a/Driver/PrintPreprocessedOutput.cpp
+++ b/Driver/PrintPreprocessedOutput.cpp
@@ -297,6 +297,7 @@
   TokenInfo[tok::colon           ] |= aci_custom_firstchar;
   TokenInfo[tok::hash            ] |= aci_custom_firstchar;
   TokenInfo[tok::arrow           ] |= aci_custom_firstchar;
+  TokenInfo[tok::ellipsis        ] |= aci_custom_firstchar;
   
   // These tokens change behavior if followed by an '='.
   TokenInfo[tok::amp         ] |= aci_avoid_equal;           // &=
@@ -436,8 +437,10 @@
     return IsIdentifierL(PrevTok, PP);
   case tok::numeric_constant:
     return isalnum(FirstChar) || Tok.is(tok::numeric_constant) ||
-           FirstChar == '+' || FirstChar == '-' || FirstChar == '.';
-  case tok::period:          // ..., .*, .1234
+           FirstChar == '.';
+  case tok::period:          // .1234
+    return isdigit(FirstChar);
+  case tok::ellipsis:          // ..., .*, .1234
     return FirstChar == '.' || FirstChar == '*' || isdigit(FirstChar);
   case tok::amp:             // &&
     return FirstChar == '&';
@@ -456,7 +459,8 @@
   case tok::percent:         // %>, %:
     return FirstChar == '>' || FirstChar == ':';
   case tok::colon:           // ::, :>
-    return FirstChar == ':' || FirstChar == '>';
+    return PP.getLangOptions().CPlusPlus &&
+      (FirstChar == ':' || FirstChar == '>');
   case tok::hash:            // ##, #@, %:%:
     return FirstChar == '#' || FirstChar == '@' || FirstChar == '%';
   case tok::arrow:           // ->*
