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

Reply via email to