Skip to content

Commit 67295eb

Browse files
ilinpvjroelofs
authored andcommitted
[AArch64] Fix FMV crash on unspecified number of parameters function (llvm#65671)
Fix Function Multi Versioning crash reported in llvm#65669
1 parent 1790868 commit 67295eb

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

clang/lib/Sema/SemaDecl.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11627,20 +11627,22 @@ static bool CheckMultiVersionFunction(Sema &S, FunctionDecl *NewFD,
1162711627
FunctionDecl *OldFD = OldDecl->getAsFunction();
1162811628

1162911629
if (!OldFD->isMultiVersion() && MVKind == MultiVersionKind::None) {
11630-
// No target_version attributes mean default
11631-
if (!NewTVA) {
11632-
const auto *OldTVA = OldFD->getAttr<TargetVersionAttr>();
11633-
if (OldTVA) {
11634-
NewFD->addAttr(TargetVersionAttr::CreateImplicit(
11635-
S.Context, "default", NewFD->getSourceRange()));
11636-
NewFD->setIsMultiVersion();
11637-
OldFD->setIsMultiVersion();
11638-
OldDecl = OldFD;
11639-
Redeclaration = true;
11640-
return true;
11641-
}
11630+
if (NewTVA || !OldFD->getAttr<TargetVersionAttr>())
11631+
return false;
11632+
if (!NewFD->getType()->getAs<FunctionProtoType>()) {
11633+
// Multiversion declaration doesn't have prototype.
11634+
S.Diag(NewFD->getLocation(), diag::err_multiversion_noproto);
11635+
NewFD->setInvalidDecl();
11636+
} else {
11637+
// No "target_version" attribute is equivalent to "default" attribute.
11638+
NewFD->addAttr(TargetVersionAttr::CreateImplicit(
11639+
S.Context, "default", NewFD->getSourceRange()));
11640+
NewFD->setIsMultiVersion();
11641+
OldFD->setIsMultiVersion();
11642+
OldDecl = OldFD;
11643+
Redeclaration = true;
1164211644
}
11643-
return false;
11645+
return true;
1164411646
}
1164511647

1164611648
// Multiversioned redeclarations aren't allowed to omit the attribute, except

clang/test/Sema/attr-target-version.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,8 @@ float __attribute__((target_version("rdm"))) rtype(int);
8989
int __attribute__((target_version("sha2"))) combine(void) { return 1; }
9090
// expected-error@+1 {{multiversioned function declaration has a different calling convention}}
9191
int __attribute__((aarch64_vector_pcs, target_version("sha3"))) combine(void) { return 2; }
92+
93+
int __attribute__((target_version("fp+aes+pmull+rcpc"))) unspec_args() { return -1; }
94+
// expected-error@+1 {{multiversioned function must have a prototype}}
95+
int __attribute__((target_version("default"))) unspec_args() { return 0; }
96+
int cargs() { return unspec_args(); }

0 commit comments

Comments
 (0)