[clang] ab4e4a6 - Revert "[Clang] Produce a warning instead of an error in unevaluated strings before C++26"

Corentin Jabot via cfe-commits cfe-commits at lists.llvm.org
Wed Aug 9 23:48:42 PDT 2023


Author: Corentin Jabot
Date: 2023-08-10T08:47:57+02:00
New Revision: ab4e4a69854dd348014495921a6b3648f1ee1895

URL: https://github.com/llvm/llvm-project/commit/ab4e4a69854dd348014495921a6b3648f1ee1895
DIFF: https://github.com/llvm/llvm-project/commit/ab4e4a69854dd348014495921a6b3648f1ee1895.diff

LOG: Revert "[Clang] Produce a warning instead of an error in unevaluated strings before C++26"

Causes build failure on bots after rebase.

This reverts commit 20e01167b15aa17dac09e4742909a7138eca7afc.

Added: 
    

Modified: 
    clang/include/clang/Basic/DiagnosticLexKinds.td
    clang/lib/Lex/LiteralSupport.cpp
    clang/test/CXX/dcl.dcl/dcl.link/p2.cpp
    clang/test/CXX/dcl.dcl/p4-0x.cpp
    clang/test/Sema/static-assert.c
    clang/test/SemaCXX/static-assert.cpp

Removed: 
    clang/test/FixIt/unevaluated-strings.cpp


################################################################################
diff  --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td
index 6ad691975bd587..0eb270aeea0e5d 100644
--- a/clang/include/clang/Basic/DiagnosticLexKinds.td
+++ b/clang/include/clang/Basic/DiagnosticLexKinds.td
@@ -285,10 +285,6 @@ def ext_ms_reserved_user_defined_literal : ExtWarn<
 def err_unsupported_string_concat : Error<
   "unsupported non-standard concatenation of string literals">;
 
-def warn_unevaluated_string_prefix : Warning<
-  "encoding prefix '%0' on an unevaluated string literal has no effect"
-  "%select{| and is incompatible with c++2c}1">,
-  InGroup<DiagGroup<"invalid-unevaluated-string">>;
 def err_unevaluated_string_prefix : Error<
   "an unevaluated string literal cannot have an encoding prefix">;
 def err_unevaluated_string_udl : Error<

diff  --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp
index 888ea772ee6011..21711fcfb5d08a 100644
--- a/clang/lib/Lex/LiteralSupport.cpp
+++ b/clang/lib/Lex/LiteralSupport.cpp
@@ -57,26 +57,6 @@ static unsigned getCharWidth(tok::TokenKind kind, const TargetInfo &Target) {
   }
 }
 
-static unsigned getEncodingPrefixLen(tok::TokenKind kind) {
-  switch (kind) {
-  default:
-    llvm_unreachable("Unknown token type!");
-  case tok::char_constant:
-  case tok::string_literal:
-    return 0;
-  case tok::utf8_char_constant:
-  case tok::utf8_string_literal:
-    return 2;
-  case tok::wide_char_constant:
-  case tok::wide_string_literal:
-  case tok::utf16_char_constant:
-  case tok::utf16_string_literal:
-  case tok::utf32_char_constant:
-  case tok::utf32_string_literal:
-    return 1;
-  }
-}
-
 static CharSourceRange MakeCharSourceRange(const LangOptions &Features,
                                            FullSourceLoc TokLoc,
                                            const char *TokBegin,
@@ -363,9 +343,7 @@ static unsigned ProcessCharEscape(const char *ThisTokBegin,
     Diag(Diags, Features, Loc, ThisTokBegin, EscapeBegin, ThisTokBuf,
          diag::err_unevaluated_string_invalid_escape_sequence)
         << StringRef(EscapeBegin, ThisTokBuf - EscapeBegin);
-    HadError = true;
   }
-
   return ResultChar;
 }
 
