[PATCH] D156597: [Clang] Handle static_assert messages with an expression started by a literal
Corentin Jabot via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Jul 29 07:07:40 PDT 2023
cor3ntin created this revision.
Herald added a project: All.
cor3ntin requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D156597
Files:
clang/lib/Parse/ParseDeclCXX.cpp
clang/test/SemaCXX/static-assert-cxx26.cpp
Index: clang/test/SemaCXX/static-assert-cxx26.cpp
===================================================================
--- clang/test/SemaCXX/static-assert-cxx26.cpp
+++ clang/test/SemaCXX/static-assert-cxx26.cpp
@@ -65,6 +65,10 @@
}
};
+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 @@
};
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}}
Index: clang/lib/Parse/ParseDeclCXX.cpp
===================================================================
--- clang/lib/Parse/ParseDeclCXX.cpp
+++ clang/lib/Parse/ParseDeclCXX.cpp
@@ -1016,10 +1016,23 @@
return nullptr;
}
- if (isTokenStringLiteral())
- AssertMessage = ParseUnevaluatedStringLiteralExpression();
- else if (getLangOpts().CPlusPlus26)
+ bool ParseAsExression = 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)) {
+ ParseAsExression = true;
+ break;
+ }
+ }
+ }
+
+ if(ParseAsExression)
AssertMessage = ParseConstantExpressionInExprEvalContext();
+ else if (isTokenStringLiteral())
+ AssertMessage = ParseUnevaluatedStringLiteralExpression();
else {
Diag(Tok, diag::err_expected_string_literal)
<< /*Source='static_assert'*/ 1;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D156597.545369.patch
Type: text/x-patch
Size: 2467 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230729/cdd8ae82/attachment-0001.bin>
More information about the cfe-commits
mailing list