Sfoglia il codice sorgente

Remove irregular digit placement check from NumericLiteral. (#4150)

This changed in #1983 and although we updated explorer, we missed
toolchain.
Jon Ross-Perkins 1 anno fa
parent
commit
4c6dc2eade

+ 0 - 1
toolchain/diagnostics/diagnostic_kind.def

@@ -37,7 +37,6 @@ CARBON_DIAGNOSTIC_KIND(HexadecimalEscapeMissingDigits)
 CARBON_DIAGNOSTIC_KIND(InvalidDigit)
 CARBON_DIAGNOSTIC_KIND(InvalidDigitSeparator)
 CARBON_DIAGNOSTIC_KIND(InvalidHorizontalWhitespaceInString)
-CARBON_DIAGNOSTIC_KIND(IrregularDigitSeparators)
 CARBON_DIAGNOSTIC_KIND(MismatchedIndentInString)
 CARBON_DIAGNOSTIC_KIND(MultiLineStringWithDoubleQuotes)
 CARBON_DIAGNOSTIC_KIND(NoWhitespaceAfterCommentIntroducer)

+ 0 - 50
toolchain/lex/numeric_literal.cpp

@@ -324,11 +324,6 @@ auto NumericLiteral::Parser::CheckDigitSequence(llvm::StringRef text,
     return {.ok = false};
   }
 
-  // Check that digit separators occur in exactly the expected positions.
-  if (num_digit_separators) {
-    CheckDigitSeparatorPlacement(text, radix, num_digit_separators);
-  }
-
   if (!CanLexInt(emitter_, text)) {
     return {.ok = false};
   }
@@ -336,51 +331,6 @@ auto NumericLiteral::Parser::CheckDigitSequence(llvm::StringRef text,
   return {.ok = true, .has_digit_separators = (num_digit_separators != 0)};
 }
 
-// Given a number with digit separators, check that the digit separators are
-// correctly positioned.
-auto NumericLiteral::Parser::CheckDigitSeparatorPlacement(
-    llvm::StringRef text, Radix radix, int num_digit_separators) -> void {
-  CARBON_DCHECK(std::count(text.begin(), text.end(), '_') ==
-                num_digit_separators)
-      << "given wrong number of digit separators: " << num_digit_separators;
-
-  if (radix == Radix::Binary) {
-    // There are no restrictions on digit separator placement for binary
-    // literals.
-    return;
-  }
-
-  auto diagnose_irregular_digit_separators = [&]() {
-    CARBON_DIAGNOSTIC(
-        IrregularDigitSeparators, Error,
-        "Digit separators in {0} number should appear every {1} characters "
-        "from the right.",
-        NumericLiteral::Radix, int);
-    emitter_.Emit(text.begin(), IrregularDigitSeparators, radix,
-                  radix == Radix::Decimal ? 3 : 4);
-  };
-
-  // For decimal and hexadecimal digit sequences, digit separators must form
-  // groups of 3 or 4 digits (4 or 5 characters), respectively.
-  int stride = (radix == Radix::Decimal ? 4 : 5);
-  int remaining_digit_separators = num_digit_separators;
-  const auto* pos = text.end();
-  while (pos - text.begin() >= stride) {
-    pos -= stride;
-    if (*pos != '_') {
-      diagnose_irregular_digit_separators();
-      return;
-    }
-
-    --remaining_digit_separators;
-  }
-
-  // Check there weren't any other digit separators.
-  if (remaining_digit_separators) {
-    diagnose_irregular_digit_separators();
-  }
-}
-
 // Check that we don't have a '0' prefix on a non-zero decimal integer.
 auto NumericLiteral::Parser::CheckLeadingZero() -> bool {
   if (radix_ == Radix::Decimal && int_part_.starts_with("0") &&

+ 8 - 19
toolchain/lex/numeric_literal_test.cpp

@@ -136,17 +136,22 @@ TEST_F(NumericLiteralTest, ValidatesBaseSpecifier) {
 
 TEST_F(NumericLiteralTest, ValidatesIntDigitSeparators) {
   llvm::StringLiteral valid[] = {
-      // Decimal literals optionally have digit separators every 3 places.
+      // Decimal literals.
       "1_234",
       "123_456",
       "1_234_567",
+      "12_34",
+      "123_4_6_789",
+      "12_3456_789",
 
-      // Hexadecimal literals optionally have digit separators every 4 places.
+      // Hexadecimal literals.
       "0x1_0000",
       "0x1000_0000",
       "0x1_0000_0000",
+      "0x12_3",
+      "0x1234_567",
 
-      // Binary integer literals can have digit separators anywhere..
+      // Binary literals.
       "0b1_0_1_0_1_0",
       "0b111_0000",
   };
@@ -158,18 +163,13 @@ TEST_F(NumericLiteralTest, ValidatesIntDigitSeparators) {
 
   llvm::StringLiteral invalid[] = {
       // Decimal literals.
-      "12_34",
-      "123_4_6_789",
-      "12_3456_789",
       "12__345",
       "1_",
 
       // Hexadecimal literals.
       "0x_1234",
       "0x123_",
-      "0x12_3",
       "0x_234_5678",
-      "0x1234_567",
 
       // Binary literals.
       "0b_10101",
@@ -257,17 +257,6 @@ TEST_F(NumericLiteralTest, HandlesRealLiteralOverflow) {
 }
 
 TEST_F(NumericLiteralTest, ValidatesRealLiterals) {
-  llvm::StringLiteral invalid_digit_separators[] = {
-      // Invalid digit separators.
-      "12_34.5",     "123.4_567", "123.456_7", "1_2_3.4",
-      "123.4e56_78", "0x12_34.5", "0x12.3_4",  "0x12.34p5_6",
-  };
-  for (llvm::StringLiteral literal : invalid_digit_separators) {
-    error_tracker.Reset();
-    EXPECT_THAT(Parse(literal), HasRealValue({})) << literal;
-    EXPECT_TRUE(error_tracker.seen_error()) << literal;
-  }
-
   llvm::StringLiteral invalid[] = {
       // No digits in integer part.
       "0x.0",