Author: Corentin Jabot
Date: 2023-08-01T10:16:02+02:00
New Revision: 4d494e76d098fde0a3399f792f360c111e546ae8

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

LOG: [Clang] Handle static_assert messages with an expression started by a 
literal

Reviewed By: aaron.ballman

Differential Revision: https://reviews.llvm.org/D156597

Added: 
    

Modified: 
    clang/lib/Parse/ParseDeclCXX.cpp
    clang/test/SemaCXX/static-assert-cxx26.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Parse/ParseDeclCXX.cpp 
b/clang/lib/Parse/ParseDeclCXX.cpp
index c1e09db2b3eeff..e4a10f2e5c98d0 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -1016,10 +1016,23 @@ Decl 
*Parser::ParseStaticAssertDeclaration(SourceLocation &DeclEnd) {
       return nullptr;
     }
 
-    if (isTokenStringLiteral())
-      AssertMessage = ParseUnevaluatedStringLiteralExpression();
-    else if (getLangOpts().CPlusPlus26)
+    bool ParseAsExpression = false;
+    if (getLangOpts().CPlusPlus26) {
+      for (unsigned I = 0;; ++I) {
+        const Token &T = GetLookAheadToken(I);
+        if (T.is(tok::r_paren))
+          break;
+        if (T.isNot(tok::string_literal)) {
+          ParseAsExpression = true;
+          break;
+        }
+      }
+    }
+
+    if (ParseAsExpression)
       AssertMessage = ParseConstantExpressionInExprEvalContext();
+    else if (isTokenStringLiteral())
+      AssertMessage = ParseUnevaluatedStringLiteralExpression();
     else {
       Diag(Tok, diag::err_expected_string_literal)
           << /*Source='static_assert'*/ 1;

diff  --git a/clang/test/SemaCXX/static-assert-cxx26.cpp 
b/clang/test/SemaCXX/static-assert-cxx26.cpp
index 4c28fba1ca5fc3..c2bb2d2ebc6ffb 100644
--- a/clang/test/SemaCXX/static-assert-cxx26.cpp
+++ b/clang/test/SemaCXX/static-assert-cxx26.cpp
@@ -65,6 +65,10 @@ struct string_view {
     }
 };
 
+constexpr string_view operator+(auto, string_view S) {
+    return S;
+}
+
 constexpr const char g_[] = "long string";
 
 template <typename T, int S>
@@ -79,6 +83,11 @@ struct array {
 };
 
 static_assert(false, string_view("test")); // expected-error {{static 
assertion failed: test}}
+static_assert(false, "Literal" + string_view("test")); // expected-error 
{{static assertion failed: test}}
+static_assert(false, L"Wide Literal" + string_view("test")); // expected-error 
{{static assertion failed: test}}
+static_assert(false, "Wild" "Literal" "Concatenation" + string_view("test")); 
// expected-error {{static assertion failed: test}}
+static_assert(false, "Wild" "Literal" L"Concatenation" + string_view("test")); 
// expected-error {{static assertion failed: test}}
+static_assert(false, "Wild" u"Literal" L"Concatenation" + 
string_view("test")); // expected-error {{unsupported non-standard 
concatenation of string literals}}
 static_assert(false, string_view("😀")); // expected-error {{static assertion 
failed: 😀}}
 static_assert(false, string_view(0, nullptr)); // expected-error {{static 
assertion failed:}}
 static_assert(false, string_view(1, "ABC")); // expected-error {{static 
assertion failed: A}}


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to