[clang] [clang] Add support for `[[msvc::forceinline]]` (PR #185282)

Trung Nguyen via cfe-commits cfe-commits at lists.llvm.org
Sun Mar 8 07:29:43 PDT 2026


https://github.com/trungnt2910 created https://github.com/llvm/llvm-project/pull/185282

This is equivalent to Microsoft's `__forceinline` when placed before a function declaration.
Unlike __forceinline, `[[msvc::forceinline]]` works with lambdas.

This is implemented as an alias of `[[clang::always_inline]]`.

>From 2f0dcf1281b186f9b27dd720402c99be11b90e1e Mon Sep 17 00:00:00 2001
From: Trung Nguyen <trungnt282910 at gmail.com>
Date: Mon, 9 Mar 2026 01:28:03 +1100
Subject: [PATCH] [clang] Add support for `[[msvc::forceinline]]`

This is equivalent to Microsoft's `__forceinline` when placed before
a function declaration.
Unlike __forceinline, `[[msvc::forceinline]]` works with lambdas.

This is implemented as an alias of `[[clang::always_inline]]`.
---
 clang/include/clang/Basic/Attr.td          |  3 ++-
 clang/test/CodeGen/attr-ms-forceinline.cpp | 16 ++++++++++++++++
 clang/test/Sema/attr-ms-forceinline.cpp    |  9 +++++++++
 3 files changed, 27 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/CodeGen/attr-ms-forceinline.cpp
 create mode 100644 clang/test/Sema/attr-ms-forceinline.cpp

diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td
index befd671393c7c..446a5abc250e8 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -927,7 +927,8 @@ def AlignNatural : InheritableAttr {
 
 def AlwaysInline : DeclOrStmtAttr {
   let Spellings = [GCC<"always_inline">, CXX11<"clang", "always_inline">,
-                   C23<"clang", "always_inline">, CustomKeyword<"__forceinline">];
+                   C23<"clang", "always_inline">, CustomKeyword<"__forceinline">,
+                   CXX11<"msvc", "forceinline">, C23<"msvc", "forceinline">];
   let Accessors = [Accessor<"isClangAlwaysInline", [CXX11<"clang", "always_inline">,
                                                     C23<"clang", "always_inline">]>];
   let Subjects = SubjectList<[Function, Stmt], WarnDiag,
diff --git a/clang/test/CodeGen/attr-ms-forceinline.cpp b/clang/test/CodeGen/attr-ms-forceinline.cpp
new file mode 100644
index 0000000000000..240e58b8a8e52
--- /dev/null
+++ b/clang/test/CodeGen/attr-ms-forceinline.cpp
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -std=c++23 -emit-llvm %s -triple x86_64-pc-windows-msvc -o - | FileCheck %s
+
+[[msvc::forceinline]] void func() {}
+
+void call_func() {
+// CHECK-LABEL: @"?call_func@@YAXXZ"()
+// CHECK-NOT: call void @"?func@@YAXXZ"()
+  func();
+}
+
+void call_lambda() {
+// CHECK-LABEL: @"?call_lambda@@YAXXZ"()
+// CHECK-NOT: call void @"??R<lambda_
+  auto lambda = [] [[msvc::forceinline]] () {};
+  lambda();
+}
diff --git a/clang/test/Sema/attr-ms-forceinline.cpp b/clang/test/Sema/attr-ms-forceinline.cpp
new file mode 100644
index 0000000000000..6e5ac191ce8d1
--- /dev/null
+++ b/clang/test/Sema/attr-ms-forceinline.cpp
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -std=c++23 -triple x86_64-windows %s
+// expected-no-diagnostics
+
+[[msvc::forceinline]] void func(void) {}
+
+void lambda() {
+  auto l = [] [[msvc::forceinline]] () {};
+  l();
+}



More information about the cfe-commits mailing list