Author: VScigolevs Date: 2024-12-13T12:24:31+01:00 New Revision: 84b0f0145887bbfe49fd4dc85490b14108a72cee
URL: https://github.com/llvm/llvm-project/commit/84b0f0145887bbfe49fd4dc85490b14108a72cee DIFF: https://github.com/llvm/llvm-project/commit/84b0f0145887bbfe49fd4dc85490b14108a72cee.diff LOG: [clang-cl] Don't add implicit NoBuiltinAttr to deleted or defaulted functions (#119719) In Clang `#pragma function` is implemented by adding an implicit NoBuiltin Attribute to all function definitions after the pragma. This (wrongly) includes also defaulted or deleted functions, which results in the error, shown in #116256. As this attribute has no effect on the deleted or defaulted functions, this commit fixes the previously mentioned issue by simply not adding the attribute in such cases. Fixes #116256 Added: clang/test/SemaCXX/msvc-pragma-function-no-builtin-attr.cpp Modified: clang/lib/Sema/SemaAttr.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp index 479f47962a7c3d..44485e71d57a01 100644 --- a/clang/lib/Sema/SemaAttr.cpp +++ b/clang/lib/Sema/SemaAttr.cpp @@ -1310,6 +1310,8 @@ void Sema::AddOptnoneAttributeIfNoConflicts(FunctionDecl *FD, } void Sema::AddImplicitMSFunctionNoBuiltinAttr(FunctionDecl *FD) { + if (FD->isDeleted() || FD->isDefaulted()) + return; SmallVector<StringRef> V(MSFunctionNoBuiltins.begin(), MSFunctionNoBuiltins.end()); if (!MSFunctionNoBuiltins.empty()) diff --git a/clang/test/SemaCXX/msvc-pragma-function-no-builtin-attr.cpp b/clang/test/SemaCXX/msvc-pragma-function-no-builtin-attr.cpp new file mode 100644 index 00000000000000..cd2ac7d1edbefb --- /dev/null +++ b/clang/test/SemaCXX/msvc-pragma-function-no-builtin-attr.cpp @@ -0,0 +1,32 @@ +// RUN: %clang_cl -fms-compatibility -Xclang -ast-dump -fsyntax-only %s | FileCheck %s + +extern "C" __inline float __cdecl fabsf( float _X); +// CHECK: FunctionDecl {{.*}} fabsf +#pragma function(fabsf) + __inline float __cdecl fabsf( float _X) +{ + return 0; +} +// CHECK: FunctionDecl {{.*}} fabsf +// CHECK: NoBuiltinAttr {{.*}} <<invalid sloc>> Implicit fabsf + +int bar() { + return 0; +} +// CHECK: FunctionDecl {{.*}} bar +// CHECK: NoBuiltinAttr {{.*}} <<invalid sloc>> Implicit fabsf + +struct A { + int foo() = delete; + // CHECK: CXXMethodDecl {{.*}} foo 'int ()' delete + // CHECK-NOT: NoBuiltinAttr + A() = default; + // CHECK: CXXConstructorDecl {{.*}} A 'void ()' default + // CHECK-NOT: NoBuiltinAttr +}; + +int main() { + return 0; +} +// CHECK: FunctionDecl {{.*}} main +// CHECK: NoBuiltinAttr {{.*}} <<invalid sloc>> Implicit fabsf _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits