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