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/3] 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/3] 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/3] 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()) { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
