<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">These tests are failing on VS buildbot.<div><br></div><div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">Failing Tests (6):</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">      Clang :: Lexer/cxx1y_binary_literal.cpp</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">      Clang :: Lexer/cxx1y_digit_separators.cpp</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">      Clang :: Lexer/gnu-flags.c</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">      Clang :: Lexer/pragma-operators.cpp</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">      Clang :: SemaCXX/cxx1y-user-defined-literals.cpp</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">      Clang :: SemaCXX/cxx98-compat-pedantic.cpp</div><div><br></div><div><pre style="font-family: 'Courier New', courier, monotype, monospace; font-size: medium;"><span class="stdout">Typical diagnostic is:</span></pre><pre style="font-family: 'Courier New', courier, monotype, monospace; font-size: medium;"><span class="stdout">    File C:\...\src\tools\clang\test\SemaCXX\cxx98-compat-pedantic.cpp Line 32804 </span></pre><pre style="font-family: 'Courier New', courier, monotype, monospace; font-size: medium;"><span class="stdout">(directive at C:\...\src\tools\clang\test\SemaCXX\cxx98-compat-pedantic.cpp:32806): binary integer literals are incompatible with C++ standards before C++1y
</span></pre></div><div><span class="stdout">- Fariborz</span></div><div><span class="stdout"><br></span></div><div><div>On Sep 25, 2013, at 8:33 PM, Richard Smith <<a href="mailto:richard-llvm@metafoo.co.uk">richard-llvm@metafoo.co.uk</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Author: rsmith<br>Date: Wed Sep 25 22:33:06 2013<br>New Revision: 191417<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=191417&view=rev">http://llvm.org/viewvc/llvm-project?rev=191417&view=rev</a><br>Log:<br>Implement C++1y digit separator proposal (' as a digit separator). This is not<br>yet approved by full committee, but was unanimously supported by EWG.<br><br>Added:<br>    cfe/trunk/test/Lexer/cxx1y_digit_separators.cpp<br>Modified:<br>    cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td<br>    cfe/trunk/include/clang/Lex/LiteralSupport.h<br>    cfe/trunk/lib/Lex/Lexer.cpp<br>    cfe/trunk/lib/Lex/LiteralSupport.cpp<br>    cfe/trunk/test/Lexer/cxx1y_binary_literal.cpp<br>    cfe/trunk/test/SemaCXX/cxx98-compat.cpp<br><br>Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=191417&r1=191416&r2=191417&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=191417&r1=191416&r2=191417&view=diff</a><br>==============================================================================<br>--- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original)<br>+++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Wed Sep 25 22:33:06 2013<br>@@ -159,6 +159,11 @@ def err_invalid_suffix_integer_constant<br>   "invalid suffix '%0' on integer constant">;<br> def err_invalid_suffix_float_constant : Error<<br>   "invalid suffix '%0' on floating constant">;<br>+def warn_cxx11_compat_digit_separator : Warning<<br>+  "digit separators are incompatible with C++ standards before C++1y">,<br>+  InGroup<CXXPre1yCompat>, DefaultIgnore;<br>+def err_digit_separator_not_between_digits : Error<<br>+  "digit separator cannot appear at %select{start|end}0 of digit sequence">;<br> def warn_extraneous_char_constant : Warning<<br>   "extraneous characters in character constant ignored">;<br> def warn_char_constant_too_large : Warning<<br><br>Modified: cfe/trunk/include/clang/Lex/LiteralSupport.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/LiteralSupport.h?rev=191417&r1=191416&r2=191417&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/LiteralSupport.h?rev=191417&r1=191416&r2=191417&view=diff</a><br>==============================================================================<br>--- cfe/trunk/include/clang/Lex/LiteralSupport.h (original)<br>+++ cfe/trunk/include/clang/Lex/LiteralSupport.h Wed Sep 25 22:33:06 2013<br>@@ -100,10 +100,16 @@ private:<br><br>   void ParseNumberStartingWithZero(SourceLocation TokLoc);<br><br>+  static bool isDigitSeparator(char C) { return C == '\''; }<br>+<br>+  /// \brief Ensure that we don't have a digit separator here.<br>+  void checkSeparator(SourceLocation TokLoc, const char *Pos,<br>+                      bool IsAfterDigits);<br>+<br>   /// SkipHexDigits - Read and skip over any hex digits, up to End.<br>   /// Return a pointer to the first non-hex digit or End.<br>   const char *SkipHexDigits(const char *ptr) {<br>-    while (ptr != ThisTokEnd && isHexDigit(*ptr))<br>+    while (ptr != ThisTokEnd && (isHexDigit(*ptr) || isDigitSeparator(*ptr)))<br>       ptr++;<br>     return ptr;<br>   }<br>@@ -111,7 +117,8 @@ private:<br>   /// SkipOctalDigits - Read and skip over any octal digits, up to End.<br>   /// Return a pointer to the first non-hex digit or End.<br>   const char *SkipOctalDigits(const char *ptr) {<br>-    while (ptr != ThisTokEnd && ((*ptr >= '0') && (*ptr <= '7')))<br>+    while (ptr != ThisTokEnd &&<br>+           ((*ptr >= '0' && *ptr <= '7') || isDigitSeparator(*ptr)))<br>       ptr++;<br>     return ptr;<br>   }<br>@@ -119,7 +126,7 @@ private:<br>   /// SkipDigits - Read and skip over any digits, up to End.<br>   /// Return a pointer to the first non-hex digit or End.<br>   const char *SkipDigits(const char *ptr) {<br>-    while (ptr != ThisTokEnd && isDigit(*ptr))<br>+    while (ptr != ThisTokEnd && (isDigit(*ptr) || isDigitSeparator(*ptr)))<br>       ptr++;<br>     return ptr;<br>   }<br>@@ -127,7 +134,8 @@ private:<br>   /// SkipBinaryDigits - Read and skip over any binary digits, up to End.<br>   /// Return a pointer to the first non-binary digit or End.<br>   const char *SkipBinaryDigits(const char *ptr) {<br>-    while (ptr != ThisTokEnd && (*ptr == '0' || *ptr == '1'))<br>+    while (ptr != ThisTokEnd &&<br>+           (*ptr == '0' || *ptr == '1' || isDigitSeparator(*ptr)))<br>       ptr++;<br>     return ptr;<br>   }<br><br>Modified: cfe/trunk/lib/Lex/Lexer.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Lexer.cpp?rev=191417&r1=191416&r2=191417&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Lexer.cpp?rev=191417&r1=191416&r2=191417&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/Lex/Lexer.cpp (original)<br>+++ cfe/trunk/lib/Lex/Lexer.cpp Wed Sep 25 22:33:06 2013<br>@@ -1606,6 +1606,18 @@ bool Lexer::LexNumericConstant(Token &Re<br>       return LexNumericConstant(Result, ConsumeChar(CurPtr, Size, Result));<br>   }<br><br>+  // If we have a digit separator, continue.<br>+  if (C == '\'' && getLangOpts().CPlusPlus1y) {<br>+    unsigned NextSize;<br>+    char Next = getCharAndSizeNoWarn(CurPtr + Size, NextSize, getLangOpts());<br>+    if (isAlphanumeric(Next)) {<br>+      if (!isLexingRawMode())<br>+        Diag(CurPtr, diag::warn_cxx11_compat_digit_separator);<br>+      CurPtr = ConsumeChar(CurPtr, Size, Result);<br>+      return LexNumericConstant(Result, CurPtr);<br>+    }<br>+  }<br>+<br>   // Update the location of token as well as BufferPtr.<br>   const char *TokStart = BufferPtr;<br>   FormTokenWithChars(Result, CurPtr, tok::numeric_constant);<br><br>Modified: cfe/trunk/lib/Lex/LiteralSupport.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=191417&r1=191416&r2=191417&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=191417&r1=191416&r2=191417&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/Lex/LiteralSupport.cpp (original)<br>+++ cfe/trunk/lib/Lex/LiteralSupport.cpp Wed Sep 25 22:33:06 2013<br>@@ -498,15 +498,19 @@ NumericLiteralParser::NumericLiteralPars<br>       hadError = true;<br>       return;<br>     } else if (*s == '.') {<br>+      checkSeparator(TokLoc, s, true);<br>       s++;<br>       saw_period = true;<br>+      checkSeparator(TokLoc, s, false);<br>       s = SkipDigits(s);<br>     }<br>     if ((*s == 'e' || *s == 'E')) { // exponent<br>+      checkSeparator(TokLoc, s, true);<br>       const char *Exponent = s;<br>       s++;<br>       saw_exponent = true;<br>       if (*s == '+' || *s == '-')  s++; // sign<br>+      checkSeparator(TokLoc, s, false);<br>       const char *first_non_digit = SkipDigits(s);<br>       if (first_non_digit != s) {<br>         s = first_non_digit;<br>@@ -520,6 +524,7 @@ NumericLiteralParser::NumericLiteralPars<br>   }<br><br>   SuffixBegin = s;<br>+  checkSeparator(TokLoc, s, true);<br><br>   // Parse the suffix.  At this point we can classify whether we have an FP or<br>   // integer constant.<br>@@ -676,6 +681,21 @@ bool NumericLiteralParser::isValidUDSuff<br>       .Default(false);<br> }<br><br>+void NumericLiteralParser::checkSeparator(SourceLocation TokLoc,<br>+                                          const char *Pos, bool IsAfterDigits) {<br>+  if (IsAfterDigits) {<br>+    assert(Pos != ThisTokBegin);<br>+    --Pos;<br>+  } else {<br>+    assert(Pos != ThisTokEnd);<br>+  }<br>+<br>+  if (isDigitSeparator(*Pos))<br>+    PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, Pos - ThisTokBegin),<br>+            diag::err_digit_separator_not_between_digits)<br>+      << IsAfterDigits;<br>+}<br>+<br> /// ParseNumberStartingWithZero - This method is called when the first character<br> /// of the number is found to be a zero.  This means it is either an octal<br> /// number (like '04') or a hex number ('0x123a') a binary number ('0b1010') or<br>@@ -736,7 +756,7 @@ void NumericLiteralParser::ParseNumberSt<br>   }<br><br>   // Handle simple binary numbers 0b01010<br>-  if (*s == 'b' || *s == 'B') {<br>+  if ((*s == 'b' || *s == 'B') && (s[1] == '0' || s[1] == '1')) {<br>     // 0b101010 is a C++1y / GCC extension.<br>     PP.Diag(TokLoc,<br>             PP.getLangOpts().CPlusPlus1y<br>@@ -840,7 +860,8 @@ bool NumericLiteralParser::GetIntegerVal<br>   if (alwaysFitsInto64Bits(radix, NumDigits)) {<br>     uint64_t N = 0;<br>     for (const char *Ptr = DigitsBegin; Ptr != SuffixBegin; ++Ptr)<br>-      N = N * radix + llvm::hexDigitValue(*Ptr);<br>+      if (!isDigitSeparator(*Ptr))<br>+        N = N * radix + llvm::hexDigitValue(*Ptr);<br><br>     // This will truncate the value to Val's input width. Simply check<br>     // for overflow by comparing.<br>@@ -857,6 +878,11 @@ bool NumericLiteralParser::GetIntegerVal<br><br>   bool OverflowOccurred = false;<br>   while (Ptr < SuffixBegin) {<br>+    if (isDigitSeparator(*Ptr)) {<br>+      ++Ptr;<br>+      continue;<br>+    }<br>+<br>     unsigned C = llvm::hexDigitValue(*Ptr++);<br><br>     // If this letter is out of bound for this radix, reject it.<br>@@ -885,8 +911,17 @@ NumericLiteralParser::GetFloatValue(llvm<br>   using llvm::APFloat;<br><br>   unsigned n = std::min(SuffixBegin - ThisTokBegin, ThisTokEnd - ThisTokBegin);<br>-  return Result.convertFromString(StringRef(ThisTokBegin, n),<br>-                                  APFloat::rmNearestTiesToEven);<br>+<br>+  llvm::SmallString<16> Buffer;<br>+  StringRef Str(ThisTokBegin, n);<br>+  if (Str.find('\'') != StringRef::npos) {<br>+    Buffer.reserve(n);<br>+    std::remove_copy_if(Str.begin(), Str.end(), std::back_inserter(Buffer),<br>+                        &isDigitSeparator);<br>+    Str = Buffer;<br>+  }<br>+<br>+  return Result.convertFromString(Str, APFloat::rmNearestTiesToEven);<br> }<br><br><br><br>Modified: cfe/trunk/test/Lexer/cxx1y_binary_literal.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/cxx1y_binary_literal.cpp?rev=191417&r1=191416&r2=191417&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/cxx1y_binary_literal.cpp?rev=191417&r1=191416&r2=191417&view=diff</a><br>==============================================================================<br>--- cfe/trunk/test/Lexer/cxx1y_binary_literal.cpp (original)<br>+++ cfe/trunk/test/Lexer/cxx1y_binary_literal.cpp Wed Sep 25 22:33:06 2013<br>@@ -17,3 +17,4 @@ int k1 = 0b1234; // expected-error {{inv<br> // we'll need to rework our binary literal parsing rules.<br> int k2 = 0b10010f; // expected-error {{invalid digit 'f' in binary constant}}<br> int k3 = 0b10010g; // expected-error {{invalid suffix 'g' on integer constant}}<br>+int k4 = 0b; // expected-error {{invalid digit 'b' in octal constant}}<br><br>Added: cfe/trunk/test/Lexer/cxx1y_digit_separators.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/cxx1y_digit_separators.cpp?rev=191417&view=auto">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/cxx1y_digit_separators.cpp?rev=191417&view=auto</a><br>==============================================================================<br>--- cfe/trunk/test/Lexer/cxx1y_digit_separators.cpp (added)<br>+++ cfe/trunk/test/Lexer/cxx1y_digit_separators.cpp Wed Sep 25 22:33:06 2013<br>@@ -0,0 +1,34 @@<br>+// RUN: %clang_cc1 -std=c++1y -verify %s<br>+<br>+int operator""ms(unsigned long long); // expected-warning {{reserved}}<br>+float operator""ms(long double); // expected-warning {{reserved}}<br>+<br>+namespace integral {<br>+  static_assert(1'2'3 == 12'3, "");<br>+  static_assert(1'000'000 == 0xf'4240, "");<br>+  static_assert(0'004'000'000 == 0x10'0000, "");<br>+  static_assert(0b0101'0100 == 0x54, "");<br>+<br>+  int a = 123'; //'; // expected-error {{expected ';'}}<br>+  int b = 0'xff; // expected-error {{digit separator cannot appear at end of digit sequence}} expected-error {{suffix 'xff' on integer}}<br>+  int c = 0x'ff; // expected-error {{suffix 'x'ff' on integer}}<br>+  int d = 0'1234; // ok, octal<br>+  int e = 0'b1010; // expected-error {{digit 'b' in octal constant}}<br>+  int f = 0b'1010; // expected-error {{invalid digit 'b' in octal}}<br>+  int g = 123'ms; // expected-error {{digit separator cannot appear at end of digit sequence}}<br>+<br>+  // FIXME: not yet known if _ after ' will be permitted.<br>+  int z = 0'123'_foo; //'; // expected-error {{expected ';'}}<br>+}<br>+<br>+namespace floating {<br>+  static_assert(0'123.456'7 == 123.4567, "");<br>+  static_assert(1e1'0 == 10'000'000'000, "");<br>+<br>+  float a = 1'e1; // expected-error {{digit separator cannot appear at end of digit sequence}}<br>+  float b = 1'0e1;<br>+  float c = 1.'0e1; // expected-error {{digit separator cannot appear at start of digit sequence}}<br>+  float d = 1.0'e1; // expected-error {{digit separator cannot appear at end of digit sequence}}<br>+  float e = 1e'1; // expected-error {{digit separator cannot appear at start of digit sequence}}<br>+  float f = 1e1'ms; // expected-error {{digit separator cannot appear at end of digit sequence}}<br>+}<br><br>Modified: cfe/trunk/test/SemaCXX/cxx98-compat.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx98-compat.cpp?rev=191417&r1=191416&r2=191417&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx98-compat.cpp?rev=191417&r1=191416&r2=191417&view=diff</a><br>==============================================================================<br>--- cfe/trunk/test/SemaCXX/cxx98-compat.cpp (original)<br>+++ cfe/trunk/test/SemaCXX/cxx98-compat.cpp Wed Sep 25 22:33:06 2013<br>@@ -1,8 +1,5 @@<br> // RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wc++98-compat -verify %s<br>-// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s<br>-// RUN: %clang_cc1 -fsyntax-only -std=c++1y -Wc++98-c++11-compat -verify %s -DCXX1YCOMPAT<br>-<br>-#ifndef CXX1YCOMPAT<br>+// RUN: %clang_cc1 -fsyntax-only -std=c++1y -Wc++98-compat -verify %s -DCXX1YCOMPAT<br><br> namespace std {<br>   struct type_info;<br>@@ -381,7 +378,6 @@ namespace rdar11736429 {<br>     X x; // expected-warning{{union member 'x' with a non-trivial constructor is incompatible with C++98}}<br>   };<br> }<br>-#endif<br><br> template<typename T> T var = T(10);<br> #ifdef CXX1YCOMPAT<br>@@ -455,3 +451,6 @@ template<> int B::v<int> = 10;<br> template int B::v<int>;<br> float fsvar = B::v<float>;<br><br>+#ifdef CXX1YCOMPAT<br>+int digit_seps = 123'456; // expected-warning {{digit separators are incompatible with C++ standards before C++1y}}<br>+#endif<br><br><br>_______________________________________________<br>cfe-commits mailing list<br><a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits<br></blockquote></div><br></div></body></html>