@@ -1952,22 +1930,9 @@ void StringLiteralParser::init(ArrayRef<Token> StringToks){
     // Remember if we see any wide or utf-8/16/32 strings.
     // Also check for illegal concatenations.
     if (isUnevaluated() && Tok.getKind() != tok::string_literal) {
-      if (Diags) {
-        SourceLocation PrefixEndLoc = Lexer::AdvanceToTokenCharacter(
-            Tok.getLocation(), getEncodingPrefixLen(Tok.getKind()), SM,
-            Features);
-        CharSourceRange Range =
-            CharSourceRange::getCharRange({Tok.getLocation(), PrefixEndLoc});
-        StringRef Prefix(SM.getCharacterData(Tok.getLocation()),
-                         getEncodingPrefixLen(Tok.getKind()));
-        Diags->Report(Tok.getLocation(),
-                      Features.CPlusPlus26
-                          ? diag::err_unevaluated_string_prefix
-                          : diag::warn_unevaluated_string_prefix)
-            << Prefix << Features.CPlusPlus << FixItHint::CreateRemoval(Range);
-      }
-      if (Features.CPlusPlus26)
-        hadError = true;
+      if (Diags)
+        Diags->Report(Tok.getLocation(), diag::err_unevaluated_string_prefix);
+      hadError = true;
     } else if (Tok.isNot(Kind) && Tok.isNot(tok::string_literal)) {
       if (isOrdinary()) {
         Kind = Tok.getKind();

diff  --git a/clang/test/CXX/dcl.dcl/dcl.link/p2.cpp b/clang/test/CXX/dcl.dcl/dcl.link/p2.cpp
index 234db01a001fbf..206c46f34f05b2 100644
--- a/clang/test/CXX/dcl.dcl/dcl.link/p2.cpp
+++ b/clang/test/CXX/dcl.dcl/dcl.link/p2.cpp
@@ -8,7 +8,7 @@ extern "C" {
 extern "C" plusplus {
 }
 
-extern u8"C" {}  // expected-warning {{encoding prefix 'u8' on an unevaluated string literal has no effect and is incompatible with c++2c}}
-extern L"C" {}   // expected-warning {{encoding prefix 'L' on an unevaluated string literal has no effect and is incompatible with c++2c}}
-extern u"C++" {} // expected-warning {{encoding prefix 'u' on an unevaluated string literal has no effect and is incompatible with c++2c}}
-extern U"C" {}   // expected-warning {{encoding prefix 'U' on an unevaluated string literal has no effect and is incompatible with c++2c}}
+extern u8"C" {}  // expected-error {{an unevaluated string literal cannot have an encoding prefix}}
+extern L"C" {}   // expected-error {{an unevaluated string literal cannot have an encoding prefix}}
+extern u"C++" {} // expected-error {{an unevaluated string literal cannot have an encoding prefix}}
+extern U"C" {}   // expected-error {{an unevaluated string literal cannot have an encoding prefix}}

diff  --git a/clang/test/CXX/dcl.dcl/p4-0x.cpp b/clang/test/CXX/dcl.dcl/p4-0x.cpp
index 22b10b60ecd1b1..545011822eb7d0 100644
--- a/clang/test/CXX/dcl.dcl/p4-0x.cpp
+++ b/clang/test/CXX/dcl.dcl/p4-0x.cpp
@@ -18,7 +18,7 @@ static_assert(S(false), "not so fast"); // expected-error {{not so fast}}
 static_assert(T(), "");
 static_assert(U(), ""); // expected-error {{ambiguous}}
 
-static_assert(false, L"\x14hi" // expected-warning {{encoding prefix 'L' on an unevaluated string literal has no effect and is incompatible with c++2c}} \
+static_assert(false, L"\x14hi" // expected-error {{an unevaluated string literal cannot have an encoding prefix}} \
                                // expected-error {{invalid escape sequence '\x14' in an unevaluated string literal}}
                      "!"
                      R"x(")x");

diff  --git a/clang/test/FixIt/unevaluated-strings.cpp b/clang/test/FixIt/unevaluated-strings.cpp
deleted file mode 100644
index f42e2fc5fb11d3..00000000000000
--- a/clang/test/FixIt/unevaluated-strings.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-// RUN: %clang_cc1 -verify -std=c++2c %s
-// RUN: cp %s %t
-// RUN: not %clang_cc1 -x c++ -std=c++2c -fixit %t
-// RUN: %clang_cc1 -x c++ -std=c++2c %t
-// RUN: not %clang_cc1 -std=c++2c -x c++ -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
-
-static_assert(true, L""); // expected-error{{an unevaluated string literal cannot have an encoding prefix}}
-// CHECK: fix-it:{{.*}}:{7:21-7:22}
-
-static_assert(true, u8""); // expected-error{{an unevaluated string literal cannot have an encoding prefix}}
-// CHECK: fix-it:{{.*}}:{10:21-10:23}
-
-static_assert(true, u""); // expected-error{{an unevaluated string literal cannot have an encoding prefix}}
-// CHECK: fix-it:{{.*}}:{13:21-13:22}
-
-static_assert(true, U""); // expected-error{{an unevaluated string literal cannot have an encoding prefix}}
-// CHECK: fix-it:{{.*}}:{16:21-16:22}

diff  --git a/clang/test/Sema/static-assert.c b/clang/test/Sema/static-assert.c
index 4e9e6b7ee558bd..6ede89dc006907 100644
--- a/clang/test/Sema/static-assert.c
+++ b/clang/test/Sema/static-assert.c
@@ -94,20 +94,3 @@ _Static_assert(__builtin_strlen("1"), "");  // ext-warning {{'_Static_assert' is
 // __builtin_strlen(literal) is considered an integer constant expression
 // and doesn't cause a pedantic warning
 #endif
-
-
-_Static_assert(0, L"\xFFFFFFFF"); // expected-warning {{encoding prefix 'L' on an unevaluated string literal has no effect}} \
-                                  // expected-error {{invalid escape sequence '\xFFFFFFFF' in an unevaluated string literal}} \
-                                  // expected-error {{hex escape sequence out of range}} \
-                                  // ext-warning {{'_Static_assert' is a C11 extension}}
-_Static_assert(0, L"\u1234"); // expected-warning {{encoding prefix 'L' on an unevaluated string literal has no effect}} \
-                              // expected-error {{static assertion failed: ሴ}} \
-                              // ext-warning {{'_Static_assert' is a C11 extension}}
-
-_Static_assert(0, L"\x1ff"      // expected-warning {{encoding prefix 'L' on an unevaluated string literal has no effect}} \
-                                // expected-error {{hex escape sequence out of range}} \
-                                // expected-error {{invalid escape sequence '\x1ff' in an unevaluated string literal}} \
-                                // ext-warning {{'_Static_assert' is a C11 extension}}
-                   "0\x123"     // expected-error {{invalid escape sequence '\x123' in an unevaluated string literal}}
-                   "fx\xfffff"  // expected-error {{invalid escape sequence '\xfffff' in an unevaluated string literal}}
-                   "goop");

diff  --git a/clang/test/SemaCXX/static-assert.cpp b/clang/test/SemaCXX/static-assert.cpp
index 5d64ff682a20e5..da8b726a3e4b07 100644
--- a/clang/test/SemaCXX/static-assert.cpp
+++ b/clang/test/SemaCXX/static-assert.cpp
@@ -29,19 +29,13 @@ template<typename T> struct S {
 S<char> s1; // expected-note {{in instantiation of template class 'S<char>' requested here}}
 S<int> s2;
 
-static_assert(false, L"\xFFFFFFFF"); // expected-warning {{encoding prefix 'L' on an unevaluated string literal has no effect and is incompatible with c++2c}} \
-                                     // expected-error {{invalid escape sequence '\xFFFFFFFF' in an unevaluated string literal}} \
-                                     // expected-error {{hex escape sequence out of range}}
-static_assert(false, u"\U000317FF"); // expected-warning {{encoding prefix 'u' on an unevaluated string literal has no effect and is incompatible with c++2c}} \
-                                     // expected-error {{static assertion failed}}
-
-static_assert(false, u8"Ω");     // expected-warning {{encoding prefix 'u8' on an unevaluated string literal has no effect and is incompatible with c++2c}} \
-                                 // expected-error {{static assertion failed: Ω}}
-static_assert(false, L"\u1234"); // expected-warning {{encoding prefix 'L' on an unevaluated string literal has no effect and is incompatible with c++2c}} \
-                                 // expected-error {{static assertion failed: ሴ}}
-
-static_assert(false, L"\x1ff"    // expected-warning {{encoding prefix 'L' on an unevaluated string literal has no effect and is incompatible with c++2c}} \
-                                 // expected-error {{hex escape sequence out of range}} \
+static_assert(false, L"\xFFFFFFFF"); // expected-error {{an unevaluated string literal cannot have an encoding prefix}} \
+                                     // expected-error {{invalid escape sequence '\xFFFFFFFF' in an unevaluated string literal}}
+static_assert(false, u"\U000317FF"); // expected-error {{an unevaluated string literal cannot have an encoding prefix}}
+// FIXME: render this as u8"\u03A9"
+static_assert(false, u8"Ω");     // expected-error {{an unevaluated string literal cannot have an encoding prefix}}
+static_assert(false, L"\u1234"); // expected-error {{an unevaluated string literal cannot have an encoding prefix}}
+static_assert(false, L"\x1ff"    // expected-error {{an unevaluated string literal cannot have an encoding prefix}} \
                                  // expected-error {{invalid escape sequence '\x1ff' in an unevaluated string literal}}
                      "0\x123"    // expected-error {{invalid escape sequence '\x123' in an unevaluated string literal}}
                      "fx\xfffff" // expected-error {{invalid escape sequence '\xfffff' in an unevaluated string literal}}


        


More information about the cfe-commits mailing list