llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: None (nataliakokoromyti)

<details>
<summary>Changes</summary>

This input `asm("" ::: (u8""}))` made clang reach `ActOnGCCAsmStmtString` with 
a `u8""` string literal.
That function had an `assert` that assumed the asm string is a plain `""`, so 
it aborted instead of just throwing an error.

fixes #<!-- -->177056


---
Full diff: https://github.com/llvm/llvm-project/pull/177096.diff


3 Files Affected:

- (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+4) 
- (modified) clang/lib/Sema/SemaStmtAsm.cpp (+4-1) 
- (added) clang/test/Sema/asm-no-crash-non-ordinary-string.cpp (+7) 


``````````diff
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 ')'}}
+}

``````````

</details>


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

Reply via email to