diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index e281f2d8874a7..5d6bb72a208a1 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -3538,7 +3538,11 @@ bool FunctionDecl::isTargetMultiVersion() const { } bool FunctionDecl::isTargetMultiVersionDefault() const { - return isMultiVersion() && hasAttr() && + if (!isMultiVersion()) + return false; + if (hasAttr()) + return getAttr()->isDefaultVersion(); + return hasAttr() && getAttr()->isDefaultVersion(); } diff --git a/clang/test/SemaCXX/attr-target-mv-warn-unused.cpp b/clang/test/SemaCXX/attr-target-mv-warn-unused.cpp new file mode 100644 index 0000000000000..1901589ef732f --- /dev/null +++ b/clang/test/SemaCXX/attr-target-mv-warn-unused.cpp @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -verify -Wunused %s + +__attribute__((target("sse3"))) +static int not_used_fmv() { return 1; } +__attribute__((target("avx2"))) +static int not_used_fmv() { return 2; } +__attribute__((target("default"))) +static int not_used_fmv() { return 0; } // expected-warning {{unused function 'not_used_fmv'}} + +__attribute__((target("sse3"))) +static int definitely_used_fmv() { return 1; } +__attribute__((target("avx2"))) +static int definitely_used_fmv() { return 2; } +__attribute__((target("default"))) +static int definitely_used_fmv() { return 0; } +int definite_user() { return definitely_used_fmv(); }