https://github.com/nataliakokoromyti updated 
https://github.com/llvm/llvm-project/pull/177096

>From 989b9b695193cf5e48f5676edbb262acc5b4378f Mon Sep 17 00:00:00 2001
From: Natalia Kokoromyti <[email protected]>
Date: Tue, 20 Jan 2026 19:38:52 -0800
Subject: [PATCH 1/4] fix crash on u8 string

---
 clang/include/clang/Basic/DiagnosticSemaKinds.td     | 4 ++++
 clang/lib/Sema/SemaStmtAsm.cpp                       | 5 ++++-
 clang/test/Sema/asm-no-crash-non-ordinary-string.cpp | 7 +++++++
 3 files changed, 15 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/asm-no-crash-non-ordinary-string.cpp

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 44541a4c68197..935e896653fda 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -9906,6 +9906,10 @@ let CategoryName = "Inline Assembly Issue" in {
   def err_asm_operand_empty_string : Error<
      "cannot use an empty string literal in 'asm'">;
 
+  def err_asm_string_literal_not_ordinary : Error<
+     "cannot use unicode string literal in 'asm'">;
+
+
   def err_asm_pmf_through_constraint_not_permitted
     : Error<"cannot pass a pointer-to-member through register-constrained "
             "inline assembly parameter">;
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp
index f957bdf7156c7..8f39872fb5b3e 100644
--- a/clang/lib/Sema/SemaStmtAsm.cpp
+++ b/clang/lib/Sema/SemaStmtAsm.cpp
@@ -240,7 +240,10 @@ ExprResult Sema::ActOnGCCAsmStmtString(Expr *Expr, bool 
ForAsmLabel) {
     return ExprError();
 
   if (auto *SL = dyn_cast<StringLiteral>(Expr)) {
-    assert(SL->isOrdinary());
+    if (!SL->isOrdinary()) {
+      Diag(SL->getBeginLoc(), diag::err_asm_string_literal_not_ordinary);
+      return ExprError();
+    }
     if (ForAsmLabel && SL->getString().empty()) {
       Diag(Expr->getBeginLoc(), diag::err_asm_operand_empty_string)
           << SL->getSourceRange();
diff --git a/clang/test/Sema/asm-no-crash-non-ordinary-string.cpp 
b/clang/test/Sema/asm-no-crash-non-ordinary-string.cpp
new file mode 100644
index 0000000000000..42a2f30db9138
--- /dev/null
+++ b/clang/test/Sema/asm-no-crash-non-ordinary-string.cpp
@@ -0,0 +1,7 @@
+// RUN: not %clang_cc1 -fsyntax-only -verify %s
+
+void foo() {
+  asm("" ::: (u8""}));
+  // expected-error@-1 {{cannot use unicode string literal in 'asm'}}
+  // expected-error@-2 {{expected ')'}}
+}

>From a5def4857a329357999520b37efd4fd55fe9ec1c Mon Sep 17 00:00:00 2001
From: nataliakokoromyti <[email protected]>
Date: Wed, 21 Jan 2026 20:15:34 -0800
Subject: [PATCH 2/4] address feedback

---
 clang/docs/ReleaseNotes.rst                          |  1 +
 clang/include/clang/Basic/DiagnosticCommonKinds.td   |  3 +++
 clang/include/clang/Basic/DiagnosticParseKinds.td    |  2 --
 clang/include/clang/Basic/DiagnosticSemaKinds.td     |  3 ---
 clang/lib/Sema/SemaStmtAsm.cpp                       |  2 +-
 clang/test/Sema/asm-no-crash-non-ordinary-string.cpp | 11 ++++++++++-
 6 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 611e3fba2bc2b..83cdcf685a31e 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -127,6 +127,7 @@ Improvements to Coverage Mapping
 
 Bug Fixes in This Version
 -------------------------
+- Fixed a crash when using non-ordinary string literals (``u8""``, ``L""``, 
``u""``, ``U""``) in inline assembly. Clang now properly diagnoses these as 
errors. (#GH177056)
 
 Bug Fixes to Compiler Builtins
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td 
b/clang/include/clang/Basic/DiagnosticCommonKinds.td
index 6e50e225a8cc1..fd1fe4979508a 100644
--- a/clang/include/clang/Basic/DiagnosticCommonKinds.td
+++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td
@@ -305,6 +305,9 @@ def err_asm_invalid_type_in_input : Error<
 def err_asm_invalid_type : Error<
   "invalid type %0 in asm %select{input|output}1">;
 
+def err_asm_operand_wide_string_literal : Error<
+  "cannot use %select{unicode|wide}0 string literal in 'asm'">;
+
 def err_ms_asm_bitfield_unsupported : Error<
   "an inline asm block cannot have an operand which is a bit-field">;
 
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td 
b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 457d3644de35a..ecb3aa9b8ab25 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -348,8 +348,6 @@ def warn_cxx20_compat_label_end_of_compound_statement : 
Warning<
   InGroup<CXXPre23Compat>, DefaultIgnore;
 def err_address_of_label_outside_fn : Error<
   "use of address-of-label extension outside of a function body">;
-def err_asm_operand_wide_string_literal : Error<
-  "cannot use %select{unicode|wide}0 string literal in 'asm'">;
 def err_defer_ts_labeled_stmt : Error<
   "substatement of defer must not be a label">;
 
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 935e896653fda..b6d0d51e268fe 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -9906,9 +9906,6 @@ let CategoryName = "Inline Assembly Issue" in {
   def err_asm_operand_empty_string : Error<
      "cannot use an empty string literal in 'asm'">;
 
-  def err_asm_string_literal_not_ordinary : Error<
-     "cannot use unicode string literal in 'asm'">;
-
 
   def err_asm_pmf_through_constraint_not_permitted
     : Error<"cannot pass a pointer-to-member through register-constrained "
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp
index 8f39872fb5b3e..34ec64c33aab9 100644
--- a/clang/lib/Sema/SemaStmtAsm.cpp
+++ b/clang/lib/Sema/SemaStmtAsm.cpp
@@ -241,7 +241,7 @@ ExprResult Sema::ActOnGCCAsmStmtString(Expr *Expr, bool 
ForAsmLabel) {
 
   if (auto *SL = dyn_cast<StringLiteral>(Expr)) {
     if (!SL->isOrdinary()) {
-      Diag(SL->getBeginLoc(), diag::err_asm_string_literal_not_ordinary);
+      Diag(SL->getBeginLoc(), diag::err_asm_operand_wide_string_literal << 
(SL->isWide() ? 1 : 0));
       return ExprError();
     }
     if (ForAsmLabel && SL->getString().empty()) {
diff --git a/clang/test/Sema/asm-no-crash-non-ordinary-string.cpp 
b/clang/test/Sema/asm-no-crash-non-ordinary-string.cpp
index 42a2f30db9138..996464526064d 100644
--- a/clang/test/Sema/asm-no-crash-non-ordinary-string.cpp
+++ b/clang/test/Sema/asm-no-crash-non-ordinary-string.cpp
@@ -1,7 +1,16 @@
-// RUN: not %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 void foo() {
   asm("" ::: (u8""}));
   // expected-error@-1 {{cannot use unicode string literal in 'asm'}}
   // expected-error@-2 {{expected ')'}}
 }
+
+void test_other_literals() {
+  asm(L""); // expected-error {{cannot use wide string literal in 'asm'}}
+  asm(u""); // expected-error {{cannot use unicode string literal in 'asm'}}
+  asm(U""); // expected-error {{cannot use unicode string literal in 'asm'}}
+  
+  // Raw string literals should be accepted (they're still ordinary strings)
+  asm(R"(nop)");
+}

>From 6300cef442d71d885ef0d4aade5f68c17c7dfd76 Mon Sep 17 00:00:00 2001
From: nataliakokoromyti <[email protected]>
Date: Wed, 21 Jan 2026 20:26:50 -0800
Subject: [PATCH 3/4] fix format

---
 clang/lib/Sema/SemaStmtAsm.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp
index 34ec64c33aab9..f7502eb108f53 100644
--- a/clang/lib/Sema/SemaStmtAsm.cpp
+++ b/clang/lib/Sema/SemaStmtAsm.cpp
@@ -241,7 +241,8 @@ ExprResult Sema::ActOnGCCAsmStmtString(Expr *Expr, bool 
ForAsmLabel) {
 
   if (auto *SL = dyn_cast<StringLiteral>(Expr)) {
     if (!SL->isOrdinary()) {
-      Diag(SL->getBeginLoc(), diag::err_asm_operand_wide_string_literal << 
(SL->isWide() ? 1 : 0));
+      Diag(SL->getBeginLoc(), 
+           diag::err_asm_operand_wide_string_literal << (SL->isWide() ? 1 : 
0));
       return ExprError();
     }
     if (ForAsmLabel && SL->getString().empty()) {

>From b2446468c707060be9513e8e8dfc8f52e7131383 Mon Sep 17 00:00:00 2001
From: nataliakokoromyti <[email protected]>
Date: Wed, 21 Jan 2026 20:27:32 -0800
Subject: [PATCH 4/4] rm line

Co-authored-by: Mariya Podchishchaeva <[email protected]>
---
 clang/include/clang/Basic/DiagnosticSemaKinds.td | 1 -
 1 file changed, 1 deletion(-)

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index b6d0d51e268fe..44541a4c68197 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -9906,7 +9906,6 @@ let CategoryName = "Inline Assembly Issue" in {
   def err_asm_operand_empty_string : Error<
      "cannot use an empty string literal in 'asm'">;
 
-
   def err_asm_pmf_through_constraint_not_permitted
     : Error<"cannot pass a pointer-to-member through register-constrained "
             "inline assembly parameter">;

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to