Skip to content

Commit 84b0f01

Browse files
authored
[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
1 parent 30cbd09 commit 84b0f01

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

clang/lib/Sema/SemaAttr.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,6 +1310,8 @@ void Sema::AddOptnoneAttributeIfNoConflicts(FunctionDecl *FD,
13101310
}
13111311

13121312
void Sema::AddImplicitMSFunctionNoBuiltinAttr(FunctionDecl *FD) {
1313+
if (FD->isDeleted() || FD->isDefaulted())
1314+
return;
13131315
SmallVector<StringRef> V(MSFunctionNoBuiltins.begin(),
13141316
MSFunctionNoBuiltins.end());
13151317
if (!MSFunctionNoBuiltins.empty())
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// RUN: %clang_cl -fms-compatibility -Xclang -ast-dump -fsyntax-only %s | FileCheck %s
2+
3+
extern "C" __inline float __cdecl fabsf( float _X);
4+
// CHECK: FunctionDecl {{.*}} fabsf
5+
#pragma function(fabsf)
6+
__inline float __cdecl fabsf( float _X)
7+
{
8+
return 0;
9+
}
10+
// CHECK: FunctionDecl {{.*}} fabsf
11+
// CHECK: NoBuiltinAttr {{.*}} <<invalid sloc>> Implicit fabsf
12+
13+
int bar() {
14+
return 0;
15+
}
16+
// CHECK: FunctionDecl {{.*}} bar
17+
// CHECK: NoBuiltinAttr {{.*}} <<invalid sloc>> Implicit fabsf
18+
19+
struct A {
20+
int foo() = delete;
21+
// CHECK: CXXMethodDecl {{.*}} foo 'int ()' delete
22+
// CHECK-NOT: NoBuiltinAttr
23+
A() = default;
24+
// CHECK: CXXConstructorDecl {{.*}} A 'void ()' default
25+
// CHECK-NOT: NoBuiltinAttr
26+
};
27+
28+
int main() {
29+
return 0;
30+
}
31+
// CHECK: FunctionDecl {{.*}} main
32+
// CHECK: NoBuiltinAttr {{.*}} <<invalid sloc>> Implicit fabsf

0 commit comments

Comments
 (0